首页 > 代码库 > struts2学习笔记(6)------配置struts2中的异常处理

struts2学习笔记(6)------配置struts2中的异常处理

我们平常的异常处理是直接在方法中手动捕捉异常,当捕捉到特定异常后,返回特定逻辑视图名。这样的缺点是代码与异常处理耦合太多,一旦要改变异常处理方式,需要修改代码!

      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=http://www.mamicode.com/"exception"/>:输出异常对象本身。

<s:property value=http://www.mamicode.com/"exceptionStack" /> :输出异常堆栈信息。

还可以使用<s:property value=http://www.mamicode.com/"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=http://www.mamicode.com/"true" />>
如果是java.lang.Exception,就会跳转到error.jsp,如果是java.sql.SQLException,就会跳转到show.jsp


你可以在jsp上使用这几句话,打印出它的异常信息和堆栈信息:

<h1>异常信息:<s:property value=http://www.mamicode.com/"exception.message" />>
经测试,完美运行如下: