下面我们来看看ActionInvocation是如何工作的: ActionInvocation 是Xworks 中Action 调度的核心。而对Interceptor 的调度,也正是由ActionInvocation负责。 ActionInvocation 是一个接口, 而DefaultActionInvocation 则是Webwork 对ActionInvocation的默认实现。 Interceptor 的调度流程大致如下: 1. ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。 2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。 Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWork、WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。 那么什么是拦截器。 拦截器就是AOP(Aspect-Oriented Programming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。) 拦截器的例子这里就不展开了。 struts-default.xml文件摘取的内容: < 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 ="createSession" class ="org.apache.struts2.interceptor.CreateSessionInterceptor"/> < interceptor name ="debugging" class ="org.apache.struts2.interceptor.debugging.DebuggingInterceptor"/> < interceptor name ="external-ref" class ="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/> < 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 ="model-driven" class ="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> < interceptor name ="scoped-model-driven" class ="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/> < interceptor name ="params" class ="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/> < interceptor name ="prepare" class ="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/> < interceptor name ="static-params" class ="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/> < interceptor name ="scope" class ="org.apache.struts2.interceptor.ScopeInterceptor"/> < interceptor name ="servlet-config" class ="org.apache.struts2.interceptor.ServletConfigInterceptor"/> < interceptor name ="sessionAutowiring" class ="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/> < interceptor name ="timer" class ="com.opensymphony.xwork2.interceptor.TimerInterceptor"/> < interceptor name ="token" class ="org.apache.struts2.interceptor.TokenInterceptor"/> < interceptor name ="token-session" class ="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/> < interceptor name ="validation" class ="com.opensymphony.xwork2.validator.ValidationInterceptor"/> < 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"/>