热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Struts2学习笔记四:深入拦截器

一:拦截器的工作原理拦截器的执行过程可以类比filter过滤器,ActionInvocation实例执行过程中,先执行action实例上引

一:拦截器的工作原理

拦截器的执行过程可以类比filter过滤器,ActionInvocation实例执行过程中,先执行action实例上引用的拦截器们,然后才执行action实例处理请求,返回result,决定响应内容(注:此时还没进行响应!),然后倒序再执行一遍拦截器们,才通过response进行响应。

 

二:拦截器的使用

1:定义拦截器类

法一:实现Interceptor接口定义拦截器类

    实现接口需要重写三个方法,分别是初始化方法、销毁方法、拦截方法,一般我们只需重写拦截方法即可。

    参数ActionInvocation可以通过getXX()的方法获取action对象等。

 

法二:继承AbstractInterceptor类

    这AbstractInterceptor抽象类默认提供了init()/destroy()方法的空实现,所以我们只需重写intercep(ActionInvocation ai)方法即可,参数ActionInvocation可以通过getXX()的方法获取action对象等。

 

拦截器代码执行顺序:类比与filterchain上过滤器的执行顺序

class myinter extends AbstractInterceptor{ public String intercept(ActionInvocation invocation) throws Exception{before拦截:调用action前执行的代码;invocation.invoke();//执行下一个拦截器,如果没有,则执行action
after拦截:action执行完毕后,执行的拦截器代码,倒序执行完拦截器栈}
}

 

 

2:注册拦截器

在structs.xml中注册拦截器

<interceptors><interceptor name&#61;"定义拦截器在框架中的名字" class&#61;"拦截器类的完整路径"/>
interceptors>

 

3&#xff1a;引用拦截器

在配置action时&#xff0c;引用拦截器

<package name&#61;"default" extends&#61;"struts-default">//在一个package中注册、配置拦截器与action
<interceptors><interceptor name&#61;"inter" class&#61;".."/>//注册拦截器interceptors><action name&#61;"xxAction" class&#61;".."><interceptor-ref name&#61;"inter"/>//引用拦截器<result name&#61;"success"type&#61;"redirect">...jspresult>action>
package>

 

 

三&#xff1a;内建拦截器以及使用

Structs2自带了许多实用的拦截器&#xff0c;封装在“struts-defaust”包中。在配置package时&#xff0c;可以通过 extends&#61;“struts-defaust”引入这些内置拦截器。在此package下配置action时&#xff0c;如果没有为action引用自定义拦截器&#xff0c;则默认会引用struts-defaust包中的默认拦截器栈。但如果引用了自定义的拦截器&#xff0c;则需要显式引用默认拦截器栈&#xff0c;否则不生效

内建拦截器主要有&#xff1a;

