码迷,mamicode.com
首页 > 其他好文 > 详细

Struts2中的拦截器详解

时间:2015-05-24 14:15:53      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:interceptor   action   拦截器   

拦截器是什么

拦截器是一种可以在让用户在Action执行之前和Result执行之后进行一些功能处理的机制。
拦截器在action执行之前和result执行之后的顺序是相反的,可以看下图:
技术分享

也就是说执行的顺序是:Interceptor1—Interceptor2—Interceptor3—Action—Result–Interceptor3—-Interceptor2—-Interceptor1

拦截器的优点

下边是书上总结的优点,贴几张图,还是比自己写来得快。

技术分享
技术分享

拦截器有什么

在我们使用Action的时候,发现我们在action中的域值已经有值,并且这些值跟用户请求的参数是一至的,这说明我们在执行execute之前,已经有人把这个东西给做了,他就是 拦截器 。这些缺省配置的拦截器。成为预定义的拦截器。

预定义拦截器

我们可以在default-struts.xml文件中进行查看:

 <interceptors>
            <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
             <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
            。。。。。。。
            <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />

            <!-- Basic stack -->
            <interceptor-stack name="basicStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="params">
                    <param name="excludeParams">dojo\..*,^struts\..*</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
            </interceptor-stack>

(1)params拦截器

 <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

这个拦截器是必须的,因为就是他把请求参数设置到属性的Action的属性去的,并进行类型转换。
下边我们顺便研究一下这个拦截器是怎么实现的:
查看ParametersInterceptor的源代码发现官方的解释是:

(1)This interceptor sets all parameters on the value stack.
(2)This interceptor gets all parameters from  ActionContext than ,getParameters() and sets them on the value stack by calling ValueStack.setValue(String, Object), typically resulting in the values submitted in a form request being applied to an action in the value stack. Note that the parameter map must contain a String key and often containers a String[] for the value.

表示这个拦截器会从ActionContext中获取请求的参数,然后通过ValueStack.setValue(String, Object)把值设置进入value stack。

// Allowed names of parameters
    private String acceptedParamNames = "\\w+((\\.\\w+)|(\\[\\d+\\])|(\\(\\d+\\))|(\\[\\w+‘\\])|(\\(‘\\w+‘\\)))*";
    private Pattern acceptedPattern = Pattern.compile(acceptedParamNames);

    private ValueStackFactory valueStackFactory;

    @Inject
    public void setValueStackFactory(ValueStackFactory valueStackFactory) {
        this.valueStackFactory = valueStackFactory;
    }

上边的一段代码,可以看出在这个拦截器中通过使用正则表达式定义了可以接受的参数类型,并有一个ValueStackFactory,用于将数据存放在valueStack,想详细研究的可以看一下源码,这里不再多说了。

(2)staticParams
这个拦截器的功能是将我们在struts.xml配置文件中定义的Action参数,设置到对应的Action实例中去,

<action name="loginAction" class="com.lc.action.LoginAction">
            <param name="account">test</param>
        </action>

如上述,在struts.xml文件中有一个param,同样要求Action中用于一个account的属性,并且有get和set方法。
注意:我们到这里发现,使用params拦截器和使用staticParams拦截器的功能都是向action中添加属性,那么如果我们遇到这种情况,就是我们的request域中有参数,而我们也在struts.xml文件中配置了参数,那么最终的结果是什么那?

其实在Action初始化之后,就会把struts.xml文件中的配置数据设置到action实例中相应的属性中区,然后用户请求的数据设置到Action实例中的属性中,很明显,最后的值应该是用户请求中account的数据,即被覆盖了在struts。xml文件中配置的属性。

拦截器的调用顺序

技术分享
技术分享

举例说明:

<package name="helloworld" extends="struts-default">
        <action name="loginAction" class="com.lc.action.LoginAction">
            <param name="account">test</param>
            <result>/welcome.jsp</result>
        </action>
    </package>

这个配置中是没有任何拦截器的,他自己没有生命拦截器的引用,他所在的报也没有生命默认的拦截器引用,但是他的父包struts-default中声明了默认的拦截器引用,也就是defaultStack,因此这个action有这个默认的拦截器。

    <package name="helloworld" extends="struts-default">
        <action name="loginAction" class="com.lc.action.LoginAction">
            <param name="account">test</param>
            <result>/welcome.jsp</result>
            <interceptor-ref name="staticParams" />
        </action>
    </package>

上边代码中引用了一个拦截器,则会覆盖父包中的定义的默认引用拦截器。只有这个拦截器起作用
正是这种覆盖的关系,我们就需要在action中添加一个默认的引用,如下:

<package name="helloworld" extends="struts-default">
        <action name="loginAction" class="com.lc.action.LoginAction">
            <param name="account">test</param>
            <result>/welcome.jsp</result>
            <interceptor-ref name="staticParams" />
            <interceptor-ref name="defaultStack" />
        </action>
    </package>

Struts2中的拦截器详解

标签:interceptor   action   拦截器   

原文地址:http://blog.csdn.net/xlgen157387/article/details/45951163

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!