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="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

时间: 2024-12-28 16:34:06

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

Struts2学习笔记二 配置详解

Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的namespace,然后在包下寻找名为HelloAction的action,反射创建控制器HelloAction对象,调用method指定的方法hello,拿到返回值“success”,去result的配置节找success对应的页面(hello.js),呈现给用户. 2.Struts的架构,具体参考这里

Struts2学习笔记(二)——配置详解

1.Struts2配置文件加载顺序: default.properties(默认常量配置) struts-default.xml(默认配置文件,主要配置bean和拦截器) struts-plugin.xml(配置插件) struts.xml(配置action或者常量等) struts.properties(常量配置) web.xml(配置JavaEE,如:监听器和过滤器) 2.Struts2配置文件详解 1)default.properties default.properties是Struts

struts2学习笔记——第一个struts2应用配置

说实在的,随着Java学习的不断深入,特别是Java web框架部分,调bug让人很心累,但是每征服一个bug,内心的成就感也是难以言说的.第一个struts2应用的配置,我昨天折腾了快2个小时,最后还是放弃了,今天在摸索之下,终于打通了第一个struts2的任督二脉,下来就把我个人的配置过程写下来,希望后面学习的java友少走的弯路. 一.创建web工程(eclipse k kepler版本): 直接上图: 二.导入struts2关键包 1.需要导入的关键包,不导入这些包会导致报错,我就知bu

struts2学习笔记之九:struts2的命名空间

struts2的命名空间适用于多人开发,根据不同模块命名不同的命名空间,方便开发和管理 struts2如果没有配置命名空间,默认命名空间为"/",Struts2中Action的完整路径应该为:namespace+Action的名称 但是在jsp中调用的时候,不需要加/, 首先在指定的命名空间下查找Action,如果找到了就使用此Action,如果没有找到在上层目录中查找,一直到 根(缺省命名空间),在此过程中如果找到了Action就会使用此Action,如果都没有找到就会抛出Actio

struts2学习笔记之十一:struts2的类型转换器

Struts2的类型转换器 如何实现Struts2的类型转换器? * 继承StrutsTypeConverter * 覆盖convertFromString和convertToString 注册类型转换器 * 局部类型转换器,局部类型转换器只对当前Action起作用,需要提供如下配置文件: MyActionName-conversion.properties,MyActionName指需要使用转换器的Action名称 "-conversion.properties"固定字符串,不能修改

【Struts2学习笔记-8】Struts2实现json数据的返回

需要的jar包 struts2-json-plugin-2.3.12.jar xwork-core-2.3.16.3.jar struts.xml 来自为知笔记(Wiz) 附件列表 IMG_20150813_231242.jpg IMG_20150813_231255.jpg

struts2学习笔记(4)---------action中的方法调用

系统需要使用Action的不同方法来处理用户请求,这就需要让同一个Action里面包含多个控制处理逻辑. 1)动态方法调用 即DMI(dynamic method invocation),使用actionName!methodName的形式来指定想要调用的方法,如果想使用DMI,需要在struts.xml里面加入这句话: <constant name="struts.enable.DynamicMethodInvocation" value="true" /&

struts2学习笔记(三)—— 在用户注册程序中使用验证框架

实现目标: 1.使用验证框架对用户注册信息进行验证 2.验证用户名.密码.邮箱不能为空 3.验证用户名.密码长度 4.验证邮件地址格式 具体实现 一.Struts2应用的基础配置 这里不做详细阐述,具体为web.xml.相关jar包的配置 二.将页面显示的文本内容放到资源文件中 1.查看用户注册程序中的所有页面,找到所有可以显示的文本内容,将它们分离出来放到资源文件中. 2.与相关的Action类同名,以.preperties为扩展名,与Action类位于同一个包中,只能由该Action访问 R

struts2学习笔记(5)----------配置result

Action只负责处理请求,负责生成响应的视图组件,一般是JSP页面,而Action为JSP页面提供显示的数据.Action处理请求结束后,控制器根据<result>元素配置的逻辑视图跟物理视图之间的关系来响应. 浏览器,控制器和视图资源的顺序图如下: 如图所示,Action处理完一个请求后,并未直接把请求转发给任何具体的视图资源,而是返回给一个逻辑视图,struts2框架收到这个逻辑视图后,把请求转发到对应的物理视图资源,试图资源将结果呈现给用户. 1)result基本配置 struts2提