struts中的异常应用实践
2013-01-10 17:20
253 查看
struts的异常处理机制带我们很大的方便。通过思考和自己作例子,觉得以下这种方式较为灵活:
首先为你的应用程序定制一套异常类。例如,先定义一个基类(可以是虚类),注意,在此它扩展自RuntimeException,这是为了在struts的action中顺利捕获到。
下来你可以定义几个子类,例如:Dao异常,事务处理异常,service异常等。在spring中,包
org.springframework.dao下定义了一套Dao异常,值得大家学习一下。
接着,在struts-cofig.xml文件中定义全局异常如下,此处的key属性我已经不准备用了:
下面看一下我的处理异常的类:
public ActionForward execute(
Exception exception,
ExceptionConfig config,
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
request.setAttribute("exception", exception);
//返回原始请求的Forward,当然你也可以定义一个全局异常Forword,都转向它
return mapping.getInputForward();
}
}
在页面上(此页面我们设置为请求action,即发生异常的action的input属性),我们显示错误信息时可以使用struts标签如下,注意,这里显示的信息和资源属性文件无关,是你自己抛出的:
<logic:present name="exception">
<bean:write name="exception"/>
</logic:present>
这样作的好处在哪里呢?我们来看一下,一般我们的思路是,发生了逻辑错误,比如说,用户名输重复,或者准备修改的数据已被他人删除等,我们要捕获它并显示给用户,第一感是在action中作的,例如:
设计良好的action应该仅仅是web层的一个“路标指引器”,真正的逻辑方法是调用其他的业务bean来完成的,简单地说,通常认为action中的代码越少越好.如果采用了上面那种全局异常处理机制,action此时就可以不用管逻辑异常了,由业务bean负责抛出就可以了,大家就可以少写一些action中的try catch 语块了,也可以绕开ActionError,思路上是不是更清晰?异常在真正发生的类中被抛出,然后向上传递,一直传到action中,struts负责捕获之,当然这里的异常你必须已经定义过了。
注:
1. 如果你不想写 MyExceptionHandler 类,当然struts-config.xml中的handler=属性也要去掉,还有一种办法可以显示错误信息在 jsp页上,先引用jstl标签库,然后如下:
<c:out value="${requestScope['org.apache.struts.action.EXCEPTION'].message}"/>
2.如果觉得错误信息交给程序员自由发挥不太好,或者想实现国际化,我的想法是这样的,可以另建一个国际资源文件专门放错误信息,规则如struts,使用spring的ApplicationContext类来装载,所有的serivce类通过这种办法传递错误码,即key,获得错误消息。此为后话。
首先为你的应用程序定制一套异常类。例如,先定义一个基类(可以是虚类),注意,在此它扩展自RuntimeException,这是为了在struts的action中顺利捕获到。
public class BaseException extends RuntimeException {...}
下来你可以定义几个子类,例如:Dao异常,事务处理异常,service异常等。在spring中,包
org.springframework.dao下定义了一套Dao异常,值得大家学习一下。
接着,在struts-cofig.xml文件中定义全局异常如下,此处的key属性我已经不准备用了:
<global-exceptions> <exception key="todo" type="org.chage.exception.BaseException" handler="org.chage.exception.MyExceptionHandler" /> </global-exceptions>
下面看一下我的处理异常的类:
package org.chage.exception; import org.apache.struts.action.ExceptionHandler; import ... public class MyExceptionHandler extends ExceptionHandler {
public ActionForward execute(
Exception exception,
ExceptionConfig config,
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
request.setAttribute("exception", exception);
//返回原始请求的Forward,当然你也可以定义一个全局异常Forword,都转向它
return mapping.getInputForward();
}
}
在页面上(此页面我们设置为请求action,即发生异常的action的input属性),我们显示错误信息时可以使用struts标签如下,注意,这里显示的信息和资源属性文件无关,是你自己抛出的:
<logic:present name="exception">
<bean:write name="exception"/>
</logic:present>
这样作的好处在哪里呢?我们来看一下,一般我们的思路是,发生了逻辑错误,比如说,用户名输重复,或者准备修改的数据已被他人删除等,我们要捕获它并显示给用户,第一感是在action中作的,例如:
try{ //do something logic method... }catch (XXXException e){ ActionErrors errors= new ActionErrors(); ActionError error=new ActionError("error.missing.username"); errors.add("error.xxx",error); saveErrors(request,errors); return mapping.findForward("errorPage"); }
设计良好的action应该仅仅是web层的一个“路标指引器”,真正的逻辑方法是调用其他的业务bean来完成的,简单地说,通常认为action中的代码越少越好.如果采用了上面那种全局异常处理机制,action此时就可以不用管逻辑异常了,由业务bean负责抛出就可以了,大家就可以少写一些action中的try catch 语块了,也可以绕开ActionError,思路上是不是更清晰?异常在真正发生的类中被抛出,然后向上传递,一直传到action中,struts负责捕获之,当然这里的异常你必须已经定义过了。
注:
1. 如果你不想写 MyExceptionHandler 类,当然struts-config.xml中的handler=属性也要去掉,还有一种办法可以显示错误信息在 jsp页上,先引用jstl标签库,然后如下:
<c:out value="${requestScope['org.apache.struts.action.EXCEPTION'].message}"/>
2.如果觉得错误信息交给程序员自由发挥不太好,或者想实现国际化,我的想法是这样的,可以另建一个国际资源文件专门放错误信息,规则如struts,使用spring的ApplicationContext类来装载,所有的serivce类通过这种办法传递错误码,即key,获得错误消息。此为后话。
相关文章推荐
- struts1.1中的异常应用实践
- Java小应用日志级别异常处理最佳实践
- 在struts应用中处理异常的各种方式
- struts1.3+validator验证框架应用报异常的解决方案
- 避免Java应用中空指针异常的技巧和最佳实践
- struts应用在断网下启动有异常 :java/net/AbstractPlainSocketImpl.java:184-1
- 关于在struts2.0中应用json产生类型访问异常问题的解决
- 实践hibernate的应用——struts2+hibernate的简单学生信息管理
- Java开发实践 网络编程 学习、应用、总结
- Spring Boot实践应用开发(3)
- Jasperreport+ireport 实践操作及 web 应用【转】
- 电脑摄像头阅卷软件在教学各环节中的实践应用
- Struts原理与实践(7)
- DotNET企业架构应用实践-架构师成长之路-如何成为优秀架构师
- Silverlight企业应用开发实践-AgileEAS.NET平台5.0 Silverlight支撑预览
- css 应用最佳实践-组织规则
- 使用.Net开发插件式应用时,遇上“Could not load file or assembly'****'” 的异常
- 运行"使用DroidPlugin实践应用的插件化"里面demo碰到的问题(附个人解决方案)
- struts+spring+hibernate的web应用 Dao层代码编写
- Struts原理与实践(2)