struts2中支持申明式的异常处理。当程序中出现异常之后,struts2需要我们向外抛,之后struts2为我们提供特定的处理struts2异常的接口,让我们可以在特定的页面进行处理。以上一个工程为基础,拷贝一份(工程struts2_3000_BBS2009_07_ExceptionHandling
)
1.首先我们在CategoryService
中的方法可以看到之前有异常我们只是打印,但是上一层并不知道我们出现了异常,这里我们加上一个异常抛出(以list方法为例)
public List<Category> list() throws SQLException{
Connection connection = DB.createConne();
String sql = "select * from _category";
PreparedStatement ps = DB.prepare(connection, sql);
List<Category> categories = new ArrayList<Category>();
try{
ResultSet result = ps.executeQuery();
while(result.next()){
Category category = new Category();
category.setId(result.getInt("id"));
category.setName(result.getString("name"));
category.setDescription(result.getString("description"));
categories.add(category);
}
}catch(SQLException e){
e.printStackTrace();
//这里我们将异常进行抛出
throw(e);
}
DB.close(ps);
DB.close(connection);
return categories;
}
而在CategoryAction.java
中的方法list()
我们就不需要抓取了,只需要往外抛,让struts2帮我们处理。
//这里我们同样将异常抛出,统一交给struts2进行处理
public String list() throws Exception{
categories = service.list();
return SUCCESS;
}
那如何处理呢?我们在struts.xml
中
<action name="*_*" class="com.bjsxt.bbs2009.action.{1}Action" method="{2}">
<result>/admin/{1}_{2}.jsp</result>
<result name="input">/admin/{1}_{2}.jsp</result>
<!--异常处理,处理之后跳转到error.jsp页面-->
<exception-mapping result="error" exception="java.sql.SQLException" />
<result name="error">/error.jsp</result>
</action>
可以看到我们配置了当异常发生时我们就返回error,然后会跳转到error.jsp
页面。
但是如果我们想让一个异常处理配置所有的异常都可以使用,则需要使用全局异常配置:
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts-devMode" value="true"></constant>
<package name="bbs2009_default" extends="struts-default">
<global-exception-mappings>
<exception-mapping result="exception_handle" exception="Exception"></exception-mapping>
</global-exception-mappings>
</package>
<package name="admin" namespace="/admin" extends="bbs2009_default" >
<default-action-ref name="index"/>
<action name="index">
<result>/admin/index.html</result>
</action>
<action name="*_*" class="com.bjsxt.bbs2009.action.{1}Action" method="{2}">
<result>/admin/{1}_{2}.jsp</result>
<result name="input">/admin/{1}_{2}.jsp</result>
<!--异常处理,处理之后跳转到error.jsp页面-->
<!-- <exception-mapping result="error" exception="java.sql.SQLException" /> -->
<result name="error">/error.jsp</result>
</action>
</package>
<package name="front" namespace="/" extends="struts-default" >
<default-action-ref name="Category_list"/><!-- 默认访问此界面 -->
<action name="Category_list" class="com.bjsxt.bbs2009.action.CategoryAction" method="list">
<result>/index.jsp</result>
</action>
</package>
</struts>
可以看到我们将之前的异常配置注释掉了,然后配置了一个全局异常处理,然后其他package继承这个全局异常处理package。当发生异常之后会先在自己package中找,如果没找到则去父package(这里即全局异常package)找,找到之后仍然返回到本package中的result中。但是这样并不好,因为result不能重用,这里我们还可以配置一个全局的result。
<package name="bbs2009_default" extends="struts-default">
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="exception_handle" exception="Exception"></exception-mapping>
</global-exception-mappings>
</package>
注意:配置顺序不能反。