成熟的MVC框架应该提供成熟的异常处理机制。当然可以在方法中手动捕捉异常,当捕捉到特定异常时,返回特定逻辑视图名。
这种方式非常繁琐,需要在方法中写大量try catch块,最大的缺点还是一旦需要改变异常处理方法时,需要修改代码。
最好的方式是通过声明式的方式管理异常处理。struts2提供了一种声明式的异常处理方式。
一、原理
我们看Action接口中的execute方法声明。
public String execute() throws Exception
这就意味着我们重写该方法时,无需进行任何异常处理,而是把异常抛给struts2框架处理.
struts2框架接收到Action抛出的异常后,根据struts.xml文件配置的异常映射,转入指定的视图资源。
异常映射功能是由 exception的拦截器帮我们做的。
struts2的异常处理机制是通过在struts.xml中配置<exception-mapping..../>元素完成。
属性:
exception:异常类型
result:出现该异常时,系统转入result指定的结果
二、局部异常映射和全局异常映射
全局异常映射对所有的Action都有效,但局部异常映射只对该异常映射所在的Action有效。
局部异常映射:将<exception-mapping..../>元素作为<action.../>的子元素配置
如果全局异常映射和局部异常映射配置了同一个异常类型,在该Action内,局部覆盖全局。
全局异常映射:将<exception-mapping..../>元素作为<global-exception-mappings>元素的子元素配置
三、异常处理案例
我们做一个简单的登陆应用
(1)编写我们的Action类
public class LoginAction implements Action{
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute()throws Exception{
//当用户名为monster时,抛出我们的自定义异常
if(getUsername().equals("monster")){
throw new MyException("自定义异常");
}
//当用户名为sql时,抛出sql异常
if(getUsername().equalsIgnoreCase("sql")){
throw new SQLException("用户名不能为sql");
}
if(getUsername().equals("cad")&&getPassword().equals("123456")){
return "success";
}else
{
return "error";
}
}
}
(2)我们编写我们的登陆jsp页面
<body>
<form action="${pageContext.request.contextPath }/login" method="post">
用户名:<input type="text" name="username"><br>
密 码:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
(3)我们编写我们的配置文件struts.xml
<package name="p2" extends="struts-default">
//全局结果视图定义
<global-results>
<result name="sql">/exception.jsp</result>
</global-results>
//全局异常定义
<global-exception-mappings>
//出现sql异常,就转入到视图名为sql的视图结果
<exception-mapping result="sql" exception="java.sql.Exception"></exception-mapping>
</global-exception-mappings>
<action name="login" class="com.cad.struts2.LoginAction" >
//局部异常定义
<exception-mapping result="my" exception="conm.cad.struts2.MyException"></exception-mapping>
<result name="my">/exception.jsp</result>
<result name="success">/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>