Struts2的异常处理
1.异常处理机制(1)发送请求到控制器(Action);
(2)Action出现异常后,依照所捕捉的不同异常转入不同的视图资源。
2.异常捕捉
(1)在Action的处理逻辑中,手动捕捉异常,在捕捉到特定的异常后,返回指定的逻辑视图名,这种方式太繁琐不利于代码的修改和维护:
import com.opensymphony.xwork2.ActionSupport; public class Test3Action extends ActionSupport{ //逻辑视图名 static final String ERROR_1 = "error1"; //封装一个请求参数 private String username; //setter、getter方法 public void setUsername(String username){ this.username = username; } public String getUsername(){ return this.username; } //处理逻辑,在此处我们部直接抛出异常而是用try...catch的方式手动捕捉异常 //根据不同的异常返回不同的逻辑视图名 public String execute(){ try{ return SUCCESS; }catch(Exception e){ return ERROR_1; } } }
(2)声明式的异常捕捉:
Action的处理逻辑抛出所有的异常给Struts2框架,当Struts2框架接收到所抛出的异常后,根据在Struts.xml中配置的异常映射转入不同的物理视图资源。
这种异常处理是通过在Struts.xml中配置<exception-mapping>完成的,使用该元素需要指定两个属性:
exception:指定该异常映射所设置的异常类型;
result:指定Action出现异常时系统返回的逻辑视图名。
根据<exception-mapping>元素出现的位置不同,我们可以把异常分为两种:局部异常(在<action>中配置)和全局异常(在<global-exception-mapping>中配置),局部异常对该Action有效,而全局异常对所有Action有效,当全局异常和局部异常配置了同一个异常类型时,在此Action中局部异常会覆盖全局异常。
自定义两个异常类:
UserException:
package exception; public class UserException extends Exception{ public UserException(){ } public UserException(String msg){ super(msg); } }
ErrorException:
package exception; public class ErrorException extends Exception{ public ErrorException(){ } public ErrorException(String msg){ super(msg); } }
写一个抛出异常的Action:
import com.opensymphony.xwork2.Action;
import exception.ErrorException;
import exception.UserException;
public class Test4Action implements Action{ //封装请求参数 private String username; //setter、getter方法 public void setUsername(String username){ this.username = username; } public String getUsername(){ return this.username; } @Override public String execute() throws Exception { if(getUsername()==null){ throw new UserException("用户名不得为空"); }else if(!getUsername().equals("jiagoushi")){ throw new ErrorException("用户名错误"); }else{ return SUCCESS; } } }
在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.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="package_a" extends="struts-default"> <!-- 定义一个全局结果 --> <global-results> <result name="errorException">errorException.jsp</result> </global-results> <!-- 定义一个全局异常 --> <global-exception-mappings> <!-- 当Action遇到ErrorException异常时,将转入到名为errorException的结果中 --> <exception-mapping result="errorException" exception="exception.ErrorException"/> </global-exception-mappings> <action name="test1" class="testAction.Test1Action"> <result name="error">error.jsp</result> <result>${name}.jsp</result> </action> <action name="test4" class="testAction.Test4Action"> <!-- 定义局部异常处理 --> <exception-mapping result="userException" exception="exception.UserException"/> <exception-mapping result="errorException" exception="exception.ErrorException"/> <!-- 定义结果映射 --> <result>welcome.jsp</result> <result name="userException">userException.jsp</result> <!-- 局部异常会覆盖全局异常 --> <result name="errorException">errorException_test.jsp</result> </action> </package> </struts>
3.异常信息的输出使用Struts2提供的标签可以用来输出异常信息:
<s:property value="exception">:输出异常对象;
<s:property value="exceptionStack">:输出异常堆栈信息。