??xml version="1.0" encoding="utf-8" standalone="yes"?>
在web.xml文g里配|一个派遣器ServletDispatcherQ以接收所有以actionl尾的urlh。ƈq行httph调度处理.
<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>
当ServletDispatche调度器接收到一?actionl尾的请求时Q会调用ServletDispatchecȝserviceҎ(gu)q行处理,该方法最l是创徏一个ActionProxy对象Qƈ通过执行ActionProxy中的executeҎ(gu)?BR>调用所h的Action的executeҎ(gu).之前要执行一些方法来创造条Ӟ创徏Action上下?==>从request中获得值堆栈stack===>创徏ActionProxyFactory对象Qƈ初始化一个DefaultActionProxy对象====>通过DefaultAction的构造函数调用ConfigurationManager获得当前h的Action在xwork.xml中的配置信息====>DefaultActionProxy中的prepareҎ(gu)通过创徏一个ActionInvocation对象来实现对haction的调用?BR>
AroundInterceptor拦截?->
DefaultActionInvocation中有一个数l维护了拦截机的执行序Q?BR>1、StaticParametersInterceptor, 2、ParametersInterceptor, 3、WebWorkConversionErrorInterceptor
4、ModelDrivenInterceptor 5、ExternalReferencesInterceptor
6、StaticParametersInterceptor 7、parametersInterceptor, 8、WebWorkConversionErrorInterceptor
9、ModelDrivenInterceptor 10、ValidationInterceptor
注:q里1???拦截机执行了两次Qؓ什么会执行两次?
疑问Q这里的执行序和webwork-default.xml中的<interceptors>配置有何兌?
Action ---> Ҏ(gu)Action实现相应的Action,ModelDriven接口调用基类?BR>ParametersInterceptor中:
final Map parameters = ActionContext.getContext().getParameters();
从AroundInterceptor的context中取出页面提交字D늚名称和?然后它会先把stack.pus(modelDriven.getModel()); modelDriven.getModel()攑ֈCompoundRoot?CompounRoot是一个ArrayList)上面提到有四个拦截机执行两次Q因为第一ơ要pushq去一个空的对象,方便填|W二ơ放的是填充好的对象。也是Action中getModel()的对象。把gparameters 讄到OgnlValueStack的CompoundRoot的第一个下标中的Action里的getModel()对象里code:stack.setValue(name, value);name对应的是getModel()对应的字D,value填充的?