struts2中的异常映射处理机制

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

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

一:局部异常:

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

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

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



Insert title here


  
   
   

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

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

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

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

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

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



Insert title here


  异常信息:



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

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

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

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

6:运行结果

在表单输入user或者User

struts2中的异常映射处理机制_第1张图片

二:全局异常:

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

                  

	  
	    /ecpt.jsp
	    /ecpt.jsp
	  
	  
	  
	      
	      
	  

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

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

struts2中的异常映射处理机制_第2张图片struts2中的异常映射处理机制_第3张图片

三:总结:

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

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

例如:

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



你可能感兴趣的:(Struts2)