




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课题名称Struts2的拦截器教学目标了解拦截器的基础知识、掌握拦截器与过滤器的区别;理解拦截器的工作原理;掌握拦截器的配置与使用。重点、难点及解决方法难点:拦截器与过滤器的区别及拦截器的工作原理重点:拦截器的工作原理及拦截器的创建与配置教学基本内容与教学设计3.1 拦截器简介3.2 拦截器的工作原理3.3 拦截器与过滤器的区别3.4 Struts2内置拦截器3.5 拦截器的配置与使用3.5.1 配置拦截器3.5.2 配置拦截器栈3.5.3 配置默认拦截器3.5.4 使用拦截器3.5.5 使用内置拦截器 alias拦截器的使用 prepare拦截器的使用 timer拦截器的使用3.6 小结教学
2、方法上机实践教学手段实际操作与讲授相结合 课外学习安排作业: 复习本节课讲过的知识,自己编写自定义拦截器并配置使用。课外学习指导安排网上答疑、网络课程中上传课程相关资料,包括教案,讲稿、课堂演示代码及上课视频等。Struts2的拦截器备注3.1拦截器简介:拦截器(Interceptor)是Struts2的核心组成部分。很多功能都是构建在拦截器基础之上的,例如文件的上传和下载、国际化、转换器和数据校验等,Struts2利用内建的拦截器,完成了框架内的大部分操作。在Struts2文档中对拦截器的解释为“拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块,这
3、个模块可以在Action执行之前或者之后运行,也可以在一个Action执行之前阻止Action执行。同时也提供了一种可以提取Action中可重用的部分的方式”。拦截器是Struts2 更高层次的解耦,无须侵入框架本身便可以添加新的功能。拦截器是AOP( Aspect-Oriented Programming)面向切面编程的一种实现,底层通过动态代理模式完成。通过这种方式可以把多个Action中都需要重复指定的代码提取出来,统一放在拦截器里进行定义,从而提供了更好的代码可重用性。3.2 拦截器的工作原理3.2.1 Struts2的核心组件: StrutsPrepareAndExecuteFilt
4、er :Struts2的核心过滤器; ActionMapper:Action映射器; ActionProxy:Action代理,Action代理通过Configuration Manager在struts.xml配置文件中搜索被请求的Action类; ActionInvocation:这里需要指出的是一个很重要的方法invocation.invoke()。这是ActionInvocation中的方法,而 ActionInvocation是Action调度者,所以这个方法具备以下2层含义:1. 如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈
5、中下一个Interceptor的执行。2. 如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。 Interceptor:拦截器。3.2.2 拦截器的工作过程:1、用户浏览器向Web服务器发送HttpServletRequest请求;2、这个请求经过一系列的过滤器(Filter)的过滤并传递给核心控制器FilterDispatcher。3、接着FilterDiapatcher会调用ActionMapper将用户请求转发到对应的业务逻辑控制器,此业务逻辑控制器并不是用户实现的业务控制器,而是Struts2创建的Action代理ActionProx
6、y.用户实现的Action类仅仅是Struts2的ActionProxy的代理目标; 4、如果ActionMapper决定需要调用某个Action, 核心控制器会把请求的处理交给 ActionProxy;5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类;6、ActionProxy创建一个ActionInvocation的实例。7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。8、一旦Action执行完毕,ActionInvocation
7、负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。3.3 拦截器与过滤器的区别l 拦截器是基于java的反射机制的,而过滤器是基于函数回调。l 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。l 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。l 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。l 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在
8、容器初始化时被调用一次3.4 Struts2内置拦截器Struts2内建了大量的拦截器,这些拦截器以name-class对的形式配置在struts-default.xml文件中,其中name是拦截器的名字,就是以后使用该拦截器的唯一标识; class则指定了该拦截器的实现类,如果我们定义的package继承了Struts2的struts-default包,则可以自由使用下面定义的拦截器,否则必须自己定义这些拦截器。3.5 拦截器的配置与使用3.5.1 配置拦截器拦截器与拦截器栈都是在在struts.xml中完成的,定义一个拦截器使用标签,其格式如下:这种情况的应用非常广。有的时候,如果需要在配
9、置拦截器时就为其传入拦截器参数,只要在与之间配 置标签即可传入相应的参数。其格式如下:参数值./如果需要传入多个参数,可以一并设置如果在其他的拦截器配置中出现了同名的参数,则前面配置的参数将被覆盖掉。在struts.xml中可以配置多个拦截器,它们被包含在 和 标签之间,例如下面的配置:.3.5.2 配置拦截器栈当开发过程中需要定义多个拦截器时,可以将它们定义为一个拦截器栈。当一个拦截器栈被附加到一个Action上面时,在执行该Action之前,必须先执行拦截器栈中的每一个拦截器。使用拦截器栈不仅可以确定多个拦截器的执行顺序(拦截器栈中各个拦截器是按照其定义的顺序来执行的),同时把相关的拦截器
10、放在同一个栈中,管理起来也更为方便。定义拦截器栈需要用到标签,该标签内包含了一系列子标签,这些子标签用来定义拦截器中包含的多个拦截器引用。,如以下代码所示:上面的代码中定义了两个拦截器和一个拦截器栈,该拦截器栈中又引用了已定义的两个拦截器。事实上可以把一个拦截器栈看成一个更大的拦截器,因为本质上拦截器栈和拦截器都是在Action调用方法之前被执行的。另外,在拦截器栈中也可以引用另一个拦截器栈。3.5.3 默认拦截器如果想对一个包下的多个Action都使用相同的拦截器,则要为该包中每个Action都重得指定同一个拦截器,这样显然过于麻烦。解决这个问题的方法就是使用默认拦截器。默认拦截器是指在一个
11、包下定义的拦截器,该拦截器对包下所有的Action都起作用。一旦为某个包指定了默认拦截器且该包中的Action未显示地指定拦截器,则该默认拦截器会起作用。反之,若该包中的Action显示指定了某个拦截器,则该默认拦截器被屏蔽。若想使用该默认拦截器,则需要用户手动配置该默认拦截器的引用。每个包只能指定一个默认拦截器,如果确实需要将多个拦截器共同作为默认拦截器,可以将这些拦截器定义为一个拦截器栈。login.jsp实际上拦截器类是定义在一个特殊的配置文件中的,这个配置文件就是struts-default.xml.当自定包继承了struts-default默认包后,它不仅继承了其内置的各个拦截器,而
12、且还继承了其默认拦截器栈。也就是说对于继承了struts-default包的某个自定义包下的所有Action,struts-default包的默认拦截器栈会作用于所有这些Action.下面所示代码为struts-default.xml文件中struts-default包下的默认拦截器栈配置:在此指定了defaultStack为struts-default包的默认拦截器。Struts-default包的默认拦截器栈defaultStack中包含了exception,alias等一系列拦截器,这些拦截器能够满足开发都所需要的大部分要求。我们需要注意它们的执行顺序与它们在struts-default
13、.xml文件中的声明顺序有关,先声明先执行。3.5.4 使用拦截器在配置好了拦截器或拦截器栈后,就需要使用拦截器了。也就是使用这些已经定义好的拦截器或拦截器栈来拦截Action了。拦截器或拦截器栈会先拦截并处理用户请求,然后再执行Action的execute方法。使用拦截器时需要在Action中进行配置。通过标签来指定在Action中使用的拦截器。下面是在Action中使用拦截器的示例。paramValue1login.jspparamValue1可以看到,在Action中使用某个拦截器时,只需在struts.xml文件中配置Action时指定标签的name属性即可。需要注意的是,在使用拦截器
14、时候也可以使用参数,但是此时使用的参数将会覆盖定义拦截器时使用的参数。定义拦截器时的参数是默认参数。使用拦截器时所使用的参数将会覆盖默认参数。3.5.5 使用struts2内置拦截器 内置拦截器alias拦截器的使用该拦截器的作用是给参数起一个别名,当Action链中需要用到同一个HTTP请求的参数值时,该拦截器可以主这些Action的不同属性名共享同一个参数值,实现了Action之间的传值。使用alias拦截器时需要在struts.xml文件 中的标签下添加param元素,并将该元素的name属性指定为aliases,然后将其值指定为一个map类型的OGNL表达式。具体代码如下:#name1
15、:value1, name2:value2例如:#firstCountry:secondCountry在调用包含上面代码的action时Struts2框架会将Action链中当前的Action的前一个Action的firstCountry属性的值取出,赋值给当前Action的secondCountry属性。这样就完成了Action之间的传值。例3-1:项目AliasInterceptorDemo,alias拦截器的使用。创建项目AliasInterceptorDemo,首先进行struts2的基本配置,即导入jar包和配置核心控制器。然后创建两个Action,分别为FirstAliasActi
16、on和SecondAliasAction.在上面的工程中配置了两个Action,第一个Action结果类型为chain,指向第二个Action。而第二个Action中配置了param元素,该元素指定了拦截器Alias的map参数,表明secondCountry是firstCountry的别名。因此当调用名为firstaliasaction的Action时,传入的firstCountry参数值首先会设置Action的属性firstCountry,然后在调用名为secondaliasaction的Action时设计Action的属性值secondCountry. 内置拦截器prepare的使用该拦
17、截器用来调用实现了preparable接口的Action中的prepare()方法。如果一个Action实现了Preparable接口,则prepare拦截器会在执行execute()方法之前执行prepare()方法。因此如果希望在execute()方法执行前先加入一些其他的逻辑,prepare拦截器就非常有用了。此时可以在Action中实现Preparable接口,并重写prepare()方法。下面创建一个PrepareInterceptorDemo工程来介绍prepare拦截器:例3-2:PrepareInterceptorDemo拦截器的使用(1) 在MyEclipse中创建一个Jav
18、aWeb项目PrepareInterceptorDemo,将Struts2框架所需的支持库添加到WEB-INF目录下的lib文件夹中,然后在web.xml文件中配置核心过滤器。web.xml程序的代码如下:(2) 在SRC目录下创建包com.action,在该包下创建PrepareAction.java动作类,并实现Preparable接口.(3) 在src目录下创建struts.xml文件,并进行配置。(4) 在WebContent目录下创建index.jsp文件.(5) 在WebContent目录下创建success.jsp文件.(6) 运行程序.在上面的工程中,PrepareAction
19、的Action类实现了Preparable接口,并重写了prepare方法,prepare拦截器将会首先调用其prepare方法。因为prepare拦截器是default-stack拦截器栈中的拦截器,所在在struts.xml中没有为PrepareAction配置拦截器。而prepare拦截器也会正确的使用。3.6 自定义拦截器的创建配置与使用3.6.1 自定义拦截器的创建利用Struts2内置拦截器可以实现用户大部分的功能,但同时Struts2还赋予了我们创建自定义拦截器的能力,而且在Struts2中自定义拦截器是非常简单的一项工作。自定义拦截器的创建方法常见的有实现Interceptor
20、接口创建和继承AbstractInterceptor类实现 (1)、实现Interceptor接口创建用户在定义自己的拦截器类时,需要实现com.opensymphony.xwork2. interceptor.Interceptor接口。可以说所有Struts2的拦截器都直接或间接地实现了该接口。该接口的源码如下:public interface Interceptor extends Serializablevoid init();void destroy();String intercept (ActionInvocation invocation) throws Exception;通
21、过以上代码可以看到,该接口中有如下三种方法,前两个方法分别用于初始化和清除必要的的资源。而真正的业务逻辑是在intercept方法中完成的。这三个方法都只给出声明而未进行定义,因此,直接实现该接口的类必须实现这三个方法。它们的作用说明如下:init():该方法在拦截器被实例化之后、拦截器执行之前调用。该方法只被执行一次,主要用于初始化资源。destroy():该方法与init()方法对应,拦截器实例被销毁之前调用。用于销毁在init()方法中打开的资源。intercept(ActionInvocation invocation):该方法是拦截器的核心方法,用来添加真正执行拦截器工作的代码,实现
22、具体拦截的操作。它返回一个字符串作为逻辑视图,系统根据返回的字符串跳转到对应的视图资源。该方法有个参数ActionInvocation,该参数包含了被拦截的Action的引用,可能通过该参数的invoke()方法,将控制权交给下一个拦截器, 或者交给Action类的execute()方法。 (2)、继承AbstractInterceptor类实现除了Interceptor接口之外,Struts 2框架还提供了 AbstractInterceptor类,该类实现了Interceptor接口,并提供了 init()方法和destroy()方法的空实现。在一般的拦截器实现中, 都会继承该类,因为一般
23、实现的拦截器是不需要打开资源的, 故无须实现这两种方法,继承该类会更简洁。该类的代码实现为:public interface AbstractInterceptor implements Interceptorpublic void init()public void destroy()public abstract String intercept(ActionInvocation invocation) throws Exception;下面所示的两段代码分别使用了实现Interceptor接口和继承AbstractInterceptor类的方式来定义拦截器,这两段代码是可替换的,它们都实
24、现了同一个拦截器。(1)实现Interceptor接口(2)继承AbstractInterceptor抽象类3.6.2 自定义拦截器的配置掌握了自定义拦截器的创建方法后,需要对自定义拦截器进行配置。配置的方法与前面介绍的方法是一致的。只需要在标签的class属性中指定自定义拦截器类就可以了。例如我们为上面自己编写的拦截器进行配置。 上面的代码配置了一个名为mylogger的拦截器,其实现通过MyLoggerInterceptor拦截器来完成。在定义拦截器后就可以配置其使用了。其配置使用方法与内置拦截器的配置方法相同。3.6.3 拦截器的执行顺序Struts2的拦截器机制采用了动作链的方式来嵌套
25、调用拦截器,并将动作调用链封装在实现ActionInvocation接口的类中。每一个拦截器方法都有一个ActionInvocation类型的参数,而在ActionInvocation接口中包含了一个invoke()方法,当在某一个拦截器方法中调用invoke()方法时,就会调用下一个拦截器方法,如此嵌套调用下去。如果当前拦截器是最后一个拦截器,则会调用Action的execute()方法。Action执行完成后,按照原来相反的顺序返回执行拦截器中的剩余代码,即最后一个拦截器继续执行其剩余代码,然后返回倒数第二个拦截器继续执行其剩余代码,直至返回到第一个拦截器,最后才回到结果视图。而invok
26、e方法的作用是判断是否还有下一个拦截器,若有,则调用下一个拦截器,否则,直接跳到Action的execute()方法执行。下面通过一个实例来说明拦截器和Action的执行顺序。例:3-3在MyEclipse中创建项目OrderOfInterceptorDemo。添加struts2项目所需要的jar包,并在web.xml中配置struts2核心过滤器。在src目录下创建包com.action,在该包下创建FirstAction.java文件,其代码内容如下:在该包下创建SecondAction.java,其内容如下:在src目录下创建包erceptor,在此包下创建FirstInt
27、erceptor.java, SecondInterceptor.java 和 ThirdInterceptor.java此三个文件的代码如下:在src目录下创建struts2的配置文件struts.xml,在这个文件中对Action和拦截器进行配置.在webroot下创建index.jsp文件.在webroot下创建结果视图页面success.jsp页面.在此项目中三个拦截器被配置为一个拦截器栈,由控制台的信息可以清楚的看出拦截器栈中每个拦截器执行的顺序。由于每个拦截器都会调用invocation.invoke()方法,这就会导致每个拦截器都会分为两个时段来执行自己的代码。3.7 方法过滤拦
28、截器Action中的拦截器默认情况下都是针对Action中的所有方法进行拦截的。但是在开发过程中可能会出现只需要拦截Action中某个方法的需求。Struts2框架为这种需求提供了解决方案-方法过滤。 3.7.1 方法过滤拦截器的定义Struts2提供了一个抽象类MethodFilterInterceptor,这个类是抽象类AbstractInterceptor的子类。我们需要自定义拦截器实现方法过滤,只需要继承MethodFilterInterceptor这个抽象类即可。这个抽象类定义了一个doInterceptor()方法。该方法类似于AbstractInterceptor类中的intercept()方法,用于实现拦截器真正的拦截逻辑。 下面我们举个例子来说明如何自定义方法过滤拦截器,代码如下:此处定义了一个方法过滤拦截器名字为MyMethodFilterInterceptor,这个拦截器中的业务方法为doIntercept(ActionInvocation invocation).方法过滤拦截器定义好了之后,在使用之前要对其进行配置。3.7.2 配置方法过滤拦截器方法过滤拦截
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化学实验室质量控制与实验误差分析考核试卷
- 种子种苗抗逆性研究与利用考核试卷
- 管道工程国际合作案例分析考核试卷
- 物业六月份工作计划(4篇)
- 经济社会效益分析考核试卷
- 2025少先队员演讲稿(15篇)
- 维修车辆承包简单合同(16篇)
- 手机营销活动策划方案(9篇)
- 工程科年度工作总结(10篇)
- 游览西湖风光心得感想(5篇)
- 虹桥商务区核心区一期及南北片区集中供能专项规划
- 六年级数学上册第二单元《位置与方向》测试题-人教版(含答案)
- 2024年云南省职业技能大赛(健康照护赛项)理论参考试题库(含答案)
- 专题11二次函数中矩形存在性综合应用(专项训练)(原卷版+解析)
- 广东省医疗服务价格项目及价格
- 泼水节文化介绍课件
- 第3课我爱我家教学课件2021-2022学年赣美版美术八年级下册
- 2024年江苏省泰州市泰兴市中考一模物理试卷(含答案解析)
- 培训机构学校:教师管理手册
- HG∕T 4335.3-2012 酸类物质泄漏的处理处置方法 第3部分:硝酸
- GB/T 44260-2024虚拟电厂资源配置与评估技术规范
评论
0/150
提交评论