Struts2拦截器篇(一)

来源:互联网 发布:极光丛林果汁 淘宝 编辑:程序博客网 时间:2024/05/01 23:31

拦截器是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请求无法解析。

0 0
原创粉丝点击