【struts2】预定义拦截器
1)預定義攔截器
Struts2有默認的攔截器配置,也就是說,雖然我們沒有主動去配置任何關于攔截器的東西,但是Struts2會使用默認引用的攔截器。由于Struts2的默認攔截器聲明和引用都在這個Struts-default.xml里面,因此我們需要到這個文件的struts-default包里去看一下。定義如下:
1 <interceptors> 2 <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/> 3 <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/> 4 <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/> 5 <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/> 6 <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/> 7 <interceptor name="cookieProvider" class="org.apache.struts2.interceptor.CookieProviderInterceptor"/> 8 <interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" /> 9 <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" /> 10 <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" /> 11 <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/> 12 <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/> 13 <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/> 14 <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/> 15 <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/> 16 <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> 17 <interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/> 18 <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/> 19 <interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/> 20 <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/> 21 <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/> 22 <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/> 23 <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/> 24 <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/> 25 <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/> 26 <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/> 27 <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/> 28 <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/> 29 <interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" /> 30 <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" /> 31 <interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" /> 32 <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" /> 33 <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" /> 34 <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" /> 35 <interceptor name="deprecation" class="org.apache.struts2.interceptor.DeprecationInterceptor" /> 36 37 <!-- Basic stack --> 38 <interceptor-stack name="basicStack"> 39 <interceptor-ref name="exception"/> 40 <interceptor-ref name="servletConfig"/> 41 <interceptor-ref name="prepare"/> 42 <interceptor-ref name="checkbox"/> 43 <interceptor-ref name="multiselect"/> 44 <interceptor-ref name="actionMappingParams"/> 45 <interceptor-ref name="params"> 46 <param name="excludeParams">^class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param> 47 </interceptor-ref> 48 <interceptor-ref name="conversionError"/> 49 <interceptor-ref name="deprecation"/> 50 </interceptor-stack> 51 52 <!-- Sample validation and workflow stack --> 53 <interceptor-stack name="validationWorkflowStack"> 54 <interceptor-ref name="basicStack"/> 55 <interceptor-ref name="validation"/> 56 <interceptor-ref name="workflow"/> 57 </interceptor-stack> 58 59 <!-- Sample file upload stack --> 60 <interceptor-stack name="fileUploadStack"> 61 <interceptor-ref name="fileUpload"/> 62 <interceptor-ref name="basicStack"/> 63 </interceptor-stack> 64 65 <!-- Sample model-driven stack --> 66 <interceptor-stack name="modelDrivenStack"> 67 <interceptor-ref name="modelDriven"/> 68 <interceptor-ref name="basicStack"/> 69 </interceptor-stack> 70 71 <!-- Sample action chaining stack --> 72 <interceptor-stack name="chainStack"> 73 <interceptor-ref name="chain"/> 74 <interceptor-ref name="basicStack"/> 75 </interceptor-stack> 76 77 <!-- Sample i18n stack --> 78 <interceptor-stack name="i18nStack"> 79 <interceptor-ref name="i18n"/> 80 <interceptor-ref name="basicStack"/> 81 </interceptor-stack> 82 83 <!-- An example of the paramsPrepareParams trick. This stack 84 is exactly the same as the defaultStack, except that it 85 includes one extra interceptor before the prepare interceptor: 86 the params interceptor. 87 88 This is useful for when you wish to apply parameters directly 89 to an object that you wish to load externally (such as a DAO 90 or database or service layer), but can't load that object 91 until at least the ID parameter has been loaded. By loading 92 the parameters twice, you can retrieve the object in the 93 prepare() method, allowing the second params interceptor to 94 apply the values on the object. --> 95 <interceptor-stack name="paramsPrepareParamsStack"> 96 <interceptor-ref name="exception"/> 97 <interceptor-ref name="alias"/> 98 <interceptor-ref name="i18n"/> 99 <interceptor-ref name="checkbox"/> 100 <interceptor-ref name="multiselect"/> 101 <interceptor-ref name="params"> 102 <param name="excludeParams">^class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param> 103 </interceptor-ref> 104 <interceptor-ref name="servletConfig"/> 105 <interceptor-ref name="prepare"/> 106 <interceptor-ref name="chain"/> 107 <interceptor-ref name="modelDriven"/> 108 <interceptor-ref name="fileUpload"/> 109 <interceptor-ref name="staticParams"/> 110 <interceptor-ref name="actionMappingParams"/> 111 <interceptor-ref name="params"> 112 <param name="excludeParams">^class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param> 113 </interceptor-ref> 114 <interceptor-ref name="conversionError"/> 115 <interceptor-ref name="validation"> 116 <param name="excludeMethods">input,back,cancel,browse</param> 117 </interceptor-ref> 118 <interceptor-ref name="workflow"> 119 <param name="excludeMethods">input,back,cancel,browse</param> 120 </interceptor-ref> 121 </interceptor-stack> 122 123 <!-- A complete stack with all the common interceptors in place. 124 Generally, this stack should be the one you use, though it 125 may do more than you need. Also, the ordering can be 126 switched around (ex: if you wish to have your servlet-related 127 objects applied before prepare() is called, you'd need to move 128 servletConfig interceptor up. 129 130 This stack also excludes from the normal validation and workflow 131 the method names input, back, and cancel. These typically are 132 associated with requests that should not be validated. 133 --> 134 <interceptor-stack name="defaultStack"> 135 <interceptor-ref name="exception"/> 136 <interceptor-ref name="alias"/> 137 <interceptor-ref name="servletConfig"/> 138 <interceptor-ref name="i18n"/> 139 <interceptor-ref name="prepare"/> 140 <interceptor-ref name="chain"/> 141 <interceptor-ref name="scopedModelDriven"/> 142 <interceptor-ref name="modelDriven"/> 143 <interceptor-ref name="fileUpload"/> 144 <interceptor-ref name="checkbox"/> 145 <interceptor-ref name="multiselect"/> 146 <interceptor-ref name="staticParams"/> 147 <interceptor-ref name="actionMappingParams"/> 148 <interceptor-ref name="params"> 149 <param name="excludeParams">^class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param> 150 </interceptor-ref> 151 <interceptor-ref name="conversionError"/> 152 <interceptor-ref name="validation"> 153 <param name="excludeMethods">input,back,cancel,browse</param> 154 </interceptor-ref> 155 <interceptor-ref name="workflow"> 156 <param name="excludeMethods">input,back,cancel,browse</param> 157 </interceptor-ref> 158 <interceptor-ref name="debugging"/> 159 <interceptor-ref name="deprecation"/> 160 </interceptor-stack> 161 162 <!-- The completeStack is here for backwards compatibility for 163 applications that still refer to the defaultStack by the 164 old name --> 165 <interceptor-stack name="completeStack"> 166 <interceptor-ref name="defaultStack"/> 167 </interceptor-stack> 168 169 <!-- Sample execute and wait stack. 170 Note: execAndWait should always be the *last* interceptor. --> 171 <interceptor-stack name="executeAndWaitStack"> 172 <interceptor-ref name="execAndWait"> 173 <param name="excludeMethods">input,back,cancel</param> 174 </interceptor-ref> 175 <interceptor-ref name="defaultStack"/> 176 <interceptor-ref name="execAndWait"> 177 <param name="excludeMethods">input,back,cancel</param> 178 </interceptor-ref> 179 </interceptor-stack> 180 181 </interceptors> 182 183 <default-interceptor-ref name="defaultStack"/> View Code- params攔截器
這個攔截器是必不可少的,因為就是由它偷偷的把請求參數設置到相應的Action的屬性去的,并自動進行類型轉換。
- staticParams攔截器
將struts.xml配置文件里定義的Action參數,設置到對應的Action實例中,Action參數使用<param>標簽,是<action>標簽的子元素。struts.xml的示例如下:
<action name="helloworldAction" class="cn.javass.action.action.HelloWorldAction"> <param name="account">test</param> </action>這要求Action中一定要有一個account的屬性,并有相應的getter/setter方法。運行的時候,Action的account屬性在初始化過后,會接到這里的賦值“test”。
注意:params攔截器和staticParams攔截器都會為Action的屬性賦值,如果碰到了都要賦同一個值呢,比如request里面有account參數,而struts.xml中也有account參數,最終的值是誰?其實是Action初始化過后,就會把struts.xml中配置的數據設置到Action實例中相應的屬性上去。然后,把用戶請求的數據設置到Action實例中相應的屬性上去。很明顯最后的值是用戶請求中account的數據。
- timer攔截器
該攔截器可以記錄ActionInvocation余下部分執行的時間,并做為日志信息記錄下來,便于尋找性能瓶頸。也就是說,該攔截器可以記錄Action運行的時間。
- logger攔截器
在日志信息中輸出要執行的Action信息 ,這樣,在調試的時候,就能很快的定位到這個對應的Action了。
2)攔截器配置說明
- <interceptor>元素用來定義一個攔截器,這里僅僅是一個定義,還沒有任何一個Action來引用它。里面的name屬性作為唯一標志,而class屬性就是這個攔截器的實現類。攔截器的實現類都應該是com.opensymphony.xwork2.interceptor.Interceptor這個接口的實現類。
-
<interceptor-stack>定義了一個攔截器棧,這個棧中可以引用其他已經定義好的攔截器。攔截器棧簡化了動作類Action在引用攔截器時的操作。
因為大多數動作類Action在引用攔截器的時候都不會僅僅引用一個攔截器,而是引用一組攔截器,而多個動作類Action大概又會引用同一組攔截器,這時候,為了引用的方便,可以把多個攔截器組合成一個攔截器棧。Action在引用的時候,只需要引用這個攔截器棧就可以了,而不是引用每一個攔截器。下面看一下struts-2.1.dtd對于<action>元素的定義:
action元素后面出現的interceptor-ref子元素后面用*來修飾,這說明一個action元素可以有不限個數的interceptor-ref子元素。那么在<action>元素中,如何使用<interceptor-ref>子元素呢?其實很簡單,只需要在<action>元素中,配置需要的<interceptor-ref>子元素就可以了,<interceptor-ref>子元素里面配置需要使用的攔截器的名稱,比如:
<action name="helloworldAction" class="cn.javass.action.action.HelloWorldAction"> <param name="account">test</param> <result>/s2impl/welcome.jsp</result> <interceptor-ref name="staticParams"/> <interceptor-ref name="defaultStack"/> </action><interceptor-ref>子元素中的name,不僅僅可以是一個已經定義好的攔截器的名稱,還可以是一個已經定義好的攔截器棧的名稱。上面的示例,就引用了一個攔截器和一個攔截器棧。
- <default-interceptor-ref>在包上聲明包內所有的Action都使用的攔截器
先看一下struts-2.1.dtd對于<package>元素的定義:
<!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, default-class-ref?, global-results?, global-exception-mappings?, action*)>其實,在配置自己的package的時候所擴展的struts-default包里面,就已經定義了一個<default-interceptor-ref>,在Struts-default.xml中定義的struts-default包內,有如下定義:
<default-interceptor-ref name="defaultStack"/>正是因為有這個定義,我們都沒有主動去配置攔截器,但實際上,是有攔截器在運行并執行很重要的工作,只不過是使用的默認的攔截器,我們不知道罷了。
3)攔截器的調用順序
在學習了預定義攔截器的配置使用之后,接下來看看<action>元素引用攔截器的調用順序。在拿到一個動作類的聲明<action>元素后,如何找到它引用的攔截器呢?
1:首先,要找它自己有沒有聲明攔截器的引用,即<action>元素有沒有<interceptor-ref>子元素,如果有,則不用繼續再找,直接使用這些攔截器,如果沒有,下一步。
2:其次,找這個<action>所在的包有沒有聲明默認的攔截器引用,即<package>元素的<default-interceptor-ref>子元素, 如果有,則不用繼續再找,直接使用這些攔截器,如果沒有,下一步。
?????? 3:最后,遞歸地尋找這個包的父包有沒有聲明默認的攔截器引用,直到找到有攔截器引用就為止。
???????特別注意:這三個地方的定義是覆蓋的關系,什么意思呢?就是如果<action>里面聲明了攔截器引用,那么就以它的為準,其他的定義就無效了。也即是<action>里面的攔截器引用聲明會覆蓋<package>里面的缺省攔截器聲明,而<package>里面的缺省攔截器聲明又會覆蓋父包的<package>里面的缺省攔截器聲明,以此類推。
4)全局攔截器的配置
<package name="helloworld" extends="struts-default"> <interceptors> <interceptor-stack name="myStack"> <interceptor-ref name="timer"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack"/> <action name="helloworldAction" class="cn.javass.hello.struts2impl.action.HelloWorldAction"> <result name="toWelcome">/${folder}/welcome.jsp</result> <result name="input">/${folder}/login.jsp</result> </action> </package>參考資料:http://www.iteye.com/topic/1124526
轉載于:https://www.cnblogs.com/ningvsban/p/3735639.html
總結
以上是生活随笔為你收集整理的【struts2】预定义拦截器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 点云数据格式说明
- 下一篇: 解决Unity中文显示乱码问题