struts2中的异常映射处理机制

首先在struts2中有两种异常处理机制:局部异常映射和全局异常映射。

拿经典的用户登录功能来说:

一:局部异常:

1:首先我们的登录界面:表单交由exAction.action 处理。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
  <s:form action="exAction" id="form" method="post">
   <s:textfield name="username" key="user"/>
   <s:textfield name="password" key="pass"/><br/>
    <s:submit key="login"/>
  </s:form>
</body>
</html>

2:我们先定义一个异常myException:申明message属性并提供get,set方法,封装提示信息。该类继承Exception

package com.mao;

public class myException extends Exception {
	private String message;
	public myException(String message) {
		super(message);
		this.message = message;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	
}

3:然后我们的逻辑控制器Action,实现类:ExceptionAction

package com.mao;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class ExceptionAction extends ActionSupport{
	private String username;
	private String password;
	private String tip;
	
	//省略所有属性的set、get方法
	public String execute()throws Exception{
		ActionContext act=ActionContext.getContext();
		if(getUsername().equalsIgnoreCase("user")){
			throw new myException("自定义异常");
		}
		if(getUsername().equalsIgnoreCase("sql")){
			throw new java.sql.SQLException("用户名不能为sql");
		}
		if(getUsername().equals("mao")&&getPassword().equals("3214")){
			setTip("服务器提示:登陆成功");
			return SUCCESS;
		}else{
			return ERROR;
		}
	}
}

代码很明显看出,如果用户名为user抛出自定义异常,如果为sql抛出系统定义的SQLException异常,这里顺便说一下equalsIgnoreCase()方法与equals()区别,从字面上也看出来了equalsIgnoreCase()字面不拘小节嘛,所以它不区分大小写,比如用户名getUsername.equalsIgnoreCase("mao"),你输mao和Mao都是可以可以的,而equals()严格区分字节和长度,比较苛刻。

4:然后我们的配置文件struts.xml

此处我只列举出局部异常的部分:

            <!-- 定义局部异常和局部结果集 -->
	    <action name="exAction" class="com.mao.ExceptionAction">
	      <exception-mapping result="my" exception="com.mao.myException"/>
	      <result name="my">/ecpt.jsp</result>
	      <result name="success">/welcom.jsp</result>
	      <result name="error">/error.jsp</result>
	    </action>
这里注意,局部异常是在<action></action>标签内通过<exception-mapping/>标签定义的的,而且需要指定结果字符串result="my",和exception="com.mao.myException"异常映射所指定的异常类型,拿此处来讲,映射的就是咱们前面定义的myException异常,com.mao为该类所在的包。可以看出,局部异常全部定义在<action></action>标签之内。一快看下来就是,前台表单交给exAction去处理,好,处理的过程中抛出了一个myException异常,然后该异常返回了一个my的结果字符串,然后,在下面<result name="my">/ecpt.jsp</result>标签中定义此异常所返回的视图。这里也可以发现struts2框架的优点,耦合度低,前台表单仅传过来一个action,然后核心控制器filet截获并匹配相应逻辑控制器action去处理,处理完成后不是直接用视图的形式显示出来,而是返回一个字符串my,然后再通过相应字符串映射到相应视图。这大大提高了代码的复用性,哪天我们需要映射到不同视图时,只需修改<result>映射就可以(好了,扯多了)

5:这是返回的ecpt.jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
  异常信息:<s:property value="exception.message"/>
</body>
</html>


这里的exception就是指的咱们定义的异常com.mao.myException.

另外提示一点,本人在测试的时候由于在此页面中一直没有加

<%@taglib prefix="s" uri="/struts-tags" %>

这样就没法使用struts2标签,也就一直没法输出异常信息,希望大家不要犯此类低级错误。

6:运行结果

在表单输入user或者User


二:全局异常:

1:同样拿这个用户登录界面来讲,前面的表单,控制器exAction都已经给出,不再多说,我们直接看Struts.xml配置信息的如何配置全局异常:

                  <!-- 定义全局结果映射 -->

	  <global-results>
	    <result name="sql">/ecpt.jsp</result>
	    <result name="root">/ecpt.jsp</result>
	  </global-results>
	  <!-- 定义全局异常 -->
	  <global-exception-mappings>
	      <exception-mapping result="sql" exception="java.sql.SQLException"/>
	      <exception-mapping result="root" exception="java.lang.Exception"/>
	  </global-exception-mappings></span></span>

以上就定义了全局结果映射和全局异常映射,可以看出全局结果映射和全局异常都需要包含在<global...></global...>中,相当于,加上这个标签,你们就牛X了,就可以在全局有用了。说回来:全局异常需要定义在<global-exception-mappings></global-exception-mappings>中,这个标签就相当于给他们加了牛X属性,然后再在这里面通过<exception-mapping result="" exception=""/>标签定义全局异常映射(与局部相同)另外<exception-mapping/>标签注意结束形式,全局异常不能定义在<action></action>标签中,因为它需要在全局起作用,而不是某个action中起作用。:

2:结果:我们分别输入sql和正确的用户名密码 mao  3214显示


三:总结:

局部异常映射只对该Action有效,全局异常映射对所有Action有效。

但是局部异常映射"执行力"强,在都局部异常和全局异常都定义了相同映射的情况,程序会先去局部映射寻找相应的<result name="">所返回的视图,如果有,返回该视图,如果没有,那好,去全局映射里找。

例如:

          <global-results>
	    <result name="my">/welcom.jsp</result>
	  </global-results>
	  <!-- 定义全局异常 -->
	  <global-exception-mappings>
	      <exception-mapping result="my" exception="com.mao.myException"/>
	  </global-exception-mappings>
	    <!-- 定义局部异常和局部结果集 -->
	    <action name="exAction" class="com.mao.ExceptionAction">
	      <exception-mapping result="my" exception="com.mao.myException"/>
	    </action>
如上,我们在局部以及全局异常映射里都定义了com.mao.myException的映射,而且返回结果字符串都为my,程序会先去局部找,发现并没有找到相应的<result name="my">定义的返回视图,这时他就会去全局找,正好找到有个定义的<result name="my">所以将返回welcom.jsp页面,记住一句话:在局部映射和全局映射都存在相同<resule name="">属性,而且局部异常映射指定了jsp页面的情况下,全局映射永远都是"备胎"。



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值