<b>阅读目录</b>
<a href="http://www.cnblogs.com/java-class/p/5155793.html#_label0">1.这部分框架类关系</a>
<a href="http://www.cnblogs.com/java-class/p/5155793.html#_label1">2.webwork 获取和包装 web 参数</a>
<a href="http://www.cnblogs.com/java-class/p/5155793.html#_label2">3.defaultactionproxyfactory、defaultactionproxy、defaultactioninvocation</a>
一路走来,终于要开始 webwork 核心业务类的总结,webwork 通过对客户端传递的 web 参数重新包装,进行执行业务 action 类,并反馈执行结果,本篇源码分析对应下图 webwork 框架流转图中红色框的地方。

每个web 框架或多或少的对 web 请求参数的包装,用来拿来方便自己使用,当然webwork 也不例外。
webwork 每次响应请求的入口方法:
接受 request 、response 参数,并对 request 参数进行封装,这次封装主要是针对多媒体请求进行的特殊处理,例如项目中的文件上传请求,导出各种类型文件等...
包装完 request 之后,service 方法调用 servletdispatche.serviceaction() 方法,并调用 getapplicationmap、getsessionmap、getrequestmap、 getparametermap、getactionname、getnamespace 6 个方法开始了action 业务逻辑调用前的前戏。
getnamespace 方法用来获得一个action所属的名称空间,例如 : "/my/myaction.action"则返回"/my",具体实现如下:
getactionname 返回请求的action的名字,例如:"myaction.action"则返回"myaction",具体实现如下:
getrequestmap 方法返回一个包含请求中所有属性的map,具体实现类是 requestmap,具体代码如下:
getparametermap 方法返回一个包含请求中所有参数的map,具体代码如下:
getsessionmap 方法返回一个包含 session 中所有属性的 map,具体实现类是 sessionmap,具体代码如下:
getapplicationmap 方法返回一个包含 application 中所有属性的map,具体实现类 是applicationmap,具体代码如下:
webwork之所以要把request 的属性、参数,session 中的属性,application 中的属性封装成 map,仅仅是为了自己使用方便。
首先 serviceaction 调用了createcontextmap 创建action 上下文(extracontext)。 它将javaservlet 相关的对象进行包装,放入extracontext map对象里。
接着检查 上一个请求中是否有可用的值堆栈,如果有就放入extracontext 这个map 对象里,供本次请求使用 。
actioncontext(com.opensymphony.xwork.actioncontext)是action执行时的上下文,上下文 可以看作是一个容器(其实我们这里的容器就是一个map 而已),它存放的是action 在执行时需要用到的对象。
servletactioncontext ( com.opensymphony.webwork. servletactioncontext),这个类直接继承了actioncontext,它提供了直接与javaservlet 相关象访问的功能。
ognlvaluestack主要的功能是通过表达式语言来存取对象的属性。
通过由前面获得的namespace、actionname、extracontext 创建调用代理 actonproxy 实例,这里也就是 defaultactionproxy,之后调用 了 actionproxy.execute 方法来执行我们逻辑action.execute。
actionproxy是一个接口,actionproxyfactory则是一个抽象类,默认情况下它们是通过 defaultactionproxy和defaultactionproxyfactory来完成操作的。
在 actionproxyfactory 中有一个静态变量 factory ,它指向的是一个 defaultactionproxyfactory 实例,代码如下:
defaultactionproxyfactory 的 createactionproxy 方法返回了 defaultactionproxy 实例。
defaultactionproxy的构造函数
将传入的名称空间、 action 的名字等参数赋予本地变量,接着通过 configurationmanager 获得当前请求的 action 的配置信息[这里在5中已经描述过]。接着调用自身的 prepare 方法创建一个 actioninvocation 对象赋予自身变量 invocation。在之后的 execute 方法中通过操纵invocation 来实现我们自己写的action 的调用。
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】
如果,您对我的博客内容感兴趣,请继续关注我的后续博客,我是【orson】
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段 声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载:http://www.cnblogs.com/java-class/p/5155793.html