码迷,mamicode.com
首页 > 其他好文 > 详细

struts2之拦截器

时间:2015-07-25 16:51:00      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

转载请注明http://blog.csdn.net/uniquewonderq


1.拦截器的作用:

拦截器适合封装一些通用处理,便于重复利用。例如请求参数传递给Action属性,日志的记录,权限检查, 事务处理等。拦截器是通过配置方式调用,因此使用方法比较灵活,便于维护和扩展。


2.创建拦截器组件:

创建一个类,实现interceptor 接口,并实现intercept方法。

public String intercept(ActionInvocation invocation){
   //拦截器--前部分处理
invocation.invoke();执行action和result
//拦截器--后续处理
}

在struts.xml中,注册拦截器

<package>

<interceptors>

<interceptor name="别名" class="实现类"/>

//其他interceptor

<interceptors>

<package>


3.引用拦截器

如果哪个Action希望被拦截器扩展,需要在此action配置下引用拦截器。

<action>

<interceptor-ref name="拦截器"/>

</action>

4.拦截器栈

往往一个action需要引用很多个拦截器,那么可以将这些拦截器打包成栈,直接引用这个栈即可,这样可以建华对拦截器的引用。


5.拦截器的使用

经典案例

写一个拦截器的helloworld程序

方案:

1>创建拦截器组件,实现接口Interceptor

2>在struts.xml中注册拦截器

3>在action的配置中引用拦截器

在这里继续复用修改客户功能,并对打开修改页面的action引用自定义的拦截器。

步骤:

步骤一:创建拦截器

创建包interceptor,在该包下创建拦截器组件Firstinterceptor,并实现接口interceptor,在该拦截方法中调用action业务方法,并且在调用action前后分别输出一些内容,以模拟对action请求的拦截。代码如下:

package interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
//第一个拦截器
public class FirstInterceptor implements Interceptor {

	public void destroy() {

	}

	public void init() {
		
	}

	public String intercept(ActionInvocation ai) throws Exception {
		System.out.println("FirstInterceptor拦截前...");
		//执行action业务方法
		ai.invoke();
		System.out.println("FirstInterceptor拦截后...");
		//返回值匹配对应的result,但是一旦代码中调用了ai.invoke后,则此时返回值无效,
		//struts2会根据action的返回值匹配result,如果当前代码中没有调用ai.invoke,
		//则此返回值有效。
		return "error";
	}
		
}


步骤二:注册拦截器

在struts.xml中,客户package下注册拦截器组件FirstInterceptor,代码如下;

<?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>
    <!-- 
    package:包,用于对action进行封装
    
     -->
     <package name="customer" namespace="/customer" extends="struts-default">
     
     <interceptors>
     <!-- 注册拦截器 -->
     <interceptor name="first" class="interceptor.FirstInterceptor"></interceptor>
     </interceptors>
     <!-- 打开修改页面 -->
    
     <action name="toUpdateCustomer" class="action.ToUpdateCustomerAction" >
     <result name="success">
     /WEB-INF/customer/update_customer.jsp
         </result>
        </action>
      </package>
     </struts>


步骤三:引用拦截器

在修改客户action的配置下,引用已注册的拦截器,代码如下:

<?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>
    <!-- 
    package:包,用于对action进行封装
    
     -->
     <package name="customer" namespace="/customer" extends="struts-default">
     
     <interceptors>
     <!-- 注册拦截器 -->
     <interceptor name="first" class="interceptor.FirstInterceptor"></interceptor>
     </interceptors>
     <!-- 打开修改页面 -->   
     <action name="toUpdateCustomer" class="action.ToUpdateCustomerAction" >
     
     <!-- 引用拦截器 -->
     <interceptor-ref name="first"></interceptor-ref>
     <result name="success">
     /WEB-INF/customer/update_customer.jsp
         </result>
        </action>
      </package>
     </struts>



步骤四:测试

为了便于观察拦截器与action的执行顺序,在action的构造方法以及业务方法中,输出一些内容,代码如下:

package action;

import java.util.List;

import DAO.CustomerDAO;
import entity.City;
import entity.Customer;
import entity.Sex;

public class ToUpdateCustomerAction {
	//output
	private Customer customer;//客户
	
	private List<Sex> sexes;//性别
	
	private List<City> cities;//城市
	
	public ToUpdateCustomerAction(){
		System.out.println("实例化ToUpdateCustomerAction...");
	}
	public String execute(){
		System.out.println("调用ToUpdateCustomerAction...");
		CustomerDAO dao=new CustomerDAO();
		//模拟客户查询
		customer=dao.findById();
		
		//模拟查询全部的性别
		sexes=dao.findALLSex();
		
		//模拟查询全部的城市
		cities=dao.findAllCities();
		return "success";
	}

