Struts Core Developers Guide-Framework Interceptor

Alias Interceptor
用于在ActionChain中的不同action之间传递参数,把相同的参数用不同的别名来命名
<param name="aliases">#{ 'foo' : 'bar' }</param>
foo参数的值将被赋予别名bar
Chaining Interceptor
该拦截器把所有value stack上的对象(除了那些实现了Unchainable接口的)拷贝到当前执行对象中(Action).可以定义includes和excludes分别指定需要或者不需要拷贝的参数,该拦截器一般和chain result结合使用.详细配置如下。
<action name="someAction" class="com.examples.SomeAction">
<interceptor-ref name="basicStack"/>
<result name="success" type="chain">otherAction</result>
</action>

<action name="otherAction" class="com.examples.OtherAction">
<interceptor-ref name="chain"/>
<interceptor-ref name="basicStack"/>
<result name="success">good_result.ftl</result>
</action>

Checkbox Interceptor
和hiddenfield一起解决checkbox在未选中情况下提交到服务器端时的数据丢失问题。
Cookie Interceptor
顾名思义用于把cookie的值注入到action中,从源代码中得到的规则如下
[list]
[*]如果cookieName存在*,并且cookieValue为空或者存在*,注入所有的cookie到action.
[*]如果cookieName为空,不获取和注入任何cookie,即使定义了CookieAware得到的cookiemap也是空的。
[*]如果cookieName不为空其不含有*,那么只注入于cookiename对应的cookie,并且注入前还会根据定义的cookieValue判断是否需要注入该cookiename对应的值。
[/list]
Conversion Error Interceptor
[list]
[*]要想利用该interceptor,action类必须实现ValidationAware接口
[*]把所有conversionErrors转化成对应action的fielderrors。
[*]保存用户提交上来的原始值,通过preresultlistener的处理还原到action的value stack中.
[/list]
Create Session Interceptor
[list]
[*]从源码上看除了ServletActionContext.getRequest().getSession(true);这句没有其它的功能了。
[/list]
DebuggingInterceptor
[list]
[*]显示action运行的调试信息有如下调试类型xml,console,command,browser.
[/list]
Execute and Wait Interceptor
[list]
[*]用于在后台处理处理需要很长执行时间的请求,用于防止http超时问题。
[*]拦截器必须放在最后
[*]该拦截器实际于session实现的。
[*]主要原理是先返回一个wait结果(如果action为定义wait结果,struts2会利用freemarker自动生成一个wait页面)给浏览器,然后启动一个后台线程单独处理action的请求,等待action请求处理完成后把结果返回给母线程。
[*]action对象会被推入stack的最顶层,使用stack.push方法.
[*]可以定义显示wait页面的延迟时间,如果查询请求并不需要很长时间的话,就不需要显示wait页面。
[/list]
Exception Interceptor
[list]
[*]主要的目的就是把exception转化成result,而不是大expcetion trace直接打印到页面上,一来提高系统的安全性,二来提高用户体验。
[*]当系统捕获异常,系统会利用ExceptionHolder把exception wrap一下推入statck以便resutl页面render的时候可以获取到对应的action的信息,或者直接输入trace。
[/list]
File Upload Interceptor
[list]
[*]基于MultiPartRequestWrapper,用于处理文件上传的请求
[*]获取所有页面上的file字段的文件,并且把这些字段转化设置到request的parameters中,并添加了contenttype和filename属性。对应的setter为fieldNameContentType,fieldNameFileName.
[/list]
I18n Interceptor
[list]
[*]设置于用户session相关的locale信息,并且保存该locale信息。
[*]处理流程为先从request_locale=en_US获取locale信息,然后从request的parameters中删除locale信息,并且保存到session中,并应用到所有的request中。
[/list]
Logger Interceptor
[list]
[*]记录action的start和stop信息,只有英文信息,不支持国际化。
[/list]
Message Store Interceptor
[list]
[*]主要功能是为了把action的message和error已经field error存储到session,以供后续的action获取这些信息。
[*]可以定义三种operationmode STORE,RETRIEVE,NONE.
[*]RETRIEVE主要通过合并集合和map的方式实现。
[/list]
Model Driven Interceptor
[list]
[*]操作其实很简单,就是调用实现的了ModelDriven接口的Action的getModel方法,然后把getModel返回的对象压栈。
[/list]
Scoped Model Driven Interceptor
[list]
[*]实现该接口的action可以根据scope的定义,直接从objectfactory中初始化对象,对象的标示由name属性决定。
[/list]
Parameters Interceptor
[list]
[*]主要功能是把parametermaps上的param利用OGNL表达式设置到相应stack的action中。
[*]还能设置拒绝设置某些恶意参数例如.,#=,等会影响OGNL执行的参数,已经用户通过实现ParameterNameAware接口定义acceptableParameterName中忽略的参数。
[*]例外还需要的功能包括CreatingNullObjects,DenyMethodExecution,ReportingConversionErrors。
[/list]
Prepare Interceptor
[list]
[*]action实现了Preparable接口
[*]调用prepare开头的方法。
[*]调用prepareDo开头的方法.
[*]如果alwaysinvokePrepare设置为true(默认),那名总会调用prepare方法.
[/list]
Scope Interceptor
[list]
[*]设计该拦截器的目的是为了利用session,application在多个action之间传递值,以实现类似wizard的导航功能。
[*]可以利用application或session或者同时利用两者传递值。
[*]如果利用session传递,则在传递过程中会为session加锁。
[*]如果action定义该拦截器的属性为start,那么session中对应的property的值会被设置成该action锁对应的属性的值。(sessionReset属性具有一样的效果)
[*]如果action定义该拦截器的属性为end,那么session中对应的properties会被移除。
[*]如果action中为定义任何start,end或者sessionReset属性,那么表示该action处于wizard的中间,action执行前会从session中导入所需要的property的值,action执行完后会把这些值导出到session中。
[*]该interceptor本身实现了PreResultListener接口并且在intercept之后添加自己到action执行完,result render前执行从action中到处property到session或者删除session中的property操作。
[/list]
Servlet Config Interceptor
[list]
[*]用于向实现了特定接口的action中注入和servlet有关的对象,action可以实现的对应接口如下
ServletContextAware,ServletRequestAware,ServletResponseAware,ParameterAware,RequestAware,SessionAware,ApplicationAware,PrincipalAware.
[/list]
Static Parameters Interceptor
[list]
[*]把struts.xml中定义的该interceptor的params pair注入对应的action中,并且如果action实现了Parameterizable接口该interceptor也会把该paramsmap通过该接口的setParams注入到对应的action中。
[/list]
Roles Interceptor
[list]
[*]通过该拦截器调用request的isUserInRole方法实现
[/list]
Timer Interceptor
[list]
[*]放回action中的方法执行的时间。
[/list]
Token Interceptor
[list]
[*]用于判断是否重复提交表单。在页面上和token一起使用。
[/list]
Token Session Interceptor
[list]
[*]用于判断是否重复提交表单。在页面上和token一起使用,Token Interceptor的改进版本,当token验证失败的时候会返回上次成功的action的执行结果。
[/list]
Validation Interceptor
[list]
[*]处理表单验证的拦截器,该拦截器一般配置于最后或者倒数第二个action,因为在该拦截器调用前所有的actionproperty需要准备好。
[*]该拦截器支持用户实现Validatable接口的validate方法或者validateXxx,validateDoXxx方法,规则和pareparable一致。
[*]拦截器支持exclude和includemethod方法的配置
[/list]
Workflow Interceptor
[list]
[*]该拦截器的也是为了验证,不过该action只调用那些实现了validatable或者ValidationAware接口的validateXxx,validate,validateDoXxx方法,并且判断是否有某个action,hasErrors()如果有直接打断action chain并且返回Input作为结果。
[*]但是实际代码感觉和文档描述的有点不一致,实际代码只检查实现了ValidationAware的action的hasError方法.
[/list]
Parameter Filter Interceptor
[list]
[*]用于过滤哪些参数不需要,那些参数需要注入到action中。
[*]defaultBlock默认为false如果设置成true只有allow列表中的开头的parameter才能注入到action,
[*]allow和block的方式都是以字符串开头为规则例如person会block,person.name等等的字段。但是如果allow中定义了person.address那么该parameter可以通过。
[/list]
Profiling Interceptor
[list]
[*]用于打开系统性能检测功能。
[/list]
MethodFilterInterceptor
[list]
[*]所有继承该interceptor的拦截器都可以通过定义excludeMethods ,includeMethods来过滤拦截器需要拦截的方法,文档中解释说includeMethods比较优先,但是从代码上看感觉应该是excludeMethods比较优先,代码如下

if (((excludeMethods.contains("*") && !includeMethods.contains("*"))
|| excludeMethods.contains(method))
&& !includeMethods.contains(method)) {
return false;
}
return includeMethods.size() == 0 || includeMethods.contains(method) || includeMethods.contains("*");

有空写个测试用例测试一下。
[/list]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值