我们在使用struts2 时经常会有这样的需求
1.要有一个统一的异常处理
2.针对某个 action 要有一个单独的异常处理
先来说需求一
很好解决我们可以使用﹤global-exception-mappings﹥
例:
<global-results>
<result name="exception">/exception.jsp</result>
<result name="login" type="redirect" >/index.jsp</result>
<result name="input">/exception.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="exception" exception="java.lang.Exception"/>
</global-exception-mappings>
再来说一个需求二
我们可以使用 :局部异常映射:﹤exception-mapping…﹥元素作为﹤action…﹥元素的子元素配置。
具体来说我们可以定一个异常处理action专门处理某个action的异常
例:
<struts>
<package name="report" extends="json-default">
<interceptors>
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mydefault" />
<!-- 保存选中要过滤的userid -->
<action name="reportAction" class="xxxxx.xxxx.ReportAction" >
<result type="json">
<param name="root">result</param>
</result>
<!-- 异常处理-->
<result name="all" type="chain">error</result>
<exception-mapping result="all" exception="java.lang.Exception"/>
</action>
<action name="error" class="xxxx.xxxx.ErrorAction">
<result name="error"></result>
</action>
</package>
</struts>
下面是ErrorAction的定义,你就可以在ErrorAction中为所欲为啦!!!!特别是处理ajax请求的统一异常处理
public class ErrorAction extends ActionSupport{
private static final long serialVersionUID = 1L;
Logger logger = Logger.getLogger(ErrorAction.class);
@Override
public String execute() throws Exception {
logger.error("Action Error ===> "+ActionContext.getContext().getValueStack()
.findValue("exceptionStack"));
// logger.error("Action Error ===> "+ActionContext.getContext().getValueStack()
// .findValue("exception"));
return ERROR;
}
}
另需求二也可以应用到需求一上,这样就可以定义一个处理全局 action 异常的统一处理类了