在web.xml文件里配置一個派遣器ServletDispatcher,以接收所有以action結(jié)尾的url請求。并進(jìn)行http請求調(diào)度處理.
<servlet>
<servlet-name></servlet-name>
<servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>webwork</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
當(dāng)ServletDispatche調(diào)度器接收到一個.action結(jié)尾的請求時,會調(diào)用ServletDispatche類的service方法進(jìn)行處理,該方法最終是創(chuàng)建一個ActionProxy對象,并通過執(zhí)行ActionProxy中的execute方法來
調(diào)用所請求的Action的execute方法.之前要執(zhí)行一些方法來創(chuàng)造條件:創(chuàng)建Action上下文===>從request中獲得值堆棧stack===>創(chuàng)建ActionProxyFactory對象,并初始化一個DefaultActionProxy對象====>通過DefaultAction的構(gòu)造函數(shù)調(diào)用ConfigurationManager獲得當(dāng)前請求的Action在xwork.xml中的配置信息====>DefaultActionProxy中的prepare方法通過創(chuàng)建一個ActionInvocation對象來實現(xiàn)對請求action的調(diào)用。
AroundInterceptor攔截機-->
DefaultActionInvocation中有一個數(shù)組維護(hù)了攔截機的執(zhí)行順序:
1、StaticParametersInterceptor, 2、ParametersInterceptor, 3、WebWorkConversionErrorInterceptor
4、ModelDrivenInterceptor 5、ExternalReferencesInterceptor
6、StaticParametersInterceptor 7、parametersInterceptor, 8、WebWorkConversionErrorInterceptor
9、ModelDrivenInterceptor 10、ValidationInterceptor
注:這里1、2、3、4攔截機執(zhí)行了兩次,為什么會執(zhí)行兩次呢?
疑問:這里的執(zhí)行順序和webwork-default.xml中的<interceptors>配置有何關(guān)聯(lián)?
Action ---> 根據(jù)Action實現(xiàn)相應(yīng)的Action,ModelDriven接口調(diào)用基類的
ParametersInterceptor中:
final Map parameters = ActionContext.getContext().getParameters();
從AroundInterceptor的context中取出頁面提交字段的名稱和值,然后它會先把stack.pus(modelDriven.getModel()); modelDriven.getModel()放到CompoundRoot中(CompounRoot是一個ArrayList)上面提到有四個攔截機執(zhí)行兩次,因為第一次要push進(jìn)去一個空的對象,方便填值,第二次放的是填充好的對象。也就是Action中g(shù)etModel()的對象。把值從parameters 設(shè)置到OgnlValueStack的CompoundRoot的第一個下標(biāo)中的Action里的getModel()對象里code:stack.setValue(name, value);name對應(yīng)的是getModel()對應(yīng)的字段,value為要填充的值.