声明式异常处理
注:Struts2支持声明式异常处理。
Struts2是通过拦截器(interceptor)来处理声明式异常处理。
要求在DAO、Service、Action层都需要抛出导演就可以了。其它的让Struts2来处理。详细过程如下:
实例:
如果在列表时出现错误,则方法如下:
public List<Category> list() throws SQLException{
Connection conn = DB.createConn();
String sql = "select * from _category";
List<Category> categories = new ArrayList<Category>();
PreparedStatement ps = DB.prepare(conn, sql);
ResultSet rs = null;
try {
rs = ps.executeQuery();
Category c = null;
while(rs.next()){
c = new Category();
…………
}
} catch (SQLException e) {
e.printStackTrace();
throw(e);//此处向外抛出异常,让调用它的方法知道
} finally{
DB.close(rs);
DB.close(ps);
DB.close(conn);
}
return categories;
}
然后在调用它的Action也向上抛出异常
public String list() throws SQLException{
categories = categoryService.list();
return SUCCESS;
}
注意重点:我们需要在Struts.xml配置文件中配置需要处理的异常就可以了。
<action name="*-*" class="com.wjt276.bbs2009.action.{1}Action" method="{2}">
<result>/admin/{1}-{2}.jsp</result>
<result name="input">/admin/{1}-{2}.jsp</result>
<!-- <exception-mapping>标签是映射异常处理。表示映射哪种异常,此处是java.lang.Exception, 如果出现异常,那么它会跳转到reslut="error"的结果集,也就是/error.jsp -->
<exception-mapping result="error" exception="java.sql.SQLException"/>
<result name="error">/error.jsp</result>
</action>
当然,我们也可以将所有的异常使用同一个异常映射,那就是<global-exception-mappings>,需要映射的packge只需要继承此package就可以了。如下:
<package name="bbs2009-deafult" extends="struts-default">
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error" exception="java.sql.SQLException"/>
</global-exception-mappings>
</package>
action继承这个包就可以了:
<package name="admin" namespace="/admin" extends="bbs2009-default">
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>index.html</result>
</action>
<action name="*-*" class="com.wjt276.bbs2009.action.{1}Action" method="{2}">
<result>/admin/{1}-{2}.jsp</result>
<result name="input">/admin/{1}-{2}.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
注意:如果使用全局异常映射(<global-exception-mappings>)和全局结果集(<global-results>)则需要全局结果集(<global-results>)在前。
如果局部(当前)Action、和全局结果集存在相同的<result>,则使用最近的那个结果。
其中值得注意的是如果用default-action-ref对应的是一个简单的结果是可以执行的,但是如果想要让它执行class里面的内容就不行了(慎用)。这与这种情况,我们可以在web.xml中进行这样的配置:
<welcome-file-list>
<welcome-file>index</welcome-file>
</welcome-file-list>
总结:
1、 在Action中进行异常映射
2、 在package中进行全局异常映射
3、 使用继承共用异常映射
4、 Struts2中异常处理由拦截器实现(观察struts-default.xml)
a) 实际上Struts2的大多数功能都由拦截器实现。