`
xiaotao.2010
  • 浏览: 216707 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Interceptor的初步认识

阅读更多

一个名称 :

AOP(Aspect oriented programming) 面向切面编程

听着这个很神秘,其实不然 简单点说他就是个Interceptor (拦截器)


前两天刚刚学完了Filter(过滤器)被过滤器中的chain.doFilter() 一直搞的晕晕呼呼的,有人说执行了doFilter后返回到Action去,又有人说执行玩doFilter后返回下一个Filter中去,两个观点一直僵持不下。


今天了解了下Interceptor 其中的原理豁然开朗,Interceptor中也有类似doFilter的方法 叫做Invocation.invoke()方法,工作原来和doFilter很相似,暂时先把他们连个执行的原理归为一类。

先上一段代码,来解释Invocation.invoke()方法。

//Interceptor 中的代码
//部分来嘛省略,页面传递值的代码省略。。。

public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("Now in the Interceptor!");
		System.out.println("Interceptor startup before!");
		String s = invocation.invoke();
		System.out.println("Interceptor startup after!");
		String name = (String)invocation.getInvocationContext().getValueStack().findValue("name");
		System.out.println("In the Interceptor \t name= "+name);
		return s;
	}

 

//Action中的代码
public class TestAction extends ActionSupport{
	public String name,password;
	@Override
	public String execute() throws Exception {
		System.out.println("name:"+name+"\tpassword:"+password);
		return super.execute();
	}
}
  



来看看结果是什么,红色的标注是Action中执行的结果

==============================================================================
//Tomcat中的结果
Now in the Interceptor!

Interceptor startup before!

//突然发现Invocation.invoke()方法成为程序的分割线,程序跳入Action中了
//这一段是Action 中输出的值

name:1231123 password:14213


//好了,在此程序又回到了 interceptor

Interceptor startup after!
In the Interceptor name= 1231123

==============================================================================

好了,到此为止可能还是不明确这个Invocation.invoke()方法执行完成以后是去了Action还是去了哪里。但到此能确定的一点是,程序到Invocation.invoke()这个方法的时候去执行了另一个程序,等到另一个程序执行完成后又回到了这个interceptor。

再上一段代码。

在这做一点说明,以上的代码都不动,只是在FirstInterceptor后面在加上一个Interceptor名字叫做SecondInterceptor。
好了上代码

public class SecondInterceptor implements Interceptor{
	public void destroy() {
	
	}

	public void init() {
	
	}

	public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("**************************************");
		System.out.println("Now in the SecondInterceptor");
		System.out.println("SecondInterceptor startup before!");
		String s = invocation.invoke();
		System.out.println("SecondInterceptor startup after!");
		String password = (String)invocation.getInvocationContext().getValueStack().findString("password");
		System.out.println("SecondInterceptor ----  password:"+password);
		System.out.println("**************************************");
		return s;
	}
}



好了,我们再来看看结果。同样红色地方是Action输出的结果


==============================================================================


Now in the Interceptor!
Interceptor startup before!

**************************************
Now in the SecondInterceptor
SecondInterceptor startup before!

name:1231123 password:14213


SecondInterceptor startup after!
SecondInterceptor ----  password:14213
**************************************

Interceptor startup after!
In the Interceptor name= 1231123
==============================================================================

结果很有意思,这个不能画图说明问题,很头痛,现在蛮喜欢画图的,要是能画图问题能说明的很清楚。
用文字图来表示吧,尽量清楚点

(忍不下这个编辑器了,每次调好了又变乱了)
                                          request
                                                 |
   进入Action内部此处略去            |
                                    FirstInterceptor
   FirstInterceptor调用               |            输出:
   ActionInvocation中的              |               Now in the Interceptor!
   invoke()方法                           |               Interceptor startup before!
                                     SecondInterceptor
   SecondInterceptor调用          |            输出:
   ActionInvocation中的              |              Now in the SecondInterceptor
   invoke()方法                           |          SecondInterceptor startup before!
                                           Action
     执行execute()方法                |            输出:
                                                |              name:1231123 password:14213 
  (好了在此Interceptor             |
    原路返回)                 SecondInterceptor  
                                                |            输出:
                                                |       SecondInterceptor startup after!
                                                |       SecondInterceptor --assword:14213
                                         FirstInterceptor
                                                |             输出:
                                                |       Interceptor startup after!
                                                |       In the Interceptor name= 1231123
                                           response

   好了到此Interceptor执行完了,中间无关的步骤略去,在此就谈Interceptor工作流程。
从上很明显的可以看出Interceptor调用ActionInvocation中的invoke()方法 的时候,就进入了下一个Interceptor中执行,当下一个Interceptor调用ActionInvocation中的invoke()方法的时候,同样也会向下执行,直到Action之前的Interceptor全部执行完成,Action执行后,数据又会按照Interceptor进来的顺序原路返回。
   就在这一去一会的路上Interceptor能干很多事情,就对这个Action来说Interceptor完全起到了过滤的作用,可以这么说这个Interceptor就是这个Action的过滤器。
好了话题回到了过滤器上了,之前真论的chain.doFilter()有结果,两个的说法都正确,怎么说了,当只有一个Filter的时候执行chain.doFilter()确实将链条传递到了Action手上,Action得以执行,若不写这个chain.doFilter(),好了这个Filter就太自私了,将链条拿在自己手上,不向下传递,直接导致程序无法执行,程序始终处在等待执行的状态。
要是有多个Filter的时候呢,当一个Filter执行chain.doFilter()的时候是讲这个链条交向下一个Filter手中,直到交到Action手中。
   好了Filter和Interceptor的区别就出来了,Filter执行完以后它不会原路返回,而Interceptor调用ActionInvocation中的invoke()方法的时候就会向下执行,最终还会返回这个调用ActionInvocation中的invoke()方法的位置向下执行。
在Filter中一般chain.doFilter()是写在最后确定执行过滤后在执行chain.doFilter(),一去就不再回来了。

好了最后上一段配置文件,方便查看

<struts>
	<package name="user" namespace="/user" extends="struts-default">	
		<interceptors>
			<interceptor name="firstInterceptor" class="com.ibm.interceptor.FirstInterceptor"></interceptor>
			<interceptor name="secondInterceptor" class="com.ibm.interceptor.SecondInterceptor"></interceptor>
		</interceptors>	
		<action name="testAction" class="com.ibm.test.TestAction">
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<interceptor-ref name="firstInterceptor"></interceptor-ref>
			<interceptor-ref name="secondInterceptor"></interceptor-ref>
			<result name="success"> /test/success.jsp</result>
		</action>		
	</package>
</struts>













 

分享到:
评论

相关推荐

    struts2权威指南--前三章

    尽管只有前三章,但这已经涵盖了Struts2的基础架构和核心概念,足以让初学者建立起对框架的初步认识。学习这部分内容,你可以了解如何构建基本的Action,掌握Struts2的配置机制,理解请求处理流程,并能够实现简单的...

    struts2入门(一)

    Struts2是一个强大且成熟的Java Web框架,通过本文的介绍,你应该对Struts2有了初步的认识。实践是掌握技术的最好方式,动手创建一个Struts2应用,你会发现它的灵活性和易用性。在后续的学习中,深入研究源码和工具...

    struts入门(一)

    通过以上步骤,你可以对Struts有初步的认识。在深入学习的过程中,还可以探索Struts的拦截器、插件系统、自定义标签等功能,以及如何与其他技术(如Hibernate、Spring等)集成,提升你的Web开发技能。同时,不要忘记...

    struts入门最简单例子

    Struts2是一个强大的MVC...通过这个简单的案例,初学者可以对Struts2有初步的认识,为进一步学习和掌握Struts2的高级特性和最佳实践奠定基础。在实际开发中,你还可以探索更多的内容,如文件上传、国际化、异常处理等。

    三分钟教你学会struts

    本教程将帮助你快速掌握Struts的基础知识和高级技巧,让你在三分钟内对Struts有一个初步的认识。 **1. Struts框架概述** Struts是一个开源的、基于MVC(Model-View-Controller)设计模式的Web应用框架,它主要负责...

    传智168期JavaEE struts2杜宏 day 29~day31笔记.pdf

    标题中的“传智168期JavaEE struts2杜宏 ...通过这些知识点,学习者可以对Struts2有一个初步的认识,并且开始上手进行实际的框架应用开发。同时,对Struts2的结构和配置有了具体的了解,为后续深入学习打下良好的基础。

    1_Struts2入门与配置

    通过以上介绍,你应该对Struts2有了初步的认识。在深入学习和实践中,你将掌握更多关于Struts2的高级特性,如国际化、动态方法调用、自定义拦截器等,从而提升你的Java web开发能力。对于初学者,可以参考给定的博文...

    struts2入门小实例

    Struts2是一个强大的MVC(Model-View-...通过这个简单的Struts2入门实例,你可以对MVC模式和Struts2的工作原理有初步的认识。继续深入实践,你会发现Struts2是一个强大而灵活的工具,能帮助你高效地开发Java Web应用。

    开源框架 Spring Gossip

    认识 Spring 来认识 Spring 的一些特性,并初步了解一下什么叫作 IoC?什么叫作 DI? 简介 Spring Inversion of Control Dependency Injection &lt;br&gt; 核心容器 Spring 核心容器实作...

Global site tag (gtag.js) - Google Analytics