waf是petstore中自带的web tier的MVC框架,虽然比起struts等框架,功能要略显简单,而且也显得过于冗余,但毕竟是一种很好的web层框架解决方案,还是值得我们研究一下的。
我是从源码上入手的,可能会存在一些解释错误的地方,希望大家谅解!
waf包括在petstore(学习EJB的经典实例)中,我是从sun download的,最新版本是1.3.2,在其自带的doc里面有安装说明。在提供的源代码中包括了waf framework,我是把它放入jbuilder工程中进行研究。
Waf framework实际包括俩部分,web tier和EJB tier,WebController作为这俩层之间访问的proxy。Event(事件)作为这俩层交互时传递的对象,根据实际要求可以定义不同的事件对象,而作为EJB层也会提供对这些事件处理的业务方法。
waf包括一个mappings.xml的文件用于定义事件映射和url映射。
web tier:
在web tier包括一个Control(MainServlet),用于接收客户端请求;一些继承自HtmlAction的action处理类(Model部分),这个和struts里面是一样的,这些action处理类用于处理不同的客户端请求,用户请求的url和action之间的映射在mappings.xml中定义。
action包括3个处理方法,doStart()、perform()、doEnd(),在perform()方法中,action除了进行一些web层的处理外还要决定触发哪个Event事件(即触发商业层的什么操作),Control会根据action的返回事件通过proxy对象WebController对EJB tier进行调用。
EJB tier:
和web tier一样EJB tier也是MVC结构的,包括Control(EJBControllerLocalEJB,一个local接口的会话bean)和Model(继承自EJBAction的action类)。每一个action类负责处理一个或多个事件Event,这个也是在mappings.xml中进行定义。在action当中会调用业务逻辑层的EJB(通常是一些facsade EJB)进行实际业务处理。
waf为了保证一个client端所进行的所有业务处理可以是相关联的,即允许保存各业务处理状态,还提供了状态机StateMachine,用于保存业务操作时的处理状态。
mappings.xm:
事件映射,用于EJB tier的处理:
<event-mapping>
<event-class>com.sun.j2ee.blueprints.waf.event.events.ChangeLocaleEvent</event-class>
<ejb-action-class>com.sun.j2ee.blueprints.waf.controller.ejb.action.actions.ChangeLocaleEJBAction</ejb-action-class>
</event-mapping>
url映射,用于web tier的处理:
<url-mapping url="changelocale.do" screen="locale_change_success.screen" >
<web-action-class>com.sun.j2ee.blueprints.waf.controller.web.action.actions.ChangeLocaleHTMLAction</web-action-class>
</url-mapping>
waf的处理过程如下:
1.客户端访问系统。
2.在web.xml中定义的listener(servlet技术,默认为DefaultComponentManager)被激活,为当前客户端做初始化工作,包括创建EJB tier的代理对象WebController以及EJB tier的Control(EJBControllerLocalEJB,还包括当前记录当前客户端状态的StateMachine。
3.客户端发出xxx.do的请求。
4.web tier的Control(MainServlet)截获这个请求,这个在web.xml中进行定义。
5.MainServlet调用request处理类RequestProcessor进行本次业务请求处理。
6.RequestProcessor会到mappings.xml文件中读取这个请求对应的action,然后依次调用action的doStart()、perform()、doEnd()方法。
7.action根据用户的request来决定产生什么处理事件Event。
8.RequestProcessor将这个事件Event通过代理类WebController传递到EJB tier。
9.EJB tier的控制器EJBControllerLocalEJB捕获到这个事件后首先到mappings.xml中检索哪个EJBAction负责处理这个事件。
10.EJBControllerLocalEJB调用仅属于当前客户端的StateMachine负责处理本次操作。
11.StateMachine依次调用EJBAction的doStart()、perform()、doEnd()方法。
12.EJBAction的perform()除了调用业务逻辑层的EJB对象的业务方法,比如一些使用了facasde模式的会话bean,还可以将业务处理结果存放到和一些状态值存放到仅属于当前客户端的StateMachine当中。
至此整个处理过程完成。
从waf的源码来看注释显得并不是很完善,因此对于理解带来了一些困难。虽然我们不一定是要使用它,但了解一下它的架构思想还是很有必要的。waf中采用的事件机制和struts显然有所不同。
该帖由 sunyn 在 Jan 25, 2005 9:06 AM 编辑过