熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

J2EE中的設計模式

2013-11-23 19:48:17  來源: Java高級技術 

  什麼是Design Patten?
  簡單來說Design Patten 就是一個常用的方案 在我們的開發過程中經常會遇到一些相同或者相近的問題每次我們都會去尋找一個新的解決方法為了節省時間提高效率我們提供一些能夠解決這些常見問題的被證實可行的方案構成一個統一的資源庫
  一個Design Patten描述了一個被證實可行的方案這些方案非常普通是有完整定義的最常用的模式 這些模式可以被重用有良好的伸縮性而這些Design Patten的優勢將在設計JEE應用時得到體現
   ModelViewController
  a 問題
  如果開發一個企業級應用只需要一種客戶端的話那麼一切都非常容易解決但真實情況是我們必須面對運行在各種設備上客戶端象PDAWAP浏覽器以及運行在桌面上的浏覽器我們不得不開發不同的應用程序來處理來自不同客戶端的請求數據訪問與現實將混淆在一起可能會出現重復的數據訪問導致整個開發周期沒有必要的延長
  b 建議的解決方法
  ModelViewController (MVC) 開發模式被證明是有效的處理方法之一它可以分離數據訪問和數據表現你可以開發一個有伸縮性的便於擴展的控制器來維護整個流程如圖所示為整個模式的結構MVC模式可以被映射到多層企業級的JEE應用上
  § 所有的企業數據以及商業邏輯可以作為模式
  § 視圖可以通過模式訪問數據並根據客戶端的要求來顯示數據視圖必須保證當模式改變的時候數據顯示也必須同時改變
  § 控制器用來結合模式和視圖把客戶端來的請求轉換成模式能夠理解並執行的請求並且根據請求以及執行結果來決定下一次顯示那一個視圖
  根據以上的邏輯你可以象這樣建立一個應用
  § 應用的商業邏輯由MVC中的模式也就是EJB來表現模式必須處理由控制器傳遞過來的對數據的訪問請求
  § 多個頁面組成了MVC中的視圖這些視圖必須隨模式一起更新
  § 控制器是一系列接收用戶動作的對象他們把用戶的請求轉換成模式可理解的請求並決定顯示那一個頁面當模式處理完請求後
  c 要點
  § MVC結構適用於那些多用戶的可擴展的可維護的具有很高交互性的系統
  § MVC可以很好的表達用戶的交互和系統模式
  § 很方便的用多個視圖來顯示多套數據是系統很方便的支持其他新的客戶端類型
  § 代碼重復達到最低
  § 由於分離了模式中的流控制和數據表現可以分清開發者的責任另外也可以加快產品推向市場的時間
   Front Controller
  a 問題
  MVC給出了一個整個應用的松散的耦合架構現在來看一下這樣一個經常發生的情況在某一個應用中用戶看到的視圖和他所做的操作密切相關這是一些具有高度交互性的頁面而這些頁面之間含有高度的依賴性在沒有任何模式的時候這個應用只是一個許多獨立的頁面的集合維護和擴展變得異常困難
  § 當一個頁面移動後其他含有這個頁面鏈接的文件都必須修改
  § 當有一系列頁面需要口令保護時許多配置文件需要修改或者頁面需要包含新的標記
  § 當一個頁面需要一個新的表示層時頁面中的標記要被重新安排
  當這個系統變得復雜時這些問題將變得更糟如果用MVC來解決的話就變成一個如何管理控制器和視圖之間交互的問題
  b 建議的解決方法
  前台控制模式可以解決這個問題這個模式中所有的請求都被傳送到一個對象中這個主要的對象將處理所有的請求決定以後顯示那一個視圖以及實現必要的安全需求對於把視圖顯示以及其他功能實現集中到一個主要的對象中將使修改變得很容易對應用的修改可以在所有視圖中反映出來
  c 要點
  § 這個模式對於需要在多個含有動態數據的頁面之間進行復雜導航的系統來說是很有效的
  § 這個模式對於要在所有頁面中都包含模板轉換等的應用來說也是很有效的
  § 由於視圖的選擇集中在前端控制器上因此視圖的導航變得更加容易理解和便於配置
  § 視圖重用和變更會更加容易
  § 視圖之間的復雜交互使得控制器變得復雜從而當應用發展的時候控制器將變得難以維護不過大部分情況下可以用XML映射來解決
  § 實現應用要求的安全性檢驗變得很簡單
  § 這個模式不適合小型的只顯示靜態內容的應用
  d 樣例
  § RequestMappingsxml 文件映射了傳入的請求處理器以及下一個頁面
  useRequestHandler=true
  requiresSecurityCheck=true nextScreen=screenjsp>
  comblahblahblahrequestHandler
  以上這個文件是控制器的指定配置控制器的代碼如下
  § FrontControllerImpljava 利用上面的XML實現了控制器
  // all required imports
  // exceptions to be caught appropriately wherever applicable
  public class FrontControllerImpl extends HttpServlet {
  // all required declarations definitions
  private HashMap requestMappings;
  public void init() {
  // load the mappings from XML file into the hashmap
  public void doPost(HttpServletRequest request
  HttpServletResponse response)
  throws IOException ServletException
  {
  doGet(request response);
  }
  public void doGet(HttpServletRequest request HttpServletResponse response)
  throws IOException ServletException {
  String currentPage= requestgetPathInfo();
  // get all mapping info for currentPage from the hashmap
  // if securityCheckRequired = true do the security check
  // if useRequestHandler = true pass on the incoming request to the specified handler
  // forward the results to the given nextScreen
  }
  }
  用這種方法實現的控制器將很容易維護當應用有新的變動的時候只要修改XML文件就能解決了前台控制模式將使在視圖和控制器之前有復雜交互的JEE應用變得簡單
   Session Fa?ade
  a 問題
  前台控制給出了一個基於MVC的能有效管理用戶與JEE應用之間進行的復雜交互這個模式可以使處理頁面的現實順序和用戶的並發請求變得簡單並且使增加和改變頁面現實變得更加容易
  另外一個常見的問題是當EJB或者業務邏輯發生變化的時候應用的客戶端也必須隨之改變我們來看一下這個問題
  一般來說為了表現一個賬戶中的用戶我們使用一個業務邏輯來表示賬戶中的信息象用戶名和口令再用一個EJB來管理用戶的個人信息象愛好語言等當要創建一個新的賬號或者修改一個已經存在的賬號時必須訪問包含賬號信息的EJB讀取個人信息修改並且保存這樣的一個流程
  當然這只是一個非常簡單的例子實際情況可能比這個復雜的多象查看用戶定制了哪些服務檢驗客戶信用卡的有效性存放訂單等在這個案例中為了實現一個完整的流程客戶端必須訪問賬戶EJB來完成一系列適當的工作下面的例子顯示了一個Servlet客戶端如何來控制一個用戶訂單
  A servlet that does the workflow required for placing an order
  
  // all required imports;
  // exceptions to be caught appropriately wherever applicable;
  // This servlet assumes that for placing an order the account and
  // credit status of the customer has to be checked before getting the
  // approval and committing the order For simplicity the EJBs that
  // represent the business logic of account credit status etc are
  // not listed
  
  public class OrderHandlingServlet extends HttpServlet {
  
  // all required declarations definitions
  
  public void init() {
  // all inits required done here
  }
  
  public void doPost(HttpServletRequest request HttpServletResponse response)
  throws IOException ServletException {
  // other logic as required
  // Get reference to the required EJBs
  InitialContext ctxt = new InitialContext();
  Object obj = ctxtlookup(java:comp/env/ejb/UserAccount);
  UserAccountHome acctHome = (UserAccountHome)
  PortableRemoteObjectnarrow(obj UserAccountHomeclass);
  UserAccount acct = acctHomecreate();
  obj = ctxtlookup(java:comp/env/ejb/CreditCheck);
  CreditCheckHome creditCheckHome = (CreditCheckHome)
  PortableRemoteObjectnarrow(obj CreditCheckHomeclass);
  CreditCheck credit = creditCheckHomecreate();
  obj = ctxtlookup(java:comp/env/ejb/Approvals);
  ApprovalsHome apprHome = (ApprovalsHome)
  PortableRemoteObjectnarrow(obj ApprovalsHomeclass);
  Approvals appr = apprHomecreate();
  obj = ctxtlookup(java:comp/env/ejb/CommitOrder);
  CommitOrderHome orderHome = (CommitOrderHome)
  PortableRemoteObjectnarrow(obj CommitOrderHomeclass);
  CommitOrder order = orderHomecreate();
  // Acquire the customer ID and order details;
  // Now do the required workflow to place the order
  int resul
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27475.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.