我们平常的异常处理是直接在方法中手动捕捉异常,当捕捉到特定异常后,返回特定逻辑视图名。这样的缺点是代码与异常处理耦合太多,一旦要改变异常处理方式,需要修改代码!
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学习笔记(6)------配置struts2中的异常处理,布布扣,bubuko.com