- 浏览: 76801 次
- 性别:
- 来自: 北京
最新评论
-
wteqiao:
[color=orange][/color]
annotation(@Retention) -
hanwesley:
谢谢,我在你的基础之上学习的。感觉还不错。
我理解的lucene原理(初级) -
DepthJava:
一直没找到,能完全解析EMial的方法。包括MIME解析
乱 ...
MIME协议分析(转) -
hardPass:
能看看你的mvc-config.xml 啊?
自制MVC框架:TonyMVC -
geek87:
非常好的资料..支持一下
spring2.5 注解技术
1 异常链
当不需要用户来处理和关心原始的异常时,常见的做法是捕获原始的异常,把他们包装成一个新的不同类型的异常,然后再抛出异常。
所谓异常链就是把原始异常包装成新的异常类时,在新的异常类中封装了原始异常类
2 多样化异常
在实际应用中,有时需要一个方法同时抛出多个异常。
如果应用不支持在一个方法中抛出多个异常,用户每次将只能看到针对一个字段域的验证错误,当改正了一个错误后,重新提交表单,又会收到针对另一个字段域的验证错误,这会使得用户体验非常多差劲。
有效的做法是每次当用户提交表单后,都验证所有的字段,然后向用户显示所有的验证信息。不幸的是,在java中一次只能抛出一个异常。因此需要开发者自行设计支持多样化异常的异常类。
3 struts异常分析
在struts的控制层中,将java的异常类包装成ActionMessage。在struts中定义异常有两种方式:
扩展ModuleException和创建自定义的异常类体系。
扩展ModuleException :
优点,可以很好的和sturts的Resouce Bundle绑定。
ModuleException(String key)和ModuleException(String key,Object[] values)
key为错误消息key,values为对象数组类型的values参数。
自定义异常类:
如:
import java.io.PrintStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; public class BaseException extends Exception { protected Throwable rootCause = null; private List exception = new ArrayList<Throwable>(); private String messageKey = null; private Object[] messageArgs = null; public Throwable getRootCause() { return rootCause; } public void setRootCause(Throwable rootCause) { this.rootCause = rootCause; } public List getException() { return exception; } public void addException(Throwable exception) { this.exception.add(exception); } public String getMessageKey() { return messageKey; } public void setMessageKey(String messageKey) { this.messageKey = messageKey; } public Object[] getMessageArgs() { return messageArgs; } public void setMessageArgs(Object[] messageArgs) { this.messageArgs = messageArgs; } @Override public void printStackTrace() { printStackTrace(System.err); } @Override public void printStackTrace(PrintStream s) { printStackTrace(new PrintWriter(s)); } @Override public void printStackTrace(PrintWriter s) { super.printStackTrace(s); if(getRootCause() != null){ getRootCause().printStackTrace(s); } s.flush(); } }
因为有了rootCause exceptions messageKey 和messageArgs 这四个属性使得这个自定义异常类有了以下功能:
支持异常的级联,rootCause属性制定原始异常(异常链)
支持多样化异常,exceptions属性存放所有嵌套的异常
支持和struts的Resouce Bundle的绑定,messageKey属性指定消息key
支持复合式消息,messageArgs属性指定复合式消息中的参数。
处理异常的方法 :
NO。1
自己手动编写。
个人抛出异常方法:
if(满足一定条件){
throw new RuntionException(“错误提示信息”);
}
由自己try {}catch(){}进行捕获然后,用mapping.forwoard(“”)跳转到处理页面中来。
xxAction.java
public ActionForward delete(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
String id = request.getParameter("id");
try {
getOrgnizationService().delete(id);
} catch (RuntimeException e) {
/**
* 返回一个错误信息。
*/
ActionMessages mesgs = new ActionMessages();
ActionMessage mesg = new ActionMessage("error.detail",e.getMessage());//error.detail为资源文件,e.getMessage()为得到的错误信息。他所处的地方为error.detail的参数所在地。
mesgs.add("error",mesg);
this.saveErrors(request, mesgs); //错误信息存入到页面中去。
return mapping.findForward("exception");
}
return mapping.findForward("OK");
}
struts-config.xml文件:
<action-mappings >
<action
attribute="orgnizationForm"
name="orgnizationForm"
parameter="method"
path="/orgnization"
scope="request"
type="org.springframework.web.struts.DelegatingActionProxy"
validate="false">
<forward name="exception" path="/error.jsp"></forward>
<forward name="OK" path="/main/orgnization.jsp" />
</action>
</action-mappings>
在页面调用这个时应该用<html:errors>即可把资源文件里面的错误信息显示出来。
NO。2
在项目中通常需要统一的错误处理。将异常throws出去,交给sturts来处理。
有两个缺点 :
不能处理带参数的异常!去给资源文件的参数赋值;
异常的类型在配置文件中是固定的,不能动态改变。
struts可以有两种方法对异常进行处理。
一种 是在struts配置文件里面的action下面(局部异常处理 ),用exception来处理
<action-mappings >
<action
attribute="orgnizationForm"
name="orgnizationForm"
parameter="method"
path="/orgnization"
scope="request"
type="org.springframework.web.struts.DelegatingActionProxy">
<exception key="error.detail" type="java.lang.RuntimeException
" scope="request" path="/error.jsp"></exception>
<forward name="OK" path="/main/orgnization.jsp" />
</action>
</action-mappings>
另一种 方法是在struts的配置文件中的global-exception为全局的异常 :
<global-exceptions> <exception key="error.detail" type="java.lang.RuntimeException" scope="request" path="/error.jsp"></exception> </global-exceptions>
NO。3 (推荐)
使用自定义的异常类来继承原始的异常。用自定义的异常类来处理整个工程的异常。在一个异常类中使用多种异常。用一个异常类来代表不同的异常消息。
首先,定义自己的异常类:他要继承RuntimeException
package edu.hust.util;
import java.io.PrintStream;
import java.io.PrintWriter;
public class SystemException extends RuntimeException {
private String key;
private Object[] values;
public String getKey(){
return key;
}
public Object[] getValues(){
return values;
}
public SystemException() {
super();
}
public SystemException(String message, Throwable cause) {
super(message, cause);
}
public SystemException(String message) {
super(message);
}
public SystemException(Throwable cause) {
super(cause);
}
public SystemException(String message,String key){
super(message);
this.key = key;
}
public SystemException(String message,String key,Object values){
super(message);
this.key = key;
this.values = new Object[]{values};
}
public SystemException(String message,String key,Object[] values){
super(message);
this.key = key;
this.values = values;
}
}
在抛出异常的地方:
public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { String id = request.getParameter("id"); try { getOrgnizationService().delete(id); } catch (RuntimeException e) { throw new SystemException("有子机构,不能删除!","error.detail2");//去对应上面的构造函数,知道error.detail2为key。 } return mapping.findForward("OK"); }
在配置文件中:
<global-exceptions>
<exception
key="error.detail"
type="edu.hust.SystemException"
scope="request"
path="/error.jsp"
handler="edu.hust.util.SystemExceptionHandler">
</exception>
</global-exceptions>
异常处理类:
package edu.hust.util;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ExceptionHandler;
import org.apache.struts.config.ExceptionConfig;
/**
* 统一异常处理类,继承的是org.apache.struts.action下的ExceptionHandler。
* 实现execute方法即可
。
* @author sunqitang
*
*/
public class SystemExceptionHandler extends ExceptionHandler {
@Override
public ActionForward execute(Exception ex, ExceptionConfig ae,
ActionMapping mapping, ActionForm formInstance,
HttpServletRequest request, HttpServletResponse response)
throws ServletException {
ActionForward forward = null;
if( null != ae.getPath()){
forward = new ActionForward(ae.getPath());//获得默认的path
}else{
forward = mapping.getInputForward();
}
if(ex instanceof SystemException){
ActionMessage error = null;
SystemException sysExce = (SystemException) ex;
String key = sysExce.getKey(); //获得key
if( null == key){ //如果可以为空
error = new ActionMessage(ae.getKey(),sysExce.getMessage());
}else{
if(null != sysExce.getValues()){ // 可以不为空,且有参数
error = new ActionMessage(key,sysExce.getValues());
}else{
error = new ActionMessage(key);
}
}
this.storeException(request, key, error, forward, ae.getScope());
return forward;
}
return super.execute(ex, ae, mapping, formInstance, request, response); //异常不属于自定义异常类
}
}
发表评论
-
自制MVC框架:TonyMVC
2009-08-19 11:39 1671MVC框架已经使用的非常广泛了,现在我也自制一个MVC框架来加 ... -
spring MVC
2009-08-14 20:15 1155第一步:在web.xml文件中加入<listener&g ... -
hibernate中hbm详解
2009-03-31 17:32 12251. 主键( id ) Hibernate的 ... -
spring2.5 注解技术
2009-03-30 17:58 4459注释配置和 XML 配置的适用场合 是否有了这些 IOC ... -
jpa的了解
2009-03-29 19:44 11451 jpa对hibernate编程所需要引入的包: h ... -
hbm2dll的使用
2009-03-29 13:04 1272在开发过程中,我们可以先设计数据库,然后由MyEclipse自 ... -
spirng aop(非注释方式)
2009-03-04 18:40 949在某些时候,我们工程中使用的JDK 不一定就是1.5 以 ... -
dao时测试getHiberanteTemple()为null
2009-02-14 18:56 737在对写的一个DAO进行junit测试时,发现getHibera ... -
spring中读取applicationgContext.xml
2009-02-14 18:35 1042当我把spring的配置文件转移到WEB-INF目录下以后,再 ... -
Xdoclet 介绍
2009-02-11 16:25 1478Xdoclet 基本概念 我们可以在 java 代码中使用类 ... -
org.apache.commons.dbcp.BasicDataSource找不到?
2009-02-10 16:04 3148在spring的配置文件中org.apache.commons ... -
ssh整合开发
2009-02-06 11:05 13031 加入j2ee的jar包。放入lib中来 (注意,最好把ja ... -
createProxy(AbstractEntityTuplizer.java:372)异常的解决方
2009-02-06 11:00 755http://hi.baidu.com/ligong_haer ... -
Spring控制的Hibernate中代理异常
2008-12-27 19:06 860阅读全文 类别:默认分类?查看评论 -
Struts2.0学习笔记
2009-01-19 14:48 673阅读全文 类别:默认分类?查看评论 -
struts2.0学习笔记2
2009-01-20 16:36 646阅读全文 类别:默认分类?查看评论
相关推荐
Struts是Apache软件基金会(ASF)赞助的一个开源项目,它是...同时,结合`源码`和`工具`这两个标签,我们可以进一步研究Struts框架的内部工作原理,以及利用各种工具(如IDE、调试器等)来辅助分析和调试异常处理代码。
在Struts1中,异常处理是至关重要的一个环节,它确保了在遇到错误或异常时,应用能够优雅地进行恢复,提供用户友好的反馈,而不是直接崩溃。 在Struts1中,异常处理主要通过以下几种方式实现: 1. **全局异常处理*...
### Struts 常见异常及处理 #### 1. javax.servlet.ServletException: Must specify type attribute if name is specified - **异常描述**:当在 JSP 页面中使用自定义标签时,如果标签中定义了 `name` 属性,则...
4. **Interceptor配置**:根据需求添加Struts 2特有的拦截器,以实现Struts 1中类似的功能,如Session管理、异常处理等。 5. **配置合并**:合并Struts 1和Struts 2的配置文件,确保请求能正确路由到相应的Action。...
下面我们将深入探讨Struts 1的源码分析,特别是针对Struts 1.2版本。 1. **架构概述** - **DispatcherServlet**:作为Struts的核心,DispatcherServlet负责接收HTTP请求并分发到相应的Action。 - **ActionMapping...
`org.apache.struts2.interceptor`包定义了内置的拦截器,例如身份验证、异常处理等,开发者可以根据需要自定义拦截器。 最后,`org.apache.struts2.util`和`org.apache.struts2.validators`包提供了实用工具类和...
要确保Interceptor的异常处理得当,或者配置全局异常处理。 3. 动态方法访问:Struts2支持动态方法调用,但如果不正确配置,可能导致找不到方法的错误。检查Action类的方法命名和配置文件中的配置是否匹配。 4. ...
8. **异常处理(Exception Handling)**:Struts1提供了全局异常处理机制,当Action执行过程中抛出异常时,可以统一捕获并显示错误页面。 学习和分析这个小项目,可以帮助我们深入理解Struts1的工作原理,以及如何...
然而,Struts1的配置文件较多,且对异常处理和国际化支持相对较弱。 Struts2在Struts1的基础上进行了许多改进,引入了拦截器(Interceptor)的概念,使得处理流程更加灵活。Struts2的配置通常更为简洁,可以通过...
通过分析和学习这些代码,你可以更好地理解和掌握Struts1中多文件上传和表单中传递List的实践方法。 总之,这个实例提供了关于Struts1中文件上传和复杂表单数据处理的实战经验,对于学习Java Web开发和Struts1框架...
- **Struts1.x** 异常处理需要在配置文件中指定错误页面,处理相对复杂。 - **Struts2.x** 提供了全局异常处理机制,通过拦截器链处理异常,更易管理和扩展。 6. **国际化与本地化**: - **Struts1.x** 需要在...
在Struts2中,异常处理机制是关键组成部分,确保程序在遇到错误时能够优雅地处理并提供反馈给用户。本文将深入探讨Struts2的异常处理机制,特别是声明式异常捕捉和异常映射。 首先,Struts2的异常处理机制允许...
下面将详细解析文件上传的实现过程,包括关键类的使用、文件处理逻辑以及异常处理等方面。 #### Struts1框架简介 Struts1是Apache Struts的一个版本,它是一个用于构建基于Java的Web应用程序的开源框架。Struts1...
5. **错误和异常处理**:虽然这个例子可能没有包含,但了解如何处理登录失败或其他异常情况也是很重要的。 通过这个简单的项目,初学者可以逐步掌握Struts1框架的基本使用,为后续的复杂应用开发打下基础。同时,这...
标签中的"源码"提示我们,这篇博客可能涉及到了Struts1的内部实现,包括其异常处理机制的源代码分析。理解源码可以帮助开发者更好地了解框架的工作原理,从而更有效地解决异常问题。 "工具"标签则暗示博主可能介绍...
Struts1提供了一套全局的异常处理机制,允许开发者定义特定的错误页面来处理程序运行时抛出的异常。这样可以提供友好的用户体验,并且简化错误处理代码。 以上是对这个基于Struts1的客户管理系统的简要分析,涉及...
1. **CVE-2017-5638**:这是Struts2最臭名昭著的一个漏洞,被称为"Struts Shatter",它允许攻击者通过HTTP头中的Content-Type字段注入恶意OGNL表达式,导致远程代码执行。 2. **漏洞原理**:Struts2框架在处理动态...
7. **Struts2的异常处理**:通过全局异常映射(Global Exception Mapping)和Action级别的异常映射,可以统一处理应用程序中的异常,提供友好的错误提示。 8. **Struts2的国际化(Internationalization, i18n)**:...
文章“Comparing the Struts 1 and Struts 2 Web Application Frameworks”可能详细分析了这两个框架的各个方面,包括但不限于配置方式、开发效率、错误处理、性能测试等。通过阅读文档,开发者可以获取更多实用的...
Struts2还提供了一些内置的拦截器,如params(处理请求参数)、i18n(国际化支持)、exception(异常处理)等。这些拦截器极大地丰富了框架的功能,减少了开发者的工作量。 总的来说,Struts2的拦截器机制是其强大...