2005年12月6日
在web.xml文件里配置一个派遣器ServletDispatcher,以接收所有以action结尾的url请求。并进行http请求调度处理.
<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调度器接收到一个.action结尾的请求时,会调用ServletDispatche类的service方法进行处理,该方法最终是创建一个ActionProxy对象,并通过执行ActionProxy中的execute方法来
调用所请求的Action的execute方法.之前要执行一些方法来创造条件:创建Action上下文===>从request中获得值堆栈stack===>创建ActionProxyFactory对象,并初始化一个DefaultActionProxy对象====>通过DefaultAction的构造函数调用ConfigurationManager获得当前请求的Action在xwork.xml中的配置信息====>DefaultActionProxy中的prepare方法通过创建一个ActionInvocation对象来实现对请求action的调用。
AroundInterceptor拦截机-->
DefaultActionInvocation中有一个数组维护了拦截机的执行顺序:
1、StaticParametersInterceptor, 2、ParametersInterceptor, 3、WebWorkConversionErrorInterceptor
4、ModelDrivenInterceptor 5、ExternalReferencesInterceptor
6、StaticParametersInterceptor 7、parametersInterceptor, 8、WebWorkConversionErrorInterceptor
9、ModelDrivenInterceptor 10、ValidationInterceptor
注:这里1、2、3、4拦截机执行了两次,为什么会执行两次呢?
疑问:这里的执行顺序和webwork-default.xml中的<interceptors>配置有何关联?
Action ---> 根据Action实现相应的Action,ModelDriven接口调用基类的
ParametersInterceptor中:
final Map parameters = ActionContext.getContext().getParameters();
从AroundInterceptor的context中取出页面提交字段的名称和值,然后它会先把stack.pus(modelDriven.getModel()); modelDriven.getModel()放到CompoundRoot中(CompounRoot是一个ArrayList)上面提到有四个拦截机执行两次,因为第一次要push进去一个空的对象,方便填值,第二次放的是填充好的对象。也就是Action中getModel()的对象。把值从parameters 设置到OgnlValueStack的CompoundRoot的第一个下标中的Action里的getModel()对象里code:stack.setValue(name, value);name对应的是getModel()对应的字段,value为要填充的值.
posted @
2005-12-06 23:12 java驿馆 阅读(489) |
评论 (0) |
编辑 收藏