学习Struts框架系列(三):声明式异常处理
在Struts1.X的版本中加入了对异常的处理Exception Handler,有了它我们可以不使用try/catch捕获异常,一旦出现了我们已经定义的异常,那么就会转到相应的页面,并且携带异常信息,自动性增强。
Struts框架提供了默认的异常处理org.apache.struts.action.ExceptionHandler,它的execute()方法负责处理异常,在需要实现自定义处理时重写该方法。可以在配置文件中定义由谁来处理Action类中掷出的某种异常。
处理异常的流程
struts的控制器负责捕获各种异常,包括控制器运行中本身抛出的异常,以及调用模型的业务方法时抛出的异常。
当struts的控制器捕获到异常后,在异常处理代码块中,创建描述信息的actionMessage对象,并把它保存在特定范围(配置文件中的scope)。
在jsp中使用<html:errors/>标签,可以检索到特定范围内的actionMessages对象。
通过这个完整的代码示例,你将知道如何使用ExceptionHandler统一处理异常
struts配置文件
<global-exceptions>
<!-- 当遇到 type为java.lang.Exception异常时,使用com.bjsxt.oa.web.SystemExceptionHandler进行处理-->
<exception
key="errors.detail"
type="java.lang.Exception"
path="/common/exception.jsp"
scope="request"
handler="com.bjsxt.oa.web.SystemExceptionHandler"
></exception>
</global-exceptions>
key – 即这个异常所对应的错误提示消息文本的key,这个key的值,需要在资源属性文件中进行定义
type – 即定义需要处理哪种类型的Exception
path – 定义一旦出现异常,需要转向哪个页面来进行提示,如果不定义path属性,默认情况下,将使用Action配置中的input属性的值来作为转向的页面
局部和全局
handler -负责异常处理的类,缺省为org.apache.struts.action.Exceptionhandler.java,如果做个性化的异常处理可以继承此类覆盖execute方法
SystemExceptionHandler
使用SystemExceptionHandler统一处理SystemException异常
SystemExceptionHandler是自定义的ExceptionHandler类,重写了execute方法,实现自定义处理。
importcom.bjsxt.oa.manager.SystemException;
public classSystemExceptionHandler extends ExceptionHandler {
//日志记录对象
//commons-log类型接口,log4j实现
privatestatic Log logger = LogFactory.getLog(SystemExceptionHandler.class);
/**
* 处理SystemException异常
*/
@Override
publicActionForward execute(
Exceptionex,
ExceptionConfigae,
ActionMappingmapping,
ActionFormformInstance,
HttpServletRequestrequest,
HttpServletResponseresponse) throws ServletException {
//ExceptionConfig 和配置文件的exception标签信息对应
//ActionMapping和请求的action标签信息对应
//构造ActionForward对象
ActionForwardforward = null;
if(ae.getPath()!= null){
forward= new ActionForward(ae.getPath());
}else{
forward= mapping.getInputForward();
}
logger.debug("出现异常",ex);
//ex.printStackTrace();
//只对SystemException异常进行处理
//构造ActionMessage对象
if(exinstanceof SystemException){
SystemExceptionse = (SystemException)ex;
//取出key值
Stringkey = se.getKey();
ActionMessageerror = null;
if(key == null){
error= new ActionMessage(ae.getKey(),se.getMessage());
}else{
if(se.getValues()!= null){
error= new ActionMessage(key,se.getValues());
}else{
error= new ActionMessage(key);
}
}
this.storeException(request,key, error, forward, ae.getScope());
returnforward;
}
returnsuper.execute(ex, ae, mapping, formInstance, request, response);
}
}
SystemException
自定义异常类
public classSystemException extends RuntimeException {
//异常代码
privateString key;
privateObject[] values;
publicSystemException() {
super();
}
publicSystemException(String message) {
super(message);
}
publicSystemException(Throwable throwable) {
super(throwable);
}
publicSystemException(String message, Throwable throwable) {
super(message,throwable);
}
publicSystemException(String message,String key){
super(message);
this.key= key;
}
publicSystemException(String message,String key,Object value){
super(message);
this.key= key;
this.values= new Object[]{value};
}
publicSystemException(String message,String key,Object[] values){
super(message);
this.key= key;
this.values= values;
}
publicString getKey() {
returnkey;
}
publicObject[] getValues() {
returnvalues;
}
}
OrgManagerImpl
在这里抛出异常,异常会一直抛到Action,直到被struts控制器捕获。
publicvoid delOrg(int orgId) {
Orgnizationorg = (Orgnization)getHibernateTemplate().load(Orgnization.class, orgId);
//先判断是否存在子机构,如果存在子机构,则不允许删除
if(org.getChildren().size()> 0){
// 使用多种情况的异常信息:国际化、自定义
thrownewSystemException("存在子机构,不允许删除","exception.org.del",org.getId());
// thrownew SystemException("存在子机构,不允许删除");
}
getHibernateTemplate().delete(
org
);
}
MessageResources.properties
国际化资源文件
exception.org.del=Can'tDel Orgnization,id is {0}\!
小结
声明式异常,在代码中只进行抛异常就够了,捕获异常的事交给了ExceptionHandler类,省事多了。因为每一个异常类,对应的就需要有一个Handler类处理,所以这个异常类的粒度不能太细。
和编程式异常相比,编程式异常就比较灵活了,在action中可以针对manager提供的异常情况再做处理,进而向页面显示出合理的友好的提示信息,但因为在action中作为异常的处理终点,导致action类会比较庞大而且代码可读性下降。
总之,处理异常的这两种方式,一个粒度粗些,一个粒度细些,酌情处理就是了。
学习Struts框架系列(三):声明式异常处理的更多相关文章
- Struts2学习---拦截器+struts的工作流程+struts声明式异常处理
这一节我们来看看拦截器,在讲这个之前我是准备先看struts的声明式异常处理的,但是我发现这个声明式异常处理就是由拦截器实现的,所以就将拦截器的内容放到了前面. 这一节的内容是这样的: 拦截器的介绍 ...
- struts的声明式异常处理
情景 使用Struts封装的下载文件的功能 当下载文件找不到的时候,struts获取的InputStream为null 这个时候,就会报500错误 java.lang.IllegalArgumentE ...
- Struts2学习第八课 声明式异常处理
异常处理:exception-mapping元素 exception-mapping元素:配置当前的action的声明式异常处理 exception-mapping元素有两个属性: --excepti ...
- 6.声明式异常处理、I18N
声明式异常处理 1.在Action 中进行异常映射 <exception-mapping result="error" exception="java.sql.SQ ...
- Struts2的声明式异常处理
在struts2应用程序中你还在使用try catch语句来捕获异常么?如果是这样的,那你OUT啦!struts2支持声明式异常处理,可以再Action中直接抛出异常而交给struts2来 处理,当然 ...
- 2019 年起如何开始学习 ABP 框架系列文章-开篇有益
2019 年起如何开始学习 ABP 框架系列文章-开篇有益 [[TOC]] 本系列文章推荐阅读地址为:52ABP 开发文档 https://www.52abp.com/Wiki/52abp/lates ...
- java struts2入门学习--基于xml文件的声明式验证
一.知识点总结 后台验证有两种实现方式: 1 手工验证顺序:validateXxx(针对Action中某个业务方法验证)--> validate(针对Action中所有的业务方法验证) 2 声明 ...
- Struts框架——(三)动态ActionForm
一.DynaActionForm的引入意义 使用ActionForm把表单数据单独封装起来,而且提供了自动的数据验证,简化了代码的编写,给我们带来了极大的方便. 但是,ActionForm也存在一些明 ...
- SpringCloud开发学习总结(七)—— 声明式服务调用Feign(一)
在实践的过程中,我们会发现在微服务架构中实现客户端负载均衡的服务调用技术Spring Cloud Ribbon<SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon> ...
随机推荐
- BZOJ 2743: [HEOI2012]采花 离线树状数组
2743: [HEOI2012]采花 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 Description 萧芸斓是Z国的公主, ...
- SMACH专题(四)----状态State类的实现和中文注释
SMACH中,状态(State)是状态机器组成的重要部分,理解State的原理和实现,对使用SMACH很有帮助,特别是理解 __init__(),execute(),preempt是尤为关键. __i ...
- Vue集成微信开发趟坑:公众号以及JSSDK相关
首先,类库方面,Vue中引入JSSDK的话,请引入weixin-js-sdk,而不是weixin-jsapi,原因在于weixin-jsapi不是最新版:还要注意JS接口安全域名,不需要http前缀, ...
- Git_多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信息,用git remote: $ git r ...
- Aptana studio 3配色方案的修改方法
http://www.weste.net/2013/1-29/88614.html Aptana studio 3的确是一个不错的IDE,但是默认的黑底白色代码样式看时间长了有点审美疲劳了,如何能够更 ...
- python类型比较的3种方式(转)
通过types模块的类成员来判断,其实所有python中的类型都是这个types模块中类型的实例. import types type(x) is types.IntType # 判断是否int 类型 ...
- HTTP请求头和响应头
这篇文章简单总结一下HTTP请求头和响应头,并举一些web开发中响应头的用例. 1. HTTP请求头 accept:浏览器通过这个头告诉服务器,它所支持的数据类型.如:text/html, ima ...
- Clever Little Box 电缆组件 USB A 插头 至 USB B 插头
http://china.rs-online.com/web/p/usb-cable-assemblies/7244143/ 产品详细信息 USB3.0适配器 superspeed USB将提供10x ...
- vim选择命令
最近在做一些无聊的客户化OSD,发现结合vim的一些命令更简单. 1.全选:ggVG(V:shift+v) 解释是:gg 让光标移到首行,在vim才有效,vi中无效:V 是进入Visual(可视)模式 ...
- 无法打开文件“atlsd.lib”
问题: vs2013编译c++代码,错误 15 error LNK1104: 无法打开文件“atlsd.lib” 解决: 在你电脑或者其他人电脑上搜索atlsd.lib,将其拷贝到D:\Program ...