在struts2应用程序中你还在使用try catch语句来捕获异常么?如果是这样的,那你OUT啦!struts2支持声明式异常处理,可以再Action中直接抛出异常而交给struts2来 处理,当然需要我们在xml文件中配置,由于抛出同样的异常的处理方法通常都一样,所以如果能在xml中配置全局异常,将会使得开发便捷性大大提高。

以前的异常捕获可能是这样的:

/**
* 执行更新
*
* @return
*/
public String update() {
Article article = new Article();
article.setContent(content);
article.setTitle(title);
article.setId(id);
try {
articleService.update(article);
return SUCCESS;
} catch (SQLException e) {
e.printStackTrace();
return ERROR;
} catch (InvalidInputException e) {
e.printStackTrace();
System.out.println("输入非法");
return ERROR;
}
}

这种方式是完全的手动处理异常,一来不够简洁明快,而且还不容易维护,毕竟如果修改了这些代码都需要再次编译。

采用struts2的声明式异常处理就会简单很多了。

首先,上面的代码的try catch 就可以全都不要了,但是,当然,得新加throw语句抛出异常:

/**
* 执行更新
*
* @return
* @throws InvalidInputException
* @throws SQLException
*/
public String update() throws SQLException, InvalidInputException {
Article article = new Article();
article.setContent(content);
article.setTitle(title);
article.setId(id);
articleService.update(article);
return SUCCESS;
}

代码清晰了很多,不是么?

捕获异常的任务则交给xml配置文件了,配置文件还是比较容易理解的:

<package name="wow" extends="struts-default">
<global-results>
<result name="sql">/internal_Error.jsp</result>
<result name="invalidinput">/invalid_Input.jsp</result>
<result name="naming">/internal_Error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="sql" exception="java.sql.SQLException"></exception-mapping>
<exception-mapping result="invalidinput"
exception="cn.codeplus.exception.InvalidInputException"></exception-mapping>
<exception-mapping result="naming"
exception="javax.naming.NamingException"></exception-mapping>
</global-exception-mappings>
<action name="*_*" class="cn.codeplus.action.{2}Action" method="{1}">
<result name="success">/{}_{}_success.jsp</result>
<result name="error">/{}_{}_error.jsp</result>
<!--<exception-mapping result="sql" exception="java.sql.SQLException"></exception-mapping>-->
</action>
</package>

用于异常处理的<exception-mapping>标签可以配置在Action中,也可以配置在<global-exception-mappings>,顾名思义<global-exception-mappings>就是全局异常,当然执行Action的时候发生异常时,如果在Action中没有捕获异常而是抛出异常的话,struts2会首先在正在执行的Action中查找<exception-mapping>,寻找对应的Exception进行处理,如果找不到,才会去<global-exception-mappings>去寻找对应的Exception处理,如果还是找不到的话,就只好抛出异常了。

下面说说异常处理:

<exception-mapping result="sql" exception="java.sql.SQLException"></exception-mapping>

上面代码说明,当捕获java.sql.SQLException时候,去寻找对应的result为sql的视图返回,即<global- result>中name为sql的result去返回internal_Error.jsp。当然如果<exception- mapping>配置在action中的话,则会首先去action的result搜寻返回视图,失败了才会去搜寻<global- result>。

在我们编写上面的xml配置的时候可能会遇到如下错误:

这个是因为,我们xml配置文件各个标签<action>、<global-result>、<global-exception-mapping>的顺序不对,调整一下标签的顺序,符合黄色的提示语即可。

最后,我们说说视图层怎样获取异常信息,invalid_Input.jsp文件是这样的:

...
<%@taglib prefix="s" uri="/struts-tags"%>
...
<body>
<jsp:include page="nav.jsp"></jsp:include>
<div>
抱歉,服务器内部错误。
</div>
<div>
<s:property value="exception.message"/>
</div>
<s:debug></s:debug>
</body>
...
<s:property value="exception.message"/>表示从valuestack中获取错误信息,显示在前台页面上。当然,我们也可以选择更人性化得处理方案,比如说,放个失望的表情,写上“抱歉,服务器内部错误,您可以发邮件给我们提示此错误,xxxx@xxxx.com”等等;
经测试,当发生SQLException的时候,页面信息如下:

