`

Struts2.2 Interceptors

阅读更多

 

AOP 中的 aspect 在不同的框架下表示的意思不同:

         Java 代理:服务

         Spring advice

         Struts :拦截器

 

Struts 中拦截器是 AOP Aspect-Oriented Programming )思想的体现:

         1 、将与业务无关的解决特定领域问题(日志、安全、事务 )的代码从程序流程中分离出来,以切面的方式挂载到主流程的执行点

         2 、集中管理横切关注点代码

         3 、提高架构分层级别

 

Struts2 拦截器的功能:

1 、拦截器是 Struts2 的基石;

         2 Struts2 通过丰富的内置拦截器实现了清洁的 MVC 分层;

         3 Struts2 的大多数功能都是通过拦截器提供的(表单数据映射,数据校验,国际化,文件上传等等);

         4 Struts2 允许开发者自定义拦截器(权限验证,日志,事务处理)

         5 Struts2 插件扩展基本上都是通过拦截器实现的

 

拦截器机制:

         1 、拦截 Action 的执行,为其添加预处理和后处理过程

         2 ActionInvocation Action 调度器,实现拦截器与 Action cross-cut (横切)

 

ActionInvocation 说明:

执行过程 :

                   1 Struts 根据请求的 URL 创建对应的 Action 对象,并为其创建 ActionInvocation 实例;

                   2 、根据配置文件查找应当触发的拦截器和执行顺序,并添加到 ActionInvocation 对象中;

                   3 ActionInvocation invoke() 方法被触发;

                   逐个调用 interceptor intercep() 方法

                            调用预处理方法     

                            递归调用 ActionInvocation invoke 方法

                            调用后处理方法

                   4 、执行 Action ,获取 result

                   5 、执行 inteceptor 中注册的 preResultListeners

                   6 、执行 Result

为了理解清楚,我们再看看 Action 的生命周期:

action lifecyle

 

 

Interceptors

<package name="default" extends="struts-default">
   <interceptors>
       <interceptor name="timer" class=".."/>
       <interceptor name="logger" class=".."/>
   </interceptors>

   <action name="login"
      class="tutorial.Login">
        <interceptor-ref name="timer"/>
        <interceptor-ref name="logger"/>
         <result name="input">login.jsp</result>
         <result name="success"
            type="redirectAction">/secure/home</result>
   </action>
</package>

 

 

Stacking Interceptors

拦截器栈:

         拦截器栈指定包含的拦截器引用和执行顺序,便于使用

         内置拦截器栈

                   basicStack Struts2 提供了最常用的栈,提供了异常处理,将 HTTP 对象和请求 / 表单参数注入 action ,和处理转换错误的功能;

                   validationWorkflowStack :向 basic 栈中添加验证和工作流的功能;

                   fileUploadStack :向 basic 栈中添加对自动文件上传的支持;

                   defaultStack :这是默认的栈,它为绝大多数的应用场景提供了所有的功能,实际上,他包括了核心发布版中几乎所有的可用拦截器;

<package name="default" extends="struts-default">
   <interceptors>
        <interceptor name="timer" class=".."/>
        <interceptor name="logger" class=".."/>
        <interceptor-stack name="myStack">
           <interceptor-ref name="timer"/>
           <interceptor-ref name="logger"/>
        </interceptor-stack>
    </interceptors>

<action name="login"
     class="tutuorial.Login">
         <interceptor-ref name="myStack"/>
         <result name="input">login.jsp</result>
         <result name="success"
             type="redirectAction">/secure/home</result>
</action>
</package>

 

Demo

MyInterceptor.java

package org.lxh.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

/**
 * @author xudongwang 2011-5-13
 *
 */
public class MyInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("拦截器之前。。。。");
		String result = invocation.invoke();
		System.out.println("拦截器之后。。。。");
		return result;
	}

}

 

说明:

         invocation.invoke(); 传递拦截器链,即继续执行其他的拦截器

                   此方法返回后续拦截器执行的 result

                   在此方法前进行预处理;

                   在此方法后处理后处理;

Struts.xml:

        <interceptors>
		<interceptor name="myInterceptor" class="org.lxh.interceptor.MyInterceptor"></interceptor>
	</interceptors>
	<action name="hello-world" class="org.lxh.action.UserAction" method="hello">
		<interceptor-ref name="myInterceptor"></interceptor-ref>
		<result>/hello_struts2.jsp</result>
	</action>
 

 

 

Struts2 提供的拦截器可以在 struts2-core-2.1.8.1.jar 包下的 struts-default.xml 查看关于默认的拦截器与拦截器链的配置。

<?xml version="1.0" encoding="UTF-8" ?>
<!--
/*
 * $Id$
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
-->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">

<struts>
    <bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork" />
    <bean type="com.opensymphony.xwork2.ObjectFactory" name="struts" class="org.apache.struts2.impl.StrutsObjectFactory" />

    <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="xwork" class="com.opensymphony.xwork2.DefaultActionProxyFactory"/>
    <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="struts" class="org.apache.struts2.impl.StrutsActionProxyFactory"/>

    <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name="tiger" class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/>
    <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name="notiger" class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/>
    <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name="struts" class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/>

    <bean type="com.opensymphony.xwork2.util.PatternMatcher" name="struts" class="com.opensymphony.xwork2.util.WildcardHelper" />
    <bean type="com.opensymphony.xwork2.util.PatternMatcher" name="namedVariable" class="com.opensymphony.xwork2.util.NamedVariablePatternMatcher"/>
    <bean type="com.opensymphony.xwork2.util.PatternMatcher" name="regex" class="org.apache.struts2.util.RegexPatternMatcher"/>

    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="struts" class="org.apache.struts2.dispatcher.mapper.DefaultActionMapper" />
    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="composite" class="org.apache.struts2.dispatcher.mapper.CompositeActionMapper" />
    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="restful" class="org.apache.struts2.dispatcher.mapper.RestfulActionMapper" />
    <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="restful2" class="org.apache.struts2.dispatcher.mapper.Restful2ActionMapper" />

    <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="struts" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default"/>
    <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default" />
    <constant name="struts.multipart.handler" value="jakarta" />

    <bean type="org.apache.struts2.views.TagLibrary" name="s" class="org.apache.struts2.views.DefaultTagLibrary" />

    <bean class="org.apache.struts2.views.freemarker.FreemarkerManager" name="struts" />
    <bean class="org.apache.struts2.views.velocity.VelocityManager" name="struts" optional="true" />

    <bean class="org.apache.struts2.components.template.TemplateEngineManager" />
    <bean type="org.apache.struts2.components.template.TemplateEngine" name="ftl" class="org.apache.struts2.components.template.FreemarkerTemplateEngine" />
    <bean type="org.apache.struts2.components.template.TemplateEngine" name="vm" class="org.apache.struts2.components.template.VelocityTemplateEngine" />
    <bean type="org.apache.struts2.components.template.TemplateEngine" name="jsp" class="org.apache.struts2.components.template.JspTemplateEngine" />

    <bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter" name="struts" class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" />
    <bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter" name="xwork1" class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" />
    <bean class="com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter" />

    <bean type="com.opensymphony.xwork2.TextProvider" name="xwork1" class="com.opensymphony.xwork2.TextProviderSupport" scope="default" />
    <bean type="com.opensymphony.xwork2.TextProvider" name="struts" class="com.opensymphony.xwork2.TextProviderSupport" scope="default" />

    <bean type="org.apache.struts2.components.UrlRenderer" name="struts" class="org.apache.struts2.components.ServletUrlRenderer"/>

    <bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="struts" class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory" />
    <bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider" name="struts" class="com.opensymphony.xwork2.ognl.OgnlReflectionProvider" />
    <bean type="com.opensymphony.xwork2.util.reflection.ReflectionContextFactory" name="struts" class="com.opensymphony.xwork2.ognl.OgnlReflectionContextFactory" />

    <bean type="com.opensymphony.xwork2.TextProvider" name="system" class="com.opensymphony.xwork2.DefaultTextProvider" />
    <bean type="com.opensymphony.xwork2.conversion.NullHandler" name="java.lang.Object" class="com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler" />

    <bean type="com.opensymphony.xwork2.validator.ActionValidatorManager" name="struts" class="com.opensymphony.xwork2.validator.AnnotationActionValidatorManager" />
    <bean type="com.opensymphony.xwork2.validator.ActionValidatorManager" name="no-annotations" class="com.opensymphony.xwork2.validator.DefaultActionValidatorManager" />

    <bean type="com.opensymphony.xwork2.validator.ValidatorFactory" class="com.opensymphony.xwork2.validator.DefaultValidatorFactory"/>
    <bean type="com.opensymphony.xwork2.validator.ValidatorFileParser" class="com.opensymphony.xwork2.validator.DefaultValidatorFileParser" />

    <bean class="com.opensymphony.xwork2.ognl.OgnlUtil" />

    <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" />
    <bean type="ognl.PropertyAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor" />
    <bean type="ognl.PropertyAccessor" name="java.util.Iterator" class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor" />
    <bean type="ognl.PropertyAccessor" name="java.util.Enumeration" class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor" />
    <bean type="ognl.PropertyAccessor" name="java.util.List" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
    <bean type="ognl.PropertyAccessor" name="java.util.Set" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
    <bean type="ognl.PropertyAccessor" name="java.util.Map" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />
    <bean type="ognl.PropertyAccessor" name="java.util.Collection" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
    <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.ognl.ObjectProxy" class="com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor" />

    <bean type="ognl.MethodAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor" />
    <bean type="ognl.MethodAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" />

    <bean class="org.apache.struts2.views.jsp.ui.OgnlTool" />

    <bean type="org.apache.struts2.dispatcher.StaticContentLoader" class="org.apache.struts2.dispatcher.DefaultStaticContentLoader" name="struts" />
    <bean type="com.opensymphony.xwork2.UnknownHandlerManager" class="com.opensymphony.xwork2.DefaultUnknownHandlerManager" name="struts" />

    <!--  Silly workarounds for OGNL since there is currently no way to flush its internal caches -->
    <bean type="ognl.PropertyAccessor" name="java.util.ArrayList" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" />
    <bean type="ognl.PropertyAccessor" name="java.util.HashSet" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" />
    <bean type="ognl.PropertyAccessor" name="java.util.HashMap" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" />

    <package name="struts-default" abstract="true">
        <result-types>
            <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
            <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
            <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
            <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
            <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
            <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
            <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
            <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
            <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
            <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
        </result-types>

        <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="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"/>
            <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
            <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
            <interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
            <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
            <interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>
            <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
            <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
            <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
            <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
            <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
            <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
            <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
            <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
            <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
            <interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
            <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
            <interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
            <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
            <interceptor name="jsonValidation" class="org.apache.struts2.interceptor.validation.JSONValidationInterceptor" />
            <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />
            <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />

            <!-- 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="multiselect"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                    <param name="excludeParams">dojo\..*,^struts\..*</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
            </interceptor-stack>

            <!-- Sample validation and workflow stack -->
            <interceptor-stack name="validationWorkflowStack">
                <interceptor-ref name="basicStack"/>
                <interceptor-ref name="validation"/>
                <interceptor-ref name="workflow"/>
            </interceptor-stack>

            <!-- Sample JSON validation stack -->
            <interceptor-stack name="jsonValidationWorkflowStack">
                <interceptor-ref name="basicStack"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel</param>
                </interceptor-ref>
                <interceptor-ref name="jsonValidation"/>
                <interceptor-ref name="workflow"/>
            </interceptor-stack>

            <!-- Sample file upload stack -->
            <interceptor-stack name="fileUploadStack">
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="basicStack"/>
            </interceptor-stack>

            <!-- Sample model-driven stack  -->
            <interceptor-stack name="modelDrivenStack">
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="basicStack"/>
            </interceptor-stack>

            <!-- Sample action chaining stack -->
            <interceptor-stack name="chainStack">
                <interceptor-ref name="chain"/>
                <interceptor-ref name="basicStack"/>
            </interceptor-stack>

            <!-- Sample i18n stack -->
            <interceptor-stack name="i18nStack">
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="basicStack"/>
            </interceptor-stack>

            <!-- An example of the paramsPrepareParams trick. This stack
                 is exactly the same as the defaultStack, except that it
                 includes one extra interceptor before the prepare interceptor:
                 the params interceptor.

                 This is useful for when you wish to apply parameters directly
                 to an object that you wish to load externally (such as a DAO
                 or database or service layer), but can't load that object
                 until at least the ID parameter has been loaded. By loading
                 the parameters twice, you can retrieve the object in the
                 prepare() method, allowing the second params interceptor to
                 apply the values on the object. -->
            <interceptor-stack name="paramsPrepareParamsStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="params">
                    <param name="excludeParams">dojo\..*,^struts\..*</param>
                </interceptor-ref>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                    <param name="excludeParams">dojo\..*,^struts\..*</param>
                </interceptor-ref>
                <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-stack>

            <!-- A complete stack with all the common interceptors in place.
                 Generally, this stack should be the one you use, though it
                 may do more than you need. Also, the ordering can be
                 switched around (ex: if you wish to have your servlet-related
                 objects applied before prepare() is called, you'd need to move
                 servletConfig interceptor up.

                 This stack also excludes from the normal validation and workflow
                 the method names input, back, and cancel. These typically are
                 associated with requests that should not be validated.
                 -->
            <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="debugging"/>
                <interceptor-ref name="scopedModelDriven"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                  <param name="excludeParams">dojo\..*,^struts\..*</param>
                </interceptor-ref>
                <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-stack>

            <!-- The completeStack is here for backwards compatibility for
                 applications that still refer to the defaultStack by the
                 old name -->
            <interceptor-stack name="completeStack">
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>

            <!-- Sample execute and wait stack.
                 Note: execAndWait should always be the *last* interceptor. -->
            <interceptor-stack name="executeAndWaitStack">
                <interceptor-ref name="execAndWait">
                    <param name="excludeMethods">input,back,cancel</param>
                </interceptor-ref>
                <interceptor-ref name="defaultStack"/>
                <interceptor-ref name="execAndWait">
                    <param name="excludeMethods">input,back,cancel</param>
                </interceptor-ref>
            </interceptor-stack>

       </interceptors>

        <default-interceptor-ref name="defaultStack"/>

        <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
    </package>

</struts>

 

下面列一个表格简单说明一下:

 

拦截器

名字

说明

Alias Interceptor

alias

在不同请求之间将请求参数在不同名字件转换,请求内容不变

Chaining Interceptor

chain

让前一个 Action 的属性可以被后一个 Action 访问,现在和 chain 类型的 result <result type=”chain”> )结合使用。

Checkbox Interceptor

checkbox

添加了 checkbox 自动处理代码,将没有选中的 checkbox 的内容设定为 false ,而 html 默认情况下不提交没有选中的 checkbox

Cookies Interceptor

cookies

使用配置的 name,value 来是指 cookies

Conversion Error Interceptor

conversionError

将错误从 ActionContext 中添加到 Action 的属性字段中。

Create Session Interceptor

createSession

自动的创建 HttpSession ,用来为需要使用到 HttpSession 的拦截器服务。

Debugging Interceptor

debugging

提供不同的调试用的页面来展现内部的数据状况。

Execute and Wait Interceptor

execAndWait

在后台执行 Action ,同时将用户带到一个中间的等待页面。

Exception Interceptor

exception

将异常定位到一个画面

File Upload Interceptor

fileUpload

提供文件上传功能

I18n Interceptor

i18n

记录用户选择的 locale

Logger Interceptor

logger

输出 Action 的名字

Message Store Interceptor

store

存储或者访问实现 ValidationAware 接口的 Action 类出现的消息,错误,字段错误等。

Model Driven Interceptor

model-driven

如果一个类实现了 ModelDriven ,将 getModel 得到的结果放在 Value Stack 中。

Scoped Model Driven

scoped-model-driven

如果一个 Action 实现了 ScopedModelDriven ,则这个拦截器会从相应的 Scope 中取出 model 调用 Action setModel 方法将其放入 Action 内部。

Parameters Interceptor

params

将请求中的参数设置到 Action 中去。

Prepare Interceptor

prepare

如果 Acton 实现了 Preparable ,则该拦截器调用 Action 类的 prepare 方法。

Scope Interceptor

scope

Action 状态存入 session application 的简单方法。

Servlet Config Interceptor

servletConfig

提供访问 HttpServletRequest HttpServletResponse 的方法,以 Map 的方式访问。

Static Parameters Interceptor

staticParams

struts.xml 文件中将 <action> 中的 <param> 中的内容设置到对应的 Action 中。

Roles Interceptor

roles

确定用户是否具有 JAAS 指定的 Role ,否则不予执行。

Timer Interceptor

timer

输出 Action 执行的时间

Token Interceptor

token

通过 Token 来避免双击

Token Session Interceptor

tokenSession

Token Interceptor 一样,不过双击的时候把请求的数据存储在 Session

Validation Interceptor

validation

使用 action-validation.xml 文件中定义的内容校验提交的数据。

Workflow Interceptor

workflow

调用 Action validate 方法,一旦有错误返回,重新定位到 INPUT 画面

Parameter Filter Interceptor

N/A

从参数列表中删除不必要的参数

Profiling Interceptor

profiling

通过参数激活 profile

 

 ok,struts2.2的拦截器就搞这么多。

 

 

  • 大小: 18.2 KB
分享到:
评论

相关推荐

    struts2.2,ssh

    Struts2.2和SSH是Java Web开发中的两个重要框架,它们在构建高效、可维护的Web应用程序中扮演着核心角色。Struts2是一个强大的MVC(Model-View-Controller)框架,而SSH则通常指的是Struts2、Spring和Hibernate的...

    struts-2.2.3.1-lib.zip

    4. **拦截器(Interceptors)**:拦截器是Struts 2的核心特性之一,它们在Action执行前后进行拦截,实现诸如日志记录、事务管理、权限检查等跨切面的功能。 5. **配置文件**:Struts 2的配置通常在`struts.xml`文件...

    struts2.2.1.1.chm帮助文档

    Struts2.2.1.1.chm帮助文档是一个针对Apache Struts 2框架的官方指南,该框架是Java平台上广泛使用的MVC(Model-View-Controller)架构的一部分,用于构建企业级Web应用程序。这个CHM(Compiled HTML Help)文件包含...

    struts2.2.3.1帮助文档

    Struts2.2.3.1是Apache Struts框架的一个版本,它是一个开源的MVC(Model-View-Controller)框架,广泛应用于Java Web开发中。这个帮助文档提供了该版本Struts框架的详细指南和API参考,对于开发者来说是极其宝贵的...

    Struts2.2入门By CRUD

    Struts2.2入门By CRUD 是一个针对初学者的教程,旨在帮助他们了解如何使用Struts2框架进行基本的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作,即CRUD操作。这个教程可能包含了源代码示例和...

    struts-2.2.1.1-all.rar

    3. **拦截器(Interceptors)**: 拦截器是Struts 2中的重要组件,可以实现诸如日志、权限检查、数据校验等通用功能,它们按照定义的顺序在Action执行前后进行处理。 4. **OGNL(Object-Graph Navigation Language)**: ...

    struts-2.2.3.1-docs.zip

    此外,Struts 2的拦截器(Interceptors)机制提供了AOP(面向切面编程)功能,允许在Action执行前后插入自定义逻辑,如日志记录、权限检查等。 在视图层,Struts 2与JSP和FreeMarker等模板技术无缝集成。开发者可以...

    Struts-2.2.3.1-all

    Struts2的2.2.3.1版本是一个重要的里程碑,它包含了Struts2框架的核心组件和其他依赖库,为开发者提供了完整的开发环境。 首先,让我们详细了解Struts2框架的关键特性: 1. **Action和Result**:Struts2的核心是...

    struts-2.2.3.1.zip

    2. **拦截器(Interceptors)**:拦截器是Struts2强大的功能之一,它们在动作执行前后按顺序执行,可以实现如事务管理、权限验证、日志记录等通用功能。 3. **结果类型(Result Types)**:Struts2支持多种结果类型...

    Struts2.2.3.1API.rar_Java编程_Java_

    Struts2.2.3.1是该框架的一个特定版本,包含了一些改进和修复,旨在提高性能和稳定性。 在Struts2.2.3.1手册.chm中,我们可以找到关于这个版本的详尽指南和API参考。这份文档是开发者理解和使用Struts2框架的重要...

    struts-2.2.1.1-all.zip

    2. **拦截器(Interceptors)**:Struts 2使用拦截器来处理请求,如日志、事务管理和验证。拦截器链允许开发者在不修改Action代码的情况下添加额外的功能。 3. **OGNL(Object-Graph Navigation Language)**:...

    struts-2.2.3-lib.zip struts2.jar 全部jar包

    4. **依赖库**:包括ognl.jar,它是一种强大的对象导航语言,用于表达Action和Interceptors之间的数据绑定。struts2-json-plugin.jar提供了JSON支持,使应用程序能与Ajax和RESTful API通信。 5. **Spring集成**:...

    struts-2.2.1.1-src.zip

    2. **拦截器(Interceptors)**:Struts2的一个核心特性是拦截器,它们是实现AOP(面向切面编程)的一种方式。拦截器链可以定义在配置文件中,用于在Action执行前后执行特定的任务,如日志记录、权限检查、数据验证...

    struts2的学习笔记+测试源代码

    最后,`struts2_2_actionDefaultConfig`这个文件名可能指的是针对Struts2.2版本的Action默认配置相关示例或教程。Struts2的不同版本可能有一些细微差异,所以这份学习资料可能关注的是特定版本的最佳实践。 总的来...

    Struts2应用开发详解01

    2. Interceptors(拦截器):拦截器是Struts2的一大特色,它们定义了一系列预定义和自定义的行为,如日志、异常处理、事务管理等。拦截器按预定义顺序执行,形成一个执行链。 3. Result:结果表示Action执行后的...

    Struts2学习笔记与心得

    ##### 2.2 struts.xml配置 - `struts.xml`是Struts2的核心配置文件,用于定义包(Package)、Action及其映射等。一个简单的示例配置如下: ```xml &lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD...

    Struts2.0学习系列

    尽管这个教程是基于Struts2.0,但是理解这些基本概念对于学习更新的版本如Struts2.1、2.2等非常重要。随着版本的升级,Struts2引入了更多的改进和优化,例如更强大的拦截器、更好的性能以及对注解的支持。然而,核心...

    struts2-core-2.2.3.1.jar

    3. **拦截器(Interceptors)**:拦截器是Struts2的一个重要概念,它们是按照预定义的顺序在Action调用前后执行的一系列功能模块。拦截器可以用于日志记录、权限验证、事务管理等场景。 4. **结果类型(Result ...

    xwork-core-2.2.1.1.zip

    例如,通过元素定义Action,通过&lt;interceptors&gt;配置拦截器栈,通过定义Action执行后的结果跳转。 五、版本迭代 xwork-core-2.2.1.1是XWork的一个版本,相比早期版本,它可能包含了一些新的功能、性能优化或bug修复...

    Struts2.0框架技术详解

    **2.2 Struts1的MVC实现** Struts1的MVC实现基于ActionForm、Action、ActionServlet等核心组件。ActionForm用于封装请求参数,Action负责业务逻辑处理,ActionServlet作为控制器负责调度。 **2.3 Struts2的简单...

Global site tag (gtag.js) - Google Analytics