上QQ阅读APP看书,第一时间看更新
6.5 Struts 2内建拦截器
Struts 2还提供了许多内建的拦截器,通过使用这些内建的拦截器能完成许多的应用。下面来介绍Struts 2提供了哪些内建的拦截器,以及如何配置这些拦截器。
6.5.1 内建拦截器
Sturts 2内建了大量的拦截器,并配置在struts2-core-2.0.11.1类库中的“struts-default.xml”文件中。从该文件中可以看到Struts 2中所有内建的拦截器,“struts-default.xml”文件代码如下所示。
<! -- 该拦截器用来实现不同请求中相同参数的别名转换 --> <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/> <! -- 该拦截器用来实现自动装配--> <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/> <! -- 该拦截器用来构建一个Action链 --> <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/> <! -- 该拦截器用来负责类型转换错误信息处理 --> <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/> <! -- 该拦截器用来实现获得cookie信息 --> <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/> <! -- 该拦截器用来创建一个HttpSession实例 --> <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" /> <! -- 该拦截器用来提供调试信息--> <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" /> <interceptor name="externalRef" class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/> <! -- 该拦截器用来后台执行Action --> <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"/> <! -- 该拦截器用来将参数值设置成Action中对应的属性 --> <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/> <! -- 如Action实现Prepareble接口,那么将自动调用该拦截器中的prepare()方法--> <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/> <! -- 该拦截器用来负责将<param>标签中的参数传入action中 --> <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/> <! -- 该拦截器用来实现范围转换 --> <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/> <! -- 该拦截器用来实现直接访问Servlet API --> <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/> <interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/> <! -- 该拦截器用来负责输出Action执行时间 --> <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/> <! -- 该拦截器用来阻止重复提交 --> <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/> <! -- 该拦截器用来将token保存到HttpSession中 --> <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/> <! -- 该拦截器用来实现数据校验 --> <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/> <! -- 该拦截器用来负责调用Action中的validate方法 --> <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" />
这么多的拦截器,要完全了解其实现机制是非常困难的。其实一般的开发人员知道如何使用这些拦截器就可以了。在定义package时一般都会选择继承struts-default包,这样就可以使用Struts 2所有的内建拦截器了。
6.5.2 内建拦截器的配置
从“struts-default.xml”文件中可以看到,在该文件中为内建的拦截器配置了许多的拦截器栈,代码如下所示。
<! --基本拦截器栈 --> interceptor-stack name="basicStack"> <interceptor-ref name="exception"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="prepare"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="params"/> <interceptor-ref name="conversionError"/> </interceptor-stack> <! -- 该拦截器栈包括基本拦截器栈的所有拦截器,增加用于数据校验的拦截器 --> <interceptor-stack name="validationWorkflowStack"> <interceptor-ref name="basicStack"/> <interceptor-ref name="validation"/> <interceptor-ref name="workflow"/> </interceptor-stack> <! --该拦截器栈包括基本拦截器栈的所有拦截器,增加用于文件上传的拦截器--> <interceptor-stack name="fileUploadStack"> <interceptor-ref name="fileUpload"/> <interceptor-ref name="basicStack"/> </interceptor-stack> <! --该拦截器栈包括基本拦截器栈的所有拦截器,增加用于模型驱动的拦截器--> <interceptor-stack name="modelDrivenStack"> <interceptor-ref name="modelDriven"/> <interceptor-ref name="basicStack"/> </interceptor-stack> <! --该拦截器栈包括基本拦截器栈的所有拦截器,增加用来构建一个Action链的拦截器--> <interceptor-stack name="chainStack"> <interceptor-ref name="chain"/> <interceptor-ref name="basicStack"/> </interceptor-stack> <! --该拦截器栈包括基本拦截器栈的所有拦截器,增加用于支持国际化的拦截器--> <interceptor-stack name="i18nStack"> <interceptor-ref name="i18n"/> <interceptor-ref name="basicStack"/> </interceptor-stack> <! --该拦截器栈两次引用params拦截器,用于将请求对象赋值给外部对象--> <interceptor-stack name="paramsPrepareParamsStack"> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="params"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="prepare"/> <interceptor-ref name="i18n"/> <interceptor-ref name="chain"/> <interceptor-ref name="modelDriven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="params"/> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">input, back, cancel</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input, back, cancel</param> </interceptor-ref> </interceptor-stack> <! --默认拦截器栈,包含大部分常用拦截器的引用 --> <interceptor-stack name="defaultStack"> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="prepare"/> <interceptor-ref name="i18n"/> <interceptor-ref name="chain"/> <interceptor-ref name="debugging"/> <interceptor-ref name="profiling"/> <interceptor-ref name="scopedModelDriven"/> <interceptor-ref name="modelDriven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="params"> <param name="excludeParams">dojo\..*</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> <! -- 默认拦截器的别名 --> <interceptor-stack name="completeStack"> <interceptor-ref name="defaultStack"/> </interceptor-stack>
在上面这些拦截器中,使用最多的就是defaultStack拦截器栈。而且在“struts-default.xml”文件中配置了默认拦截器栈为defaultStack,代码如下所示。
<default-interceptor-ref name="defaultStack"/>
就是因为在“struts-default.xml”文件中配置了默认拦截器栈为defaultStack,而且这里的包又继承struts-default,所以也就相当于定义了默认的拦截器栈为defaultStack。