Struts2基础学习(五)—拦截器

一.概述

1.初识拦截器

     Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术。比如:权限控制、日志等。我们也可以将多个Interceptor 连在一起组成Interceptor 栈。

    Struts2拦截器,每个拦截器类只有一个对象实例,即采用单例模式,所有引用这个拦截器的Action都共享这一拦截器类的实例,因此在拦截器中如果使用类变量,要注意同步的问题。

     注意:  

           (1)拦截器在访问某个Action之前或之后实施拦截。

           (2)拦截器是可插拔的,是AOP的一种实现。

           (3)对于Action的一些公共处理代码可以被放到拦截器中,比如权限控制、日志等。

           (4)拦截器栈

               A: 拦截器栈就是将拦截器按一定的顺序连结成一条链。

               B: 在访问被拦截的方法或字段时,拦截器链中的拦截器救护按照之前定义的顺序被调用。

             (5)实现原理

              步骤一: Struts2拦截器的实现原理相对简单,当请求Struts2的Action时,Struts2会查找配置文件。

              步骤二: Struts2根据配置实例化对应拦截器对象,然后串成一个列表,最后一个一个的调用列表中的拦截器。

    

      拦截器采用责任链设计模式,在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来形成的一条链,责任链的每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行。

    

 

2.拦截器和过滤器的区别

(1)拦截器是基于Java反射机制的。

    过滤器是基于函数回调的。

(2)拦截器隶属于Struts2框架,只能拦截Action,无法拦截对JSP的请求。

    过滤器隶属于Web容器,可以过滤一切请求,包括JSP、Servlet、Action、HTML等。

(3)在Action的生命周期中,拦截器可以被多次调用。

    过滤器只能在容器初始化时被调用一次。

 

二、Interceptor接口

(1)每个拦截器都是实现了com.opensymphony.xwork2.interceptor.Interceptor接口的 Java 类。

	public interface Interceptor extends Serializable {

	    void destroy();

	    void init();

	    String intercept(ActionInvocation invocation) throws Exception;

	}

init: 该方法将在拦截器被创建后立即被调用,它在拦截器的生命周期内只被调用一次。 

destroy: 该方法将在拦截器被销毁之前被调用,它在拦截器的生命周期内也只被调用一次。

intercept: 每拦截一个请求动作,该方法都会被调用一次。

 

(2)Struts 会依次调用为某个 Action 而注册的每一个拦截器的interecept 方法。

(3)每次调用interecept方法时, Struts 会传递一个ActionInvocation 接口的实例。

(4)ActionInvocation: 代表一个给定动作的执行状态, 拦截器可以从该类的对象里获得与该动作相关联的 Action 对象和 Result 对象. 在完成拦截器自己的任务之后, 拦截器将调用 ActionInvocation 对象的 invoke 方法前进到 Action 处理流程的下一个环节。

(5)还可以调用 ActionInvocation 对象的 addPreResultListener 方法给 ActionInvocation 对象“挂”上一个或多个 PreResultListener 监听器. 该监听器对象可以在动作执行完毕之后, 开始执行动作结果之前做些事情。

(6)AbstractInterceptor 类实现了 Interceptor 接口. 并为 init, destroy 提供了一个空白的实现。

(7)Struts2自带的拦截器

    

    

 

三、自定义拦截器

1.编写拦截器

     需要实现Interceptor 接口,实现接口中的三个方法,但是Interceptor 接口有很多实现类,编写最简单的方式就是继承AbstractInterceptor类。

public class TestInterceptor extends AbstractInterceptor{

	@Override
	public String intercept(ActionInvocation invocation) throws Exception{

		System.out.println("拦截器执行1....");
		invocation.invoke();
		System.out.println("拦截器执行2....");
		return null;
	}
}

 

2.配置拦截器

     需要在struts.xml中进行拦截器的配置。

	<package name="user" extends="struts-default">

		<!-- 配置拦截器 -->
		<interceptors>
			<interceptor name="testInterceptor" class="com.kiwi.action.TestInterceptor"></interceptor>
		</interceptors>

		<action name="interceptAction" class="com.kiwi.action.InterceptorTestAction" method="save">

			<!-- 引用拦截器 -->
			<interceptor-ref name="testInterceptor"/>
			<!-- 引用默认的拦截器栈 -->
			<interceptor-ref name="defaultStack"/>

			<result name="success">/success.jsp</result>
		</action>

	</package>

注意:

(1)如果引用了自定义拦截器时,默认拦截器将不会起作用。

