structs2拦截器Word文档格式.docx
- 文档编号:16885589
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:17
- 大小:142.78KB
structs2拦截器Word文档格式.docx
《structs2拦截器Word文档格式.docx》由会员分享,可在线阅读,更多相关《structs2拦截器Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
ActionInvocation公开了一个invoke()方法,框架通过调用这个方法开始动作的执行。
当框架调用了这个方法时,ActionInvocation通过执行拦截器栈中的第一个拦截器开始这个调用过程。
需要注意的是,invoke()并不是总是指向拦截器栈的第一个拦截器,ActionInvocation负责跟踪执行过程达到的状态,并且把控制交给栈中合适的拦截器(通过调用拦截器的intercept()方法将控制权交给拦截器)。
通过递归调用(递归过程?
框架通过第一次调用ActionInvocation对象的invoke()方法开始了这个过程。
ActionInvocation通过调用拦截器的intercept()方法把控制权交给第一个拦截器。
重要的是,intercept()方法把ActionInvocation实例作为一个参数。
在拦截器的处理过程中,他会调用ActionInvocation实例参数的invoke()方法来继续调用后续拦截器的递归过程。
因此,在通常的执行中,调用过程向下通过所有拦截器,直到栈中再也没有拦截器时,触发动作。
另外,ActionInvocation在内部管理处理状态,因此它总是直到自己现在处在栈的什么位置。
)ActionInvocation的invoke()方法,拦截器栈中后续的拦截器继续执行,最终执行动作。
这是因为每一次invoke()方法被调用时,ActionInvocation都会查询自身的状态,调用接下来的拦截器。
在所有拦截器都被调用之后,invoke()方法会促使动作类执行。
下面看一个简单的例子,演示上面所说的理论:
TestAction
publicclassTestActionextendsActionSupport
{
privatestaticfinallongserialVersionUID=2753590609366162370L;
@Override
publicStringexecute()throwsException
{
System.out.println("
execute"
);
returnSUCCESS;
}
}
Interceptor1
publicclassIntercept1implementsInterceptor
privatestaticfinallongserialVersionUID=8596224826058233434L;
publicvoiddestroy()
publicvoidinit()
publicStringintercept(ActionInvocationinvocation)throwsException
interceptor1begin"
Stringresult=invocation.invoke();
interceptor1end"
returnresult;
Interceptor2
publicclassIntercept2implementsInterceptor
privatestaticfinallongserialVersionUID=-1580591331691823185L;
interceptor2begin"
interceptor2end"
Interceptor3
publicclassIntercept3implementsInterceptor
privatestaticfinallongserialVersionUID=7081124564804422023L;
interceptor3begin"
interceptor3end"
有三个自定以的拦截器,他们只是简单的输出几个字符串,拦截器开始将执行输出"
interceptor'
x'
begin"
;
拦截器结束时输出"
interceptor'
end"
将他们设置在一个指定的动作上
1<
interceptors>
2<
interceptorname="
interceptor1"
class="
com.test.suxiaolei.intercept.Intercept1"
>
<
/interceptor>
3<
interceptor2"
com.test.suxiaolei.intercept.Intercept2"
4<
interceptor3"
com.test.suxiaolei.intercept.Intercept3"
5
6<
interceptor-stackname="
myStack"
7<
interceptor-refname="
/interceptor-ref>
8<
9<
10<
defaultStack"
11<
/interceptor-stack>
12<
/interceptors>
13
14<
actionname="
test"
com.test.suxiaolei.action.TestAction"
15<
resultname="
success"
/index.jsp<
/result>
16<
17<
/action>
提交表单,控制台的输出结果:
interceptor1begin
interceptor2begin
interceptor3begin
execute
interceptor3end
interceptor2end
interceptor1end
从控制台输出的结果可以看出,在提交数据到框架时,框架调用拦截器的过程,首先框架会根据URL请求创建指定的动作TestAction,将TestAction的实例和TestAction相关的拦截器引用myStack放入一个新的ActionInvocation对象中(还包含其他信息),然后框架调用ActionInvocation的invoke()方法,此时开始了拦截器栈调用过程,最开始调用拦截器栈的第一个拦截器也就是Intercept1,拦截器执行完预处理后,因为intercept()方法接收一个ActionInvocation对象作为参数,在Intercept1.intercept()方法中继续调用ActionInvocation对象的invoke()方法将向下继续调用栈中余下的拦截器Intercept2...一直到栈中没有拦截器为止,最后执行动作组件。
在结果被呈现之后,拦截器会按照相反的顺序再触发一遍,使他们可以进行后处理。
拦截器工作原理图:
拦截器触发时能够做些什么?
1.做一些预处理。
在这个阶段拦截器可以用来准备、过滤、改变或者操作任何可以访问的重要数据。
这些数据包括所有与当前请求相关的关键对象和数据,也包括动作。
2.通过调用invoke()方法将控制转移给后续的拦截器,直到动作。
或者通过返回一个控制字符串中断执行。
在这个阶段,如果拦截器决定请求不应该继续,他可以不调用ActionInvocation实例上的invoke()方法,而是直接返回一个控制字符串。
通过这种方式可以停止后续的执行,并且决定哪个结果被呈现。
3.做一些后加工。
在这个阶段,任何一个返回的拦截器可以修改可以访问的对象的数据作为后加工,但是此时结果已经确定了。
怎么声明拦截器?
下面为Struts2为我们提供的struts-default.xml文件部分:
struts>
...
<
alias"
com.opensymphony.xwork2.interceptor.AliasInterceptor"
/>
autowiring"
com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"
chain"
com.opensymphony.xwork2.interceptor.ChainingInterceptor"
conversionError"
org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"
cookie"
org.apache.struts2.interceptor.CookieInterceptor"
clearSession"
org.apache.struts2.interceptor.ClearSessionInterceptor"
createSession"
org.apache.struts2.interceptor.CreateSessionInterceptor"
debugging"
org.apache.struts2.interceptor.debugging.DebuggingInterceptor"
execAndWait"
org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"
exception"
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"
fileUpload"
org.apache.struts2.interceptor.FileUploadInterceptor"
i18n"
com.opensymphony.xwork2.interceptor.I18nInterceptor"
logger"
com.opensymphony.xwork2.interceptor.LoggingInterceptor"
modelDriven"
com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"
scopedModelDriven"
com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"
params"
com.opensymphony.xwork2.interceptor.ParametersInterceptor"
actionMappingParams"
org.apache.struts2.interceptor.ActionMappingParametersInteceptor"
prepare"
com.opensymphony.xwork2.interceptor.PrepareInterceptor"
staticParams"
com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"
scope"
org.apache.struts2.interceptor.ScopeInterceptor"
servletConfig"
org.apache.struts2.interceptor.ServletConfigInterceptor"
timer"
com.opensymphony.xwork2.interceptor.TimerInterceptor"
token"
org.apache.struts2.interceptor.TokenInterceptor"
tokenSession"
org.apache.struts2.interceptor.TokenSessionStoreInterceptor"
validation"
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"
workflow"
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"
store"
org.apache.struts2.interceptor.MessageStoreInterceptor"
checkbox"
org.apache.struts2.interceptor.CheckboxInterceptor"
profiling"
org.apache.struts2.interceptor.ProfilingActivationInterceptor"
roles"
org.apache.struts2.interceptor.RolesInterceptor"
jsonValidation"
org.apache.struts2.interceptor.validation.JSONValidationInterceptor"
annotationWorkflow"
com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor"
multiselect"
org.apache.struts2.interceptor.MultiselectInterceptor"
!
--Basicstack-->
basicStack"
paramname="
excludeParams"
dojo\..*,^struts\..*<
/param>
--Samplevalidationandworkflowstack-->
validationWorkflowStack"
--SampleJSONvalidationstack-->
jsonValidationWorkflowStack"
excludeMethods"
input,back,cancel<
--Samplefileuploadstack-->
fileUploadStack"
--Samplemodel-drivenstack-->
modelDrivenStack"
--Sampleactionchainingstack-->
chainStack"
--Sample
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- structs2 拦截