	public Customer getCustomer() {
		return customer;
	}

	public void setCustomer(Customer customer) {
		this.customer = customer;
	}

	public List<Sex> getSexes() {
		return sexes;
	}

	public void setSexes(List<Sex> sexes) {
		this.sexes = sexes;
	}

	public List<City> getCities() {
		return cities;
	}

	public void setCities(List<City> cities) {
		this.cities = cities;
	}
	
}

重新部署项目,并启动tomcat,然后访问页面,控制台输出如下:

实例化ToUpdateCustomerAction...
FirstInterceptor拦截前...
调用ToUpdateCustomerAction...

FirstInterceptor拦截后... 


从输出结果看出,拦截器是在实例化Action之后,调用业务方法之前开始调用的。


2.扩展拦截器Helloworld

问题:联系使用拦截器栈,并观察多个拦截器的执行顺序

方案:创建一个新的拦截器,与第一个拦截器打包成栈,然后让修改客户的action引用这个拦截器栈,并观察控制台中这两个拦截器与Action的执行顺序。

步骤一:创建一个新的拦截器

创建一个新的拦截器组件SecondInterceptor,代码如下:

package interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class SecondInterceptor implements Interceptor{

	public void destroy() {

	}

	public void init() {
		
	}

	public String intercept(ActionInvocation ai) throws Exception {
		System.out.println("SecondInterceptor拦截前...");
		//执行action业务方法
		ai.invoke();
		System.out.println("SecondInterceptor拦截后...");
		//返回值匹配对应的result,但是一旦代码中调用了ai.invoke后,则此时返回值无效,
		//struts2会根据action的返回值匹配result,如果当前代码中没有调用ai.invoke,
		//则此返回值有效。
		return "error";
	}
}

步骤二:注册新的拦截器,并打包成栈

<?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>
    <!-- 
    package:包,用于对action进行封装
    
     -->
     <package name="customer" namespace="/customer" extends="struts-default">
     
     <interceptors>
     <!-- 注册拦截器 -->
     <interceptor name="first" class="interceptor.FirstInterceptor"></interceptor>
     <interceptor name="second" class="interceptor.SecondInterceptor"></interceptor>
	 <!-- 注册拦截器栈 -->
	 <interceptor-stack name="myStack">
	 <interceptor-ref name="first"></interceptor-ref>
	 <interceptor-ref name="second"></interceptor-ref>
	 </interceptor-stack> 
     </interceptors>
     <!-- 打开修改页面 -->   
     <action name="toUpdateCustomer" class="action.ToUpdateCustomerAction" >
     
     <!-- 引用拦截器 -->
     <interceptor-ref name="first"></interceptor-ref>
     <result name="success">
     /WEB-INF/customer/update_customer.jsp
         </result>
        </action>
      </package>
     </struts>

步骤三:引用拦截器栈

可以在action的配置下引用拦截器,也可以给一个包下所有的action统一设置默认使用拦截器,代码如下:

<?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>
    <!-- 
    package:包,用于对action进行封装
    
     -->
     <package name="customer" namespace="/customer" extends="struts-default">
     
     <interceptors>
     <!-- 注册拦截器 -->
     <interceptor name="first" class="interceptor.FirstInterceptor"></interceptor>
     <interceptor name="second" class="interceptor.SecondInterceptor"></interceptor>
	 <!-- 注册拦截器栈 -->
	 <interceptor-stack name="myStack">
	 <interceptor-ref name="first"></interceptor-ref>
	 <interceptor-ref name="second"></interceptor-ref>
	 </interceptor-stack> 
     </interceptors>
     <!-- 设置当前包下所有Action默认引用的拦截器 -->
     <default-interceptor-ref name="myStack"></default-interceptor-ref>
     <!-- 打开修改页面 -->   
     <action name="toUpdateCustomer" class="action.ToUpdateCustomerAction" >
     
     <!-- 引用拦截器 -->
     <!-- <interceptor-ref name="first"></interceptor-ref> -->
     <result name="success">
     /WEB-INF/customer/update_customer.jsp
         </result>
        </action>
      </package>
     </struts>


步骤四:测试

重新部署项目并重启tomcat,控制台输出如下结果:

实例化ToUpdateCustomerAction...
FirstInterceptor拦截前...
SecondInterceptor拦截前...
调用ToUpdateCustomerAction...

SecondInterceptor拦截后...
FirstInterceptor拦截后...



多个拦截器拦截Action的顺序满足先进后出原则。













































































版权声明:本文为博主原创文章,未经博主允许不得转载。

struts2之拦截器

标签:

原文地址:http://blog.csdn.net/uniquewonderq/article/details/47010995

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!