Struts2拦截器篇(一)

拦截器是struts2框架的重要组成部分,在struts2中的大量工作都是由拦截器(interceptor)来完成
的。如params拦截器可以将HTTP请求中的参数信息解析出来封装在Action的属性中:fileUpload拦截器则负责分析HTTP请求中的文件块信息,并封装在Action相应的属性中……在struts2中像这样的内建拦截器还有很多,下面是struts-default.xml中定义的一些拦截器信息:在我的博客(Struts2拦截器)我们以此为例来说明如何定义和使用拦截器;拦截器中的方法过滤 ;在拦截器中配置结果监听器;struts2中常用内建监听器的使用,最后我们以权限验证拦截器为例说明如何自定义拦截器。来和我一起快乐的学习吧!

struts-default.xml中监听器的配置

<interceptors>
            <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
            <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
            <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
            <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
            <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
            <interceptor name="cookieProvider" class="org.apache.struts2.interceptor.CookieProviderInterceptor"/>
            <interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
            <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
            <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
            <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
            <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
            <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
            <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
            ……

 <!-- Basic stack -->
            <interceptor-stack name="basicStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="datetime"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params"/>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="deprecation"/>
            </interceptor-stack>

 <!-- Sample file upload stack文件上传拦截器栈 -->
            <interceptor-stack name="fileUploadStack">
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="basicStack"/><!--引用basicStack拦截器栈-->
            </interceptor-stack>
 <!-- defaultStack默认拦截器栈 -->       
 <interceptor-stack name="defaultStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="scopedModelDriven"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="datetime"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params"/>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="debugging"/>
                <interceptor-ref name="deprecation"/>
            </interceptor-stack>
 <!-- defaultStack被struts2设置为了默认拦截器栈,默认情况下所有HTTP请求都会通过这些拦截器 --> 
             <default-interceptor-ref name="defaultStack"/>

从struts-default.xml的拦截器配置中我们知道了struts2的一些内建拦截器以及这些拦截器(拦截器栈)是如何定义的,那么在struts.xml中应该如何使用这些拦截器呢?很简单

<struts>
    <package name="user" extends="struts-default">
    <!--拦截器的定义-->
        <interceptors>
            <interceptor name="executeTime" class="interceptor.ExecuteTime2Interceptor">
                <param name="name">执行时间</param>
            </interceptor>
            <interceptor-stack name="customStack">
                <interceptor-ref name="defaultStack" />
                <interceptor-ref name="executeTime" />
            </interceptor-stack>
        </interceptors>
        <!--默认拦截器的设置,每个包只能有一个默认拦截器-->
        <default-interceptor-ref name="默认调用的拦截器,如权限验证拦截器等"/>
        <action name="login" class="action.LoginAction">
            <result name="success">
                /success.jsp
            </result>
            <!--拦截器栈的使用-->
            <interceptor-ref name="customStack"> 
            <!--注意指定拦截器参数值的方法-->
            <param name="executeTime.name">自定义的计算excute执行时间的拦截器</param>
            </interceptor-ref>
        </action>
    </package>
</struts> 

注意:当在包中显示使用了其他拦截器(栈)时,默认的拦截器(栈)就不起作用了,因此struts-default.xml中一些拦截器都被封装成拦截器栈,引用了basicStack或defaultStack,因此显示调用时应该调用这些封装好的拦截器栈,例如

<interceptor-stack name="fileUploadStack">
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="basicStack"/><!--引用basicStack拦截器栈-->
</interceptor-stack>

如果显示调用时直接调用fileUpload而不是fileUploadStack的话,就会导致basicStack中大多数Action都需要的拦截器都无法使用,直接导致HTTP请求无法解析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值