alias &#xff08;别名拦截器&#xff09;&#xff1a;允许参数在跨越多个请求时使用不同别名&#xff0c;该拦截器可将多个Action采用不同名字链接起来&#xff0c;然后用于处理同一信息。 
autowiring &#xff08;自动装配拦截器&#xff09;&#xff1a;主要用于当Struts2和Spring整合时&#xff0c;Struts2可以使用自动装配的方式来访问Spring容器中的Bean。 
chain &#xff08;链拦截器&#xff09;&#xff1a;构建一个Action链&#xff0c;使当前Action可以访问前一个Action的属性&#xff0c;一般和一起使用。 
checkbox &#xff08;多选框拦截器&#xff09;&#xff1a;将没有选中的checkbox项设置为false&#xff0c;协助管理多选框。在HTTP请求里&#xff0c;那些没有被选中的项通常没有任何值。 
conversionError &#xff08;转换器错误拦截器&#xff09;&#xff1a;这是一个负责处理类型转换错误的拦截器&#xff0c;它负责将类型转换错误从ActionContext 中取出&#xff0c;并转换成Action的FieldError错误。 
createSession &#xff08;创建Session拦截器&#xff09;&#xff1a;该拦截器负责创建一个HttpSession对象&#xff0c;主要用于那些需要有HttpSession对象才能正常工作的拦截器中。 
clearSession (清除Session拦截器)&#xff1a;负责销毁HttpSession对象. 
debugging &#xff08;调试拦截器&#xff09;&#xff1a;当使用Struts2的开发模式时&#xff0c;这个拦截器会提供更多的调试信息。 
execAndWait &#xff08;执行和等待拦截器&#xff09;&#xff1a;后台执行Action时&#xff0c;给用户显示一个过渡性的等待页面。 
externalRef &#xff08;扩展拦截器&#xff09;&#xff1a;负责扩展引用 
exception &#xff08;异常拦截器&#xff09;&#xff1a;将Action抛出的异常映射到结果&#xff0c;这样就通过重定向自动处理异常。 
fileUpload &#xff08;文件上传拦截器&#xff09;&#xff1a;这个拦截器主要用于文件上传&#xff0c;它负责解析表单中文件域的内容&#xff0c;并把上传文件设置为action中的对应属性变量值。
i18n &#xff08;国际化拦截器&#xff09;&#xff1a;主要负责把用户所选的语言、区域放入用户Session中。 
logger &#xff08;日志拦截器&#xff09;&#xff1a;主要是输出Action的名字&#xff0c;提供简单的日志输出。 
modelDriven &#xff08;模型驱动拦截器&#xff09;&#xff1a;这是一个用于模型驱动的拦截器&#xff0c;当某个Action类实现了ModelDriven接口时&#xff0c;它负责把getModel ()方法的结果堆入ValueStack中。 
scopedModelDriven &#xff08;作用域模型驱动拦截器&#xff09;&#xff1a;如果一个Action实现了一个ScopedModelDriven接口&#xff0c;该拦截器负责从指定生存范围中找出指定的Model&#xff0c;并将通过setModel方法将该Model传给Action实例。 
params &#xff08;参数过滤拦截器&#xff09;&#xff1a;这是一个最基本的拦截器&#xff0c;它负责解析HTTP请求中的参数&#xff0c;并将参数值设置成Action对应的属性值。 
prepare &#xff08;预备拦截器&#xff09;&#xff1a;如果action实现了Preparable接口&#xff0c;将会调用该拦截器的prepare()方法。 
staticParams &#xff08;静态参数拦截器&#xff09;&#xff1a;这个拦截器负责将xml中标签下标签中的参数传入action。 
scope &#xff08;作用域拦截器&#xff09;&#xff1a;这是范围转换拦截器&#xff0c;它可以将Action状态信息保存到HttpSession范围&#xff0c;或者保存到ServletContext 范围内。 
servletConfig &#xff08;Servlet配置拦截器&#xff09;&#xff1a;如果某个Action需要直接访问Servlet API&#xff0c;就是通过这个拦截器实现的&#xff0c;它提供访问HttpServletRequest和HttpServletResponse的方法&#xff0c;以map方式访问。 
roles &#xff08;角色拦截器&#xff09;&#xff1a;这是一个JAAS&#xff08;Java Authentication and Authorization Service&#xff0c;Java授权和认证服务&#xff09;拦截器&#xff0c;只有当浏览者取得合适的授权后&#xff0c;才可以调用被该拦截器拦截的Action。 
timer &#xff08;计时拦截器&#xff09;&#xff1a;这个拦截器负责输出Action的执行时间&#xff0c;在分析该Action的性能瓶颈时比较有用。 
token &#xff08;令牌拦截器&#xff09;&#xff1a;这个拦截器主要用于阻止重复提交&#xff0c;它检查传到Action中的token&#xff0c;从而防止多次提交。 
tokenSession &#xff08;令牌会话拦截器&#xff09;&#xff1a;这个拦截器的作用与前一个基本类似&#xff0c;只是它把非法提交的数据保存在HttpSession中&#xff0c;不跳转到错误页面&#xff0c;再次生成与第一次相同的响应页面 
validation &#xff08;验证拦截器&#xff09;&#xff1a;通过执行在xxxAction-validation.xml中定义的校验器&#xff0c;从而完成数据校验。 
workflow &#xff08;工作流拦截器&#xff09;&#xff1a;这个拦截器负责调用Action类中的validate方法&#xff0c;如果校验失败&#xff0c;则不执行业务方法&#xff0c;而是返回input的逻辑视图。 
jsonValidation (json拦截器)&#xff1a;验证失败时&#xff0c;可以将fieldError和actionErrors信息序列化成json&#xff0c;返回给客户端 
profiling &#xff08;概要拦截器&#xff09;&#xff1a;允许Action记录简单的概要信息。 
actionMappingParams &#xff08;Action映射拦截器&#xff09;&#xff1a;Parameters set by the action mapping are not set/not available through ParameterAware  
annotationWorkflow &#xff08;注解工作流拦截器&#xff09;&#xff1a;利用注解替代XML配置&#xff0c;使用annotationWorkflow拦截器可以使用&#64;After、&#64;Before、&#64;BeforeResult等注解&#xff0c;执行流程为before-execute-beforeResult-after顺序 

store &#xff08;消息存储拦截器&#xff09;&#xff1a;在会话中为Action存储和检索消息、字段错误以及Action错误&#xff0c;该拦截器要求Action实现ValidationAware接口。

 

引用内建拦截器&#xff1a;

<package name&#61;"mypackage" extends&#61;"struts-default">//继承默认包
<interceptors>
<interceptor name&#61;"myinterceptor" class&#61;"com.test.interceptors.myinterceptor">
<interceptors><action name&#61;"myaction"><result>/success.jspresult><result>/error.jspresult>
<interceptor-ref name&#61;"myinterceptor" />
<interceptor-ref name&#61;"defaultStack" />
action>package>

 

四&#xff1a;拦截器栈&#xff1a;模块化管理拦截器

当拦截器比较多的时候&#xff0c;如果某一些拦截器被多个action引用&#xff0c;那么在多个action配置时逐个引用&#xff0c;会造成大量重复内容。这时&#xff0c;我们可以配置拦截器栈&#xff0c;把某一类被多个action公用的拦截器放到一个拦截器栈中&#xff0c;然后action引用拦截器栈即可。

<interceptors><interceptor name&#61;"inter1" class&#61;"路径" /> <interceptor name&#61;"inter.." class&#61;"路径" /> //注册拦截器<interceptor-stack name&#61;"XX_Stack">//定义拦截器栈&#xff0c;在action中通过拦截器栈名进行引用<interceptor-ref name&#61;"inter.." />//引用拦截器<interceptor-ref name&#61;"defaultStack" />//自定义的拦截器栈一般都要引用默认拦截器栈interceptor-stack>
interceptors>

 



推荐阅读
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • 本文整理了Java中org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc.getTypeInfo()方法的一些代码示例,展 ... [详细]
  • java线条处理技术_Java使用GUI绘制线条的示例
    在Java的GUI编程中,如何使用GUI绘制线条?以下示例演示了如何使用Graphics2D类的Line2D对象的draw()方法作为参数来绘制一条线。 ... [详细]
  • 注:根据Qt小神童的视频教程改编概论:利用最新的Qt5.1.1在windows下开发的一个小的时钟程序,有指针与表盘。1.Qtforwindows开发环境最新的Qt已经集 ... [详细]
  • Thisissuewasoriginallyopenedbyashashicorp/terraform#5664.Itwasmigratedhe ... [详细]
author-avatar
Shirley韻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有