積累,創造,分享!

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            25 Posts :: 13 Stories :: 26 Comments :: 0 Trackbacks
          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 編輯過

           

          posted on 2005-08-11 11:20 nighthawk 閱讀(850) 評論(0)  編輯  收藏 所屬分類: 分析與設計
          主站蜘蛛池模板: 广宁县| 游戏| 长治县| 麻城市| 水富县| 大冶市| 南投县| 沙坪坝区| 石河子市| 大港区| 安新县| 抚松县| 玉树县| 绥德县| 兰溪市| 呼伦贝尔市| 蒲江县| 漠河县| 黄浦区| 富川| 临安市| 博湖县| 舞阳县| 台湾省| 周口市| 丹棱县| 循化| 临湘市| 大化| 柳林县| 江阴市| 炉霍县| 东莞市| 凭祥市| 永德县| 镇康县| 陆丰市| 将乐县| 五台县| 吴堡县| 宾阳县|