1、Struts2中的拦截器教学示例及课后练习参考资料有关拦截器技术的一些概念1、为什么要应用拦截器拦截器就是一种AOP的实现方式,传统的JSP&Servlet架构中,客户端发送一个请求,服务器端生成一个request对象,并执行相应的doGet()或者doPst()方法,最后由response返回一个响应到客户端,整个服务过程就结束了。所以所有的业务逻辑功能只能在doGet ()或者doPst()方法中调用,这样整个业务就写死了,如果想增加新的功能,只能修改doGet ()或者doPst()方法,不符合开闭原则(OCP)。2、Struts 2框架中的默认拦截器在Struts2中每发送一个请求都要
2、经过好几层的拦截器最终才到达所调用的action。由多个拦截器组成的就是一个intercptor-stack,如果扩展了struts-default就默认集成了defaultstack。里面包含了许多常用的拦截器,比如文件上传时会用到fileUpload,要调出session对象由servletConfig来做。 因为defaultstack里的拦截器,默认已经配好了,所以无需要专门对这些拦截器进行配置。3、Struts 2框架中的各种形式的拦截器的主要作用拦截器名字说明Alias Interceptoralias在不同请求之间将请求参数在不同名字件转换,请求内容不变Chaining Inte
3、rceptorchain让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。Checkbox Interceptorcheckbox添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。Cookies Interceptorcookies使用配置的name,value来是指cookiesConversion Error InterceptorconversionError将错误从ActionContext中添加到Action的属性字段中。Create Se
4、ssion InterceptorcreateSession自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。Debugging Interceptordebugging提供不同的调试用的页面来展现内部的数据状况。Execute and Wait InterceptorexecAndWait在后台执行Action,同时将用户带到一个中间的等待页面。Exception Interceptorexception将异常定位到一个画面File Upload InterceptorfileUpload提供文件上传功能I18n Interceptori18n记录用户选择
5、的localeLogger Interceptorlogger输出Action的名字Message Store Interceptorstore存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。Model Driven Interceptormodel-driven如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。Scoped Model Drivenscoped-model-driven如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用
6、Action的setModel方法将其放入Action内部。Parameters Interceptorparams将请求中的参数设置到Action中去。Prepare Interceptorprepare如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。Scope Interceptorscope将Action状态存入session和application的简单方法。Servlet Config InterceptorservletConfig提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访
7、问。Static Parameters InterceptorstaticParams从struts.xml文件中将中的中的内容设置到对应的Action中。Roles Interceptorroles确定用户是否具有JAAS指定的Role,否则不予执行。Timer Interceptortimer输出Action执行的时间Token Interceptortoken通过Token来避免双击Token Session InterceptortokenSession和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中Validation Interceptor
8、validation使用action-validation.xml文件中定义的内容校验提交的数据。Workflow Interceptorworkflow调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面Parameter Filter InterceptorN/A从参数列表中删除不必要的参数Profiling Interceptorprofiling通过参数激活profileWebWork提供的拦截器介绍1、自动为Action设置Http请求数据的拦截器(Parameters Interceptor)。这个拦截器非常方便实用,但完全自动组装对象数据,很可能会带来
9、安全问题。如果Action不需要设置数据,那么这个Action只要实现com.opensymphony.xwork.interceptor.NoParameters接口即可。如果是Action中部分数据需要自动设置,部分数据不允许设置,这样可以实现接口com.opensymphony.xwork.interceptor.ParameterNameAware,可以在这个接口的acceptableParameterName(String parameterName)方法中,定义我们可以接受哪些方法,如果允许只要让这个方法返回True就可以了。2、过虑参数功能的拦截器(Parameter Filte
10、r Interceptor)。它可以全局阻止非法或不允许Action访问的参数。可以很好的和上面的组装参数的拦截器一起使用。3、为Action设置静态数据的拦截器(Static Parameters Interceptor)。它可以将Action定义的静态参数,设置到Action中。4、数据验证拦截器(Validation Interceptor)。定义之后,会调用验证文件或实现验证接口com.opensymphony.xwork.Validateable的所有验证。5、验证流程处理拦截器(Workflow Interceptor)。它和上面的拦截器一起使用,处理验证的流程。如果验证通过则继续
11、前进,如果发现有验证错误消息,直接转到Action中定义的输入结果(input)页面。6、类型转换错误处理拦截器()。它首先去取得类型转换的错误消息(主要是由设置Http请求参数的拦截器产生),如果取到错误消息,它会将错误消息传递给实现接口com.opensymphony.xwork.ValidationAware的Action,这样我们可以将这些错误消息暴露到页面中。7、Action链拦截器(Chaining Interceptor)。它是用来拷贝前一个Action的属性数据到当前Action中。它要求前一个Action必须是chain Result(),这样才能进行Action的数据拷贝。
12、8、防止页面重复提交(或页面重复刷新)拦截器。Token Interceptor和Token Session Interceptor都是防止重复提交的拦截器。不同点是后者在Session存贮了最近一次请求的结果数据。9、文件上传的拦截器(File Upload Interceptor)。实现文件上传的功能。如果有人曾经手工写过文件上传程序,那一定会惊叹于这个拦截器。我们可以在这个拦截器中设定上传文件的大小和类型限制。记得需要第三方的文件上传库的支持,只要在webwork.properties中配置过,并拷贝相应的jar包就可以了。10、进度条等待拦截器(Execute and Wait Int
13、erceptor)。当Action的执行需要很长实际的时候,我们可以使用这个进度条等待的拦截器。它会将Action放到后台执行,而在前端显示进度条或等待消息提示的页面。应用Struts2中的拦截器技术-自定义拦截器组件、并且了解拦截器组件的工作机制1、添加一个拦截器组件类名称为AuthorizedUserInterceptor、包名称为com.px1987.sshwebcrm.interceptor、并且从com.opensymphony.xwork2.interceptor.AbstractInterceptor基类进行继承。2、编程该拦截器组件Struts2截获Action请求,在Acti
14、on执行之前或之后调用拦截器方法。这样,可以用插拔的方式将功能注入到Action中。WebWork框架的很多功能都是以拦截器的形式提供出来。例如:参数组装,验证,国际化,文件上传等等。package com.px1987.sshwebcrm.interceptor;import java.util.Map;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractIntercept
15、or;import com.px1987.sshwebcrm.actionform.UserInfoActionForm;public class AuthorizedUserInterceptor extends AbstractInterceptor public AuthorizedUserInterceptor() Override public String intercept(ActionInvocation oneActionInvocation) throws Exception /前置效果(在被拦截的目标Action类中的方法执行之前执行) System.out.printl
16、n(在第一个拦截器中的前置拦截代码已经被执行!); String returnResult=oneActionInvocation.invoke();System.out.println(原来的Action类中的目标方法已经被执行!)/后置效果(在被拦截的目标Action类中的方法执行以后再执行) System.out.println(在第一个拦截器中的后置拦截代码已经被执行!结果为:+returnResult); return returnResult; 3、在struts.xml文件中配置和定义出该拦截器组件 /userManage/loginSuccess.jsp /userManage
17、/loginSuccess.jsp /userManage/loginSuccess.jsp /userManage/loginSuccess.jsp /userManage/loginSuccess.jsp !- /userManage/1.jsp - /userManage/loginSuccess.jsp 这是在struts.xml文件中为某个Action提供“注入的属性”值 注意:上面的各个标签的前后顺序要满足DTD中的要求,否则将会出现下面的错误。4、测试该拦截器组件的效果不能在单元测试中执行,必须通过浏览器执行http:/192.168.1.66:8080/sshwebcrm/us
18、erManage/modelUserLogin.jsp 注意:一定要引用系统中的默认的拦截器(),否则表单提交后将无法正常地获得参数。让我们再来回顾一下之前我们曾经用过的一张Action LifeCycle的图:图中,我们可以发现,Struts2的Interceptor一层一层,把Action包裹在最里面。这样的结构,大概有以下一些特点:1. 整个结构就如同一个堆栈,除了Action以外,堆栈中的其他元素是Interceptor2. Action位于堆栈的底部。由于堆栈先进后出的特性,如果我们试图把Action拿出来执行,我们必须首先把位于Action上端的Interceptor拿出来执行。这
19、样,整个执行就形成了一个递归调用3. 每个位于堆栈中的Interceptor,除了需要完成它自身的逻辑,还需要完成一个特殊的执行职责。这个执行职责有3种选择:1) 中止整个执行,直接返回一个字符串作为resultCode2) 通过递归调用负责调用堆栈中下一个Interceptor的执行3) 如果在堆栈内已经不存在任何的Interceptor,调用ActionStruts2的拦截器结构的设计,实际上是一个典型的责任链模式的应用。首先将整个执行划分成若干相同类型的元素,每个元素具备不同的逻辑责任,并将他们纳入到一个链式的数据结构中(我们可以把堆栈结构也看作是一个递归的链式结构),而每个元素又有责任
20、负责链式结构中下一个元素的执行调用。这样的设计,从代码重构的角度来看,实际上是将一个复杂的系统,分而治之,从而使得每个部分的逻辑能够高度重用并具备高度可扩展性。所以,Interceptor结构实在是Struts2/Xwork设计中的精华之笔。体验拦截器链的实现效果1、再增加一个拦截器组件类名称为LogInfoInterceptor、包名称为com.px1987.sshwebcrm.interceptor2、编程该拦截器组件package com.px1987.sshwebcrm.interceptor;import com.opensymphony.xwork2.ActionInvocatio
21、n;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class LogInfoInterceptor extends AbstractInterceptor public LogInfoInterceptor() Override public String intercept(ActionInvocation actionInvocation) throws Exception /前置效果(在被拦截的目标Action类中的方法执行之前执行) System.out.println(在第二个拦截器中的前置
22、拦截代码已经被执行!); String returnResult=actionInvocation.invoke(); System.out.println(在第二个拦截器中的原来的Action类中的目标方法已经被执行!); /后置效果(在被拦截的目标Action类中的方法执行以后再执行) System.out.println(在第二个拦截器中的后置拦截代码已经被执行!结果为:+returnResult); return returnResult; 3、定义和引用该拦截器 /userManage/loginSuccess.jsp /userManage/loginSuccess.jsp interceptor-ref name =defaultSt
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1