waf是petstore中自帶的web tier的MVC框架,雖然比起struts等框架,功能要略顯簡單,而且也顯得過于冗余,但畢竟是一種很好的web層框架解決方案,還是值得我們研究一下的。
我是從源碼上入手的,可能會(huì)存在一些解釋錯(cuò)誤的地方,希望大家諒解!
waf包括在petstore(學(xué)習(xí)EJB的經(jīng)典實(shí)例)中,我是從sun download的,最新版本是1.3.2,在其自帶的doc里面有安裝說明。在提供的源代碼中包括了waf framework,我是把它放入jbuilder工程中進(jìn)行研究。
Waf framework實(shí)際包括倆部分,web tier和EJB tier,WebController作為這倆層之間訪問的proxy。Event(事件)作為這倆層交互時(shí)傳遞的對象,根據(jù)實(shí)際要求可以定義不同的事件對象,而作為EJB層也會(huì)提供對這些事件處理的業(yè)務(wù)方法。
waf包括一個(gè)mappings.xml的文件用于定義事件映射和url映射。
web tier:
在web tier包括一個(gè)Control(MainServlet),用于接收客戶端請求;一些繼承自HtmlAction的action處理類(Model部分),這個(gè)和struts里面是一樣的,這些action處理類用于處理不同的客戶端請求,用戶請求的url和action之間的映射在mappings.xml中定義。
action包括3個(gè)處理方法,doStart()、perform()、doEnd(),在perform()方法中,action除了進(jìn)行一些web層的處理外還要決定觸發(fā)哪個(gè)Event事件(即觸發(fā)商業(yè)層的什么操作),Control會(huì)根據(jù)action的返回事件通過proxy對象WebController對EJB tier進(jìn)行調(diào)用。
EJB tier:
和web tier一樣EJB tier也是MVC結(jié)構(gòu)的,包括Control(EJBControllerLocalEJB,一個(gè)local接口的會(huì)話bean)和Model(繼承自EJBAction的action類)。每一個(gè)action類負(fù)責(zé)處理一個(gè)或多個(gè)事件Event,這個(gè)也是在mappings.xml中進(jìn)行定義。在action當(dāng)中會(huì)調(diào)用業(yè)務(wù)邏輯層的EJB(通常是一些facsade EJB)進(jìn)行實(shí)際業(yè)務(wù)處理。
waf為了保證一個(gè)client端所進(jìn)行的所有業(yè)務(wù)處理可以是相關(guān)聯(lián)的,即允許保存各業(yè)務(wù)處理狀態(tài),還提供了狀態(tài)機(jī)StateMachine,用于保存業(yè)務(wù)操作時(shí)的處理狀態(tài)。
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.客戶端訪問系統(tǒng)。
2.在web.xml中定義的listener(servlet技術(shù),默認(rèn)為DefaultComponentManager)被激活,為當(dāng)前客戶端做初始化工作,包括創(chuàng)建EJB tier的代理對象WebController以及EJB tier的Control(EJBControllerLocalEJB,還包括當(dāng)前記錄當(dāng)前客戶端狀態(tài)的StateMachine。
3.客戶端發(fā)出xxx.do的請求。
4.web tier的Control(MainServlet)截獲這個(gè)請求,這個(gè)在web.xml中進(jìn)行定義。
5.MainServlet調(diào)用request處理類RequestProcessor進(jìn)行本次業(yè)務(wù)請求處理。
6.RequestProcessor會(huì)到mappings.xml文件中讀取這個(gè)請求對應(yīng)的action,然后依次調(diào)用action的doStart()、perform()、doEnd()方法。
7.action根據(jù)用戶的request來決定產(chǎn)生什么處理事件Event。
8.RequestProcessor將這個(gè)事件Event通過代理類WebController傳遞到EJB tier。
9.EJB tier的控制器EJBControllerLocalEJB捕獲到這個(gè)事件后首先到mappings.xml中檢索哪個(gè)EJBAction負(fù)責(zé)處理這個(gè)事件。
10.EJBControllerLocalEJB調(diào)用僅屬于當(dāng)前客戶端的StateMachine負(fù)責(zé)處理本次操作。
11.StateMachine依次調(diào)用EJBAction的doStart()、perform()、doEnd()方法。
12.EJBAction的perform()除了調(diào)用業(yè)務(wù)邏輯層的EJB對象的業(yè)務(wù)方法,比如一些使用了facasde模式的會(huì)話bean,還可以將業(yè)務(wù)處理結(jié)果存放到和一些狀態(tài)值存放到僅屬于當(dāng)前客戶端的StateMachine當(dāng)中。
至此整個(gè)處理過程完成。
從waf的源碼來看注釋顯得并不是很完善,因此對于理解帶來了一些困難。雖然我們不一定是要使用它,但了解一下它的架構(gòu)思想還是很有必要的。waf中采用的事件機(jī)制和struts顯然有所不同。
該帖由 sunyn 在 Jan 25, 2005 9:06 AM 編輯過