Struts2中的拦截器详解

拦截器是什么

拦截器是一种可以在让用户在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>
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐刘根

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值