`
myoldman
  • 浏览: 84888 次
  • 性别: Icon_minigender_1
  • 来自: 福建福州
最近访客 更多访客>>
社区版块
存档分类
最新评论

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中,从源代码中得到的规则如下
 
  • 如果cookieName存在*,并且cookieValue为空或者存在*,注入所有的cookie到action.
  • 如果cookieName为空,不获取和注入任何cookie,即使定义了CookieAware得到的cookiemap也是空的。
  • 如果cookieName不为空其不含有*,那么只注入于cookiename对应的cookie,并且注入前还会根据定义的cookieValue判断是否需要注入该cookiename对应的值。

Conversion Error Interceptor
 
  • 要想利用该interceptor,action类必须实现ValidationAware接口
  • 把所有conversionErrors转化成对应action的fielderrors。
  • 保存用户提交上来的原始值,通过preresultlistener的处理还原到action的value stack中.

Create Session Interceptor
  • 从源码上看除了ServletActionContext.getRequest().getSession(true);这句没有其它的功能了。

DebuggingInterceptor
  • 显示action运行的调试信息有如下调试类型xml,console,command,browser.

Execute and Wait Interceptor
  • 用于在后台处理处理需要很长执行时间的请求,用于防止http超时问题。
  • 拦截器必须放在最后
  • 该拦截器实际于session实现的。
  • 主要原理是先返回一个wait结果(如果action为定义wait结果,struts2会利用freemarker自动生成一个wait页面)给浏览器,然后启动一个后台线程单独处理action的请求,等待action请求处理完成后把结果返回给母线程。
  • action对象会被推入stack的最顶层,使用stack.push方法.
  • 可以定义显示wait页面的延迟时间,如果查询请求并不需要很长时间的话,就不需要显示wait页面。

Exception Interceptor
  • 主要的目的就是把exception转化成result,而不是大expcetion trace直接打印到页面上,一来提高系统的安全性,二来提高用户体验。
  • 当系统捕获异常,系统会利用ExceptionHolder把exception wrap一下推入statck以便resutl页面render的时候可以获取到对应的action的信息,或者直接输入trace。

File Upload Interceptor
  • 基于MultiPartRequestWrapper,用于处理文件上传的请求
  • 获取所有页面上的file字段的文件,并且把这些字段转化设置到request的parameters中,并添加了contenttype和filename属性。对应的setter为fieldNameContentType,fieldNameFileName.

I18n Interceptor
  • 设置于用户session相关的locale信息,并且保存该locale信息。
  • 处理流程为先从request_locale=en_US获取locale信息,然后从request的parameters中删除locale信息,并且保存到session中,并应用到所有的request中。

Logger Interceptor
  • 记录action的start和stop信息,只有英文信息,不支持国际化。

Message Store Interceptor
  • 主要功能是为了把action的message和error已经field error存储到session,以供后续的action获取这些信息。
  • 可以定义三种operationmode STORE,RETRIEVE,NONE.
  • RETRIEVE主要通过合并集合和map的方式实现。

Model Driven Interceptor
  • 操作其实很简单,就是调用实现的了ModelDriven接口的Action的getModel方法,然后把getModel返回的对象压栈。

Scoped Model Driven Interceptor
  • 实现该接口的action可以根据scope的定义,直接从objectfactory中初始化对象,对象的标示由name属性决定。

Parameters Interceptor
  • 主要功能是把parametermaps上的param利用OGNL表达式设置到相应stack的action中。
  • 还能设置拒绝设置某些恶意参数例如.,#=,等会影响OGNL执行的参数,已经用户通过实现ParameterNameAware接口定义acceptableParameterName中忽略的参数。
  • 例外还需要的功能包括CreatingNullObjects,DenyMethodExecution,ReportingConversionErrors。

Prepare Interceptor
  • action实现了Preparable接口
  • 调用prepare开头的方法。
  • 调用prepareDo开头的方法.
  • 如果alwaysinvokePrepare设置为true(默认),那名总会调用prepare方法.

Scope Interceptor
  • 设计该拦截器的目的是为了利用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操作。

Servlet Config Interceptor
  • 用于向实现了特定接口的action中注入和servlet有关的对象,action可以实现的对应接口如下
  • ServletContextAware,ServletRequestAware,ServletResponseAware,ParameterAware,RequestAware,SessionAware,ApplicationAware,PrincipalAware.

Static Parameters Interceptor
  • 把struts.xml中定义的该interceptor的params pair注入对应的action中,并且如果action实现了Parameterizable接口该interceptor也会把该paramsmap通过该接口的setParams注入到对应的action中。

Roles Interceptor
  • 通过该拦截器调用request的isUserInRole方法实现

Timer Interceptor
  • 放回action中的方法执行的时间。

Token Interceptor
  • 用于判断是否重复提交表单。在页面上和token一起使用。

Token Session Interceptor
  • 用于判断是否重复提交表单。在页面上和token一起使用,Token Interceptor的改进版本,当token验证失败的时候会返回上次成功的action的执行结果。

Validation Interceptor
  • 处理表单验证的拦截器,该拦截器一般配置于最后或者倒数第二个action,因为在该拦截器调用前所有的actionproperty需要准备好。
  • 该拦截器支持用户实现Validatable接口的validate方法或者validateXxx,validateDoXxx方法,规则和pareparable一致。
  • 拦截器支持exclude和includemethod方法的配置

Workflow Interceptor
  • 该拦截器的也是为了验证,不过该action只调用那些实现了validatable或者ValidationAware接口的validateXxx,validate,validateDoXxx方法,并且判断是否有某个action,hasErrors()如果有直接打断action chain并且返回Input作为结果。
  • 但是实际代码感觉和文档描述的有点不一致,实际代码只检查实现了ValidationAware的action的hasError方法.

Parameter Filter Interceptor
  • 用于过滤哪些参数不需要,那些参数需要注入到action中。
  • defaultBlock默认为false如果设置成true只有allow列表中的开头的parameter才能注入到action,
  • allow和block的方式都是以字符串开头为规则例如person会block,person.name等等的字段。但是如果allow中定义了person.address那么该parameter可以通过。

Profiling Interceptor
  • 用于打开系统性能检测功能。

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]
    分享到:
    评论

    相关推荐

    Global site tag (gtag.js) - Google Analytics