Struts2的声明式异常处理的更多相关文章

  1. Struts2学习---拦截器+struts的工作流程+struts声明式异常处理

    这一节我们来看看拦截器,在讲这个之前我是准备先看struts的声明式异常处理的,但是我发现这个声明式异常处理就是由拦截器实现的,所以就将拦截器的内容放到了前面. 这一节的内容是这样的: 拦截器的介绍 ...

  2. Struts2学习第八课 声明式异常处理

    异常处理:exception-mapping元素 exception-mapping元素:配置当前的action的声明式异常处理 exception-mapping元素有两个属性: --excepti ...

  3. struts的声明式异常处理

    情景 使用Struts封装的下载文件的功能 当下载文件找不到的时候,struts获取的InputStream为null 这个时候,就会报500错误 java.lang.IllegalArgumentE ...

  4. 6.声明式异常处理、I18N

    声明式异常处理 1.在Action 中进行异常映射 <exception-mapping result="error" exception="java.sql.SQ ...

  5. 9、 Struts2验证(声明式验证、自定义验证器)

    1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...

  6. 学习Struts框架系列(三):声明式异常处理

    在Struts1.X的版本中加入了对异常的处理Exception Handler,有了它我们可以不使用try/catch捕获异常,一旦出现了我们已经定义的异常,那么就会转到相应的页面,并且携带异常信息 ...

  7. Struts2声明式异常处理

    通过配置.xml文件的方式处理异常信息: 注意:配置.xml文件的同时还要抛出异常 标签:<exception-mapping></exception-mapping>和< ...

  8. Strut2_声明式异常处理

    Service 往外抛异常 public List<Category> list() throws SQLException{ Connection conn = DB.createCon ...

  9. [原创]java WEB学习笔记60:Struts2学习之路--Actioin-声明式异常处理

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. 数缘社区上对libtom的介绍,贴过来先

    http://blog.csdn.net/songlingrebecca/article/details/5879154 基于Bit位运算的C语言库分析及其应用 1 LibTomproject的简要介 ...

  2. Spring AOP + AspectJ Annotation Example---reference

    In this tutorial, we show you how to integrate AspectJ annotation with Spring AOP framework. In simp ...

  3. 从高德 SDK 学习 Android 动态加载资源

    前不久跑去折腾高德 SDK 中的 HUD 功能,相信用过该功能的用户都知道 HUD 界面上的导航转向图标是动态变化的.从高德官方导航 API 文档中 AMapNaviGuide 类的描述可知,导航转向 ...

  4. Web的鼠标拖动效果

    以前写过一个拖动效果的Demo,拖拽元素新位置的计算是放在拖拽元素的mousemove事件中进行的.计算效率差,而且效果不好.所以一直有想怎样才能做出jquery-ui那种顺滑的拖拽效果. 其实顺滑的 ...

  5. titlebar和actionbar上的按钮设置

    ---恢复内容开始--- Actionbar加按钮: 在res文件夹下新建menu文件夹(如果你没有),然后添加一个XML文件 <?xml version="1.0" enc ...

  6. 11.2 morning

    noip模拟题day1——棋盘上的问题 day1模拟题 By FancyCoder总览(Overview)注意事项:共3道题目,时间2.5小时.Pascal选手允许使用math库和ansistring ...

  7. HDFS的Java客户端操作代码(查看HDFS下的文件是否存在)

    1.查看HDFS目录下得文件是否存在 package Hdfs; import java.io.IOException; import java.net.URI; import org.apache. ...

  8. SQL存储过程传入字段名查询.

    根据字段名和对应的值查询. (正确代码):目前发现,需要"分组,排序"等才能解决,如"order by","group by"等. SQL代 ...

  9. JS调用android逻辑方法

    1.安卓打开webview时做如下配置 并做一回调接口 这里注意的是 参数 FULIBANG   和 回调接口方法  jsCallWebView 一会在JS里会用到 ================= ...

  10. Oracle-在线重定义操作文档

    Oracle-在线重定义操作文档 2015年10月8日 15:51 在线重定义的大致操作流程如下: (1)创建基础表A,如果存在,就不需要操作. (2)创建临时的分区表B. (3)开始重定义,将基表A ...