我们平常的异常处理是直接在方法中手动捕捉异常,当捕捉到特定异常后,返回特定逻辑视图名。这样的缺点是代码与异常处理耦合太多,一旦要改变异常处理方式,需要修改代码!
struts2提供给了一种更好的方式来处理异常------声明式的方式管理异常处理,我们可以通过再方法里将出现的异常throw出去,抛给struts2框架处理,然后再struts2中默认开启着异常映射功能,该功能在struts-default.xml中配置的一个拦截器,如下:
<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor" />
然后根据struts.xml配置的异常映射,转入指定的视图资源。
如何配置声明式异常处理:
使用exception-mapping元素配置,该元素有两个属性:
exception:该属性指定该异常映射所设置的异常类型,一般是包名+异常名
result:该属性指定当Action出现该异常时,系统应该返回的result的逻辑视图名,跟result元素的name属性要对应。
异常映射根据<exception-mapping>出现的位置不同,分为两类:
局部异常映射:将exception-mapping元素作为action元素的子元素
全局异常映射:将exception-mapping元素作为global-exception-mappings元素的子元素配置。跟全局result类似,全局异常映射也是针对所有的Action的,如果局部跟全局配置了同一个异常类型,那么局部的会覆盖全部的。。。。
如果想要在页面上输出异常信息,可以使用struts2提供的标签:
<s:property value="exception"/>:输出异常对象本身。
<s:property value="exceptionStack" /> :输出异常堆栈信息。
还可以使用<s:property value="exception.message" />输出异常的message信息。
看一个小例子,对LoginAction改造。如下:
public class LoginAction{
private String uname;
private String pwd;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String login() throws Exception{
if("user".equals(getUname())){
throw new Exception("自定义异常····");
}else if("sql".equals(getUname())){
throw new java.sql.SQLException("用户名不能为sql");
}else if("zhangsan".equals(getUname())&&"123".equals(getPwd())){
ActionContext.getContext().getSession().put("username", uname);
return "success";
}else{
return "error";
}
}
}如果用户名是sql或者user都会抛出异常,否则走正常的登陆流程。。。
然后重点来了,在struts.xml配置对这俩异常的处理,如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<!-- 这句用来配置动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 开发者模式 -->
<constant name="struts.devMode" value="true" />
<package name="user" extends="struts-default" >
<!-- 全局result -->
<global-results>
<result name="show">/show.jsp</result>
</global-results>
<!-- 声明式异常处理全局配置 -->
<global-exception-mappings>
<exception-mapping result="show" exception="java.sql.SQLException"></exception-mapping>
</global-exception-mappings>
<action name="loginAction" class="com.test.action.LoginAction" method="login">
<!-- 声明式异常局部配置 -->
<exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts> 如果是java.lang.Exception,就会跳转到error.jsp,如果是java.sql.SQLException,就会跳转到show.jsp
你可以在jsp上使用这几句话,打印出它的异常信息和堆栈信息:
<h1>异常信息:<s:property value="exception.message" /></h1>
<h2><s:property value="exceptionStack" /></h2>经测试,完美运行如下:
本文介绍如何在Struts2中通过声明式方式改进异常处理,避免代码与异常处理过度耦合,提高系统的灵活性和可维护性。通过在Action方法中抛出异常并利用全局或局部异常映射配置,实现异常的集中处理与视图资源的自动映射。此外,展示了如何在JSP页面上输出异常信息,以及如何配置Struts2框架进行异常处理。

被折叠的 条评论
为什么被折叠?