(2)默认拦截器在struts-default.xml中,配置了默认拦截器,当配置了默认拦截器以后,如果不引用拦截器,那么默认拦截器将起作用。

(3)当action的拦截器比较多时,可以将多个拦截器放入一个拦截器栈中。

	<package name="user" extends="struts-default">

		<!-- 配置拦截器 -->
		<interceptors>

			<interceptor name="testInterceptor" class="com.kiwi.action.TestInterceptor"></interceptor>

			<!-- 配置一个拦截器栈,可以包含多个拦截器的引用 -->
			<interceptor-stack name="myStack">
				<interceptor-ref name="testInterceptor"/>
				<interceptor-ref name="defaultStack"/>
			</interceptor-stack>

		</interceptors>

		<action name="interceptAction" class="com.kiwi.action.InterceptorTestAction" method="save">

			<!-- 引用拦截器栈 -->
			<interceptor-ref name="myStack"/>

			<result name="success">/success.jsp</result>

		</action>

	</package>
时间: 2024-10-28 21:30:04

Struts2基础学习(五)—拦截器的相关文章

Struts2基础学习总结(二)

Struts2基础学习总结(二)---struts.xml参数 1.常量 使用<constant name="" value=""></constant>元素进行描述 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Strut

Struts2基础学习总结

Struts2基础学习总结(一)---入门 Struts 2: Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互.Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大.Struts2以WebWork为核心,采用拦

【struts2】预定义拦截器

1)预定义拦截器 Struts2有默认的拦截器配置,也就是说,虽然我们没有主动去配置任何关于拦截器的东西,但是Struts2会使用默认引用的拦截器.由于Struts2的默认拦截器声明和引用都在这个Struts-default.xml里面,因此我们需要到这个文件的struts-default包里去看一下.定义如下: 1 <interceptors> 2 <interceptor name="alias" class="com.opensymphony.xwor

走进Struts2(二) — Struts2的基石(拦截器)

拦截器(Interceptor)是Struts2的基石,拦截器的主要作用是在Action执行之前和Result执行之后进行一些特定功能的处理机制. 如图,拦截器是用来负责在Action执行之前和Result执行之后处理一些功能的类.每个不同的拦截器,它们分别执行不同的功能处理,而运行的时机就是在Action执行之前和Result执行之后,需要注意的是在执行Action之前和Result之后,拦截器的执行顺序是正好相反的. 一.拦截器的好处 1.简化Action的实现,可以把很多功能从Action

【JAVA学习】拦截器与过滤器的区别

过滤器 它是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符 拦截器 它是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单

Struts框架学习之拦截器

为什么用拦截器? Struts是基于mvc模式的开发框架.任何框架,都会预先实现一部分功能.struts框架自带功能的实现,是通过一个个拦截器完成的. Struts早起版本中,核心功能是通过一个类完成的,这个类叫做核心过滤器. Struts2.0之后的版本,每一个拦截功能,都由一个单独的类实现,形成一个独立的拦截器,用户可以自由组合这些拦截器来完成自己想要的功能. 有了拦截器,我们的开发就类似于组装电脑配件.带来的好处:解耦. 拦截器简介: Struts2预定义了一些拦截器,实现了某些功能,如文

struts2(六)拦截器机制

拦截器简述 拦截器是一组动态拦截Action调用的对象.拦截器的处理代码可以定义在action执行前或者执行后.同时,拦截器能够拦截一个Action的执行.拦截器可以将一些通用功能封装成可重用形式以供一个Action或多个 Actions使用. 拦截器必须是无状态的,原因是Struts 2不能保证为每一个请求或者Action创建一个实例,所以如果拦截器带有状态,会引发并发问题.不要使用在API提供的ActionInvocation之外的任何东西. 在概念上,interceptors相近于Serv

Python基础学习五

Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出键值对. for key in dict: #迭代键 for val in dict.value(): #迭代值 for k,v in dict.items(): #迭代键值对 当迭代列表时,通过内置函数enumerate()可以迭代出索引加值. for i in list #迭代列表 for i

【Java EE 学习第69天】【struts2】【paramsPrepareParamsStack拦截器栈解决model对象和属性赋值冲突问题】

昨天有同学问我问题,他告诉我他的Action中的一个属性明明提供了get/set方法,但是在方法中却获取不到表单中传递过来的值.代码如下(简化后的代码) 1 public class UserAction implements modelDriven<User>(){ 2 private String name; 3 private User model; 4 public void setName(String name){ 5 this.name=name; 6 } 7 public St