struts2异常处理

java1234官网

在sstruts2里面配置自己的异常处理

1 <exception-mapping result="error" exception="java.sql.SQLException"/>
2             <result name="error">/error.jsp</result>

在service里面捕捉到异常后往外抛,如

 1 public List<Category> list()throws SQLException{
 2         Connection conn = DB.createConn();
 3         String sql = "select * from category";
 4         PreparedStatement ps = DB.prepare(conn, sql);
 5         List<Category> categories = new ArrayList<Category>();
 6         ResultSet rs;
 7         try {
 8             rs = ps.executeQuery();
 9             Category c = null;
10             while(rs.next()){
11                 c = new Category();
12                 c.setId(rs.getInt("id"));
13                 c.setName(rs.getString("name"));
14                 c.setDescription(rs.getString("description"));
15                 categories.add(c);
16             }
17         } catch (SQLException e) {
18             // TODO Auto-generated catch block
19             e.printStackTrace();
20             throw (e);
21         }
22         DB.close(ps);
23         DB.close(conn);
24         return categories;
25     }

注意抛出异常throw(e),必须显示声明异常throw SQLException.

当action调此方法时,会接住异常,再次往外平抛,由strust接住,找到此异常对应匹配的result,显示页面。

如果有很多种异常怎么办?要写很多个吗?

写一个package,在里面写个全局的异常映射,后面的包都继承这个包。代码如下

 1 <package name="bbs2_default" extends="struts-default">
 2     <!--     <global-results>
 3             <result name="error">/admin/error.jsp</result>
 4         </global-results>
 5          -->
 6         <global-exception-mappings>
 7             <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
 8         </global-exception-mappings>
 9     </package>
 1  
 2     <package name="admin" namespace="/admin" extends="bbs2_default">
 3         
 4         <action name="index">
 5             <result>/admin/index.html</result>
 6         </action>
 7         
 8         <action name="*-*" class="com.lch.bbs2009.action.{1}Action" method="{2}">
 9             <result name="success">/admin/{1}-{2}.jsp</result>
10             <result name="input">/admin/{1}-{2}.jsp</result>
11        <!--      <exception-mapping result="error" exception="java.sql.SQLException"/> -->    
12             <result name="error">/error.jsp</result>            
13         </action>
14 
15     </package>

在admin包中没找到对应的异常,则在父包中找,返回一个相应的result,再在admin中找到对应的result,再跳转到对应的页面。

但是这样还是比较麻烦,通常的做法是

1  <package name="bbs2_default" extends="struts-default">
2         <global-results>
3             <result name="error">/error.jsp</result>
4         </global-results>
5         <global-exception-mappings>
6             <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
7         </global-exception-mappings>
8     </package>

 global-results要在global-exception-mappings的前面。

拦截器

默认拦截器配置引用

 <default-interceptor-ref name="defaultStack"/>

虽然在这里exception没有配置任何的interceptior,但是任何调用都会被上面这些拦截器过滤一遍。我们看一下exception的拦截器

任何的拦截器都必须实现一个抽象类AbstractInrerceptor,这个抽象类必须实现一个接口Interceptor通过查看,找到拦截所用的方法

这句话就已经调用了action了

一句话总结,对于异常的声明式处理,在struts2里面是用拦截器来实现的。

posted @ 2013-07-28 10:34  李鬼989  阅读(282)  评论(0编辑  收藏  举报