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

JBuilder2005 Struts深度體驗之概述

2013-11-23 20:42:21  來源: Java開源技術 

  Struts是基於Model 實現的技術框架Model 是經典的MVC(ModelViewControl)模型的Web應用變體這個改變主要由於HTTP協議的無狀態性引起的Model 的目的和MVC一樣也是利用控制器來分離模型和視圖達到不同層間松散耦合的效果提高系統靈活性復用性和可維護性在多數情況下你可以將Model 與MVC等同起來
  
  圖 表示一個基於Java技術典型的MVC網絡應用從中可以看出MVC中的各個部分對應於JEE哪些實現技術
  
 

  
MVC和JEE技術

  
  在利用Model 之前我們把所有的表示邏輯和業務邏輯都集中在一起(如我們前兩個專題中的loginjsp)有時也稱這種應用模式為Model Model 的主要缺點就是緊耦合復用性差維護成本高
  
  由於Struts就是基於Model實現的框架所以它底層的機制也是MVC我們通過圖 描述Struts的具體實現
  
 

  
Struts MVC實現

  
  .框架初始化
  
  Struts框架總控制器(ActionServlet)完成所有初始化工作總控制器是一個Servlet它通過webxml配置成自動啟動的Servlet讀取配置文件(strutsconfigxml)的配置信息為不同的Struts模塊初始化相應的ModuleConfig對象配置文件中的Action映射定義都保存在ActionConfig集合中配置文件中其他配置信息分別保存在ControlConfig集合FormBeanConfig集合ForwardConfig集合和MessageResourcesConfig等集合中
  
  要特別指出的是初始化動作在Web容器啟動時自動完成初始化完成後它將通過URL匹配映射截獲所有以do結尾的URL請求
  
  .客戶端發送一個HTTP請求
  
  用戶通過提交表單或調用URL向Web應用程序器提交一個請求請求的數據用HTTP協議上傳給Web服務器
  
  .總控制器接截獲這個請求並實例化Form Bean
  
  控制器接收HTTP請求並從ActionConfig中找出對應該請求的Action子類如果沒有對應的Action控制器直接將請求轉發給JSP或者靜態頁面如果有對應的Action且這個Action有一個相應的Action FormActionForm被實例化並用HTTP請求的數據填充其屬性然後保存在Servlet Context中(request或session中)這樣它們就可以被其它Action對象或者JSP調用
  
  此外還可以在ActionForm填充數據後還可以調用validate()進行數據有效性自檢並且可以返回一個包含所有錯誤信息的ActionErrors對象如果ActionErrors不空總控制器直接將請求返回到入口頁面
  
  .控制器將請求轉交給具體的Action處理
  
  控制器根據配置信息將請求切換到具體的Action這個Form Bean也一並傳給這個Action的execute()方法
  
  .Action完成具體的業務邏輯操作
  
  Action很簡單一般只包含一個execute方法它負責執行相應的業務邏輯如果需要它也可能進行相應的數據檢查執行完成之後返回一個ActionForward對象控制器通過該ActionForward對象來進行轉發工作
  
  .Action返回目標響應對象給總控制器
  
  Action根據業務處理的不同結果返回一個目標響應對象給總控制器這個目標響應對象對應一個具體的JSP頁面或另外一個Action
  
  .總控制器將HTTP請求轉換到目標響應對象中
  
  總控制器根據業務功能Action返回的目標響應對象將HTTP請求轉換到這個目標響應對象中一般情況下它是一個具體的JSP頁面
  
  .目標響應對象將結果展現給用戶
  
  目標響應對象(JSP)將結果頁面展現給用戶
  
  客戶端發送一個HTTP請求通過Struts框架最後獲得一個HTTP響應這一過程非常重要它是理解Struts框架的重點描述了Struts框架的結構而圖 通過一個活動圖更具體描述接受請求直至返回響應的整個過程
  

  
Struts接受並返回響應的中間過程

  
  Struts新增功能
  
  多模塊的支持
  
  我們知道在Struts 只能在webxml中為ActionServlet指定一個Struts配置文件(strutsconfigxml)這對一個只需一兩個人開發的小系統當然沒有任何問題但如果一個多人開發的大中型應用程序問題就產生了因為許多開發人員可能同時都需要修改Struts配置文件這樣肯定會造成一定程度的資源爭奪可能會出現彼此覆蓋的情況這樣勢必會影響開發效率並引起開發人員的抱怨
  
  在Struts 為了解決這個並行開發的問題提出了兩種解決方案
  
  ·多個配置文件
  
  支持多個配置文件是指你能夠為ActionServlet同時指定多個xml配置文件文件之間以逗號分隔請看下面webxml中關於多個struts配置文件的聲明示例
  
  代碼清單 多個struts配置文件
  
   <servlet>
   <servletname>action</servletname>
   <servletclass>orgapachestrutsactionActionServlet</servletclass>
   <initparam>
   <paramname>config</paramname>
   <paramvalue>
   /WEBINF/strutsconfigxml /WEBINF/bookstrutsconfigxml
   </paramvalue>
   </initparam>
   <loadonstartup></loadonstartup>
   </servlet>
  
  通過這種方法你可以為每一個模塊定義一個配置文件由於項目一般按模塊劃分工作這樣就大大地減小了沖突的概率
  
  ·獨立的模塊
  
  但是多個配置文件存在一個潛在的問題不同的配置文件之間會產生沖突因為在ActionServlet初始化的時候多個配置文件還是要合並到一起比如在strutsconfigxml中配置了一個名為errorDbAccess的<exception>而在bookstrutsconfigxml中也配置了一個同樣的<exception>這樣就產生沖突了
  
  為了徹底解決這種沖突Struts 中引進了模塊(Module)的概念一個模塊就是一個獨立的子系統對應一個獨立的配置文件ActionServlet將不同模塊的配置文件保存在各自獨立的ModuleConfig對象中的
  
  下面是兩個獨立模塊的配置方式
  
  代碼清單 多模塊配置方式
  
  
   <initparam>
   <paramname>config</paramname>
   <paramvalue>/WEBINF/strutsconfigxml</paramvalue>
   </initparam>
   <initparam>
   <paramname>config/book</paramname>
   <paramvalue>/WEBINF/bookstrutsconfigxml</paramvalue>
   </initparam>
  
  
  通過這種方式我們配置了兩個模塊一個模塊名為config而另一個名為config/book
  
  ·動態ActionForm支持
  
  ActionForm表示HTTP頁面表單的數據可以將其看成視圖頁面數據的服務器映射它負責保存視圖中的數據供控制器或者其他視圖使用此外它還負責數據有效性的驗證所以Struts 文檔把它比作HTTP和Action之間的防火牆這足以體現ActionForm在視圖和控制器之間的過濾器作用
  
  由於ActionForm對應於HTTP頁面表單所以隨著頁面的增多你的ActionForm將會急聚增加動態ActionForm(DynaActionForm)即為減少ActionForm的數目被設計出來利用它你不必創建一個個具體的ActionForm類只需要在配置文件中配置出所需的虛擬ActionForm而由Struts框架通過配置文件動態創建這個ActionForm例如代碼清單 通過指定<formbean>的type為orgapachestrutsactionDynaActionForm來創建一個動態的ActionFormloginForm
  
  代碼清單 配置一個動態ActionForm
  
   <formbeans>
   <formbean name=bookForm type=orgapachestrutsactionDynaActionForm
   <formproperty name=bookId type=javalangString/>
   <formproperty name=isbn type=javalangString/>
   <formproperty name=bookName type=javalangString/>
   <formproperty name=author type=javalangString/>
   </formbean>
   </formbeans>
  
  DynaActionForm將屬性保存在一個Map對象中同時提供相應的get(name)和set(namevalue)方法其中參數name是要訪問的屬性名而value是一個Object例如要訪問DynaActionForm中bookName的值可以采用String bookName = (String)get(bookName)方法由於bookName存儲在Map中所以要進行強制轉換
  
  由於DynaActionForm通過配置文件產生並沒有一個實體對象類如果要對動態ActionForm對象進行校驗需要使用DynaValidatorForm它是DynaActionForm的子類它能夠提供動態ActionForm和動態表單輸入驗證的功能檢驗規則在validationxml配置文件中定義而這些規則的所對應的實現函數在validatorrulesxml文件中定義
  
  ·通過配置方式實現異常處理
  
  Struts允許以配置方式進行異常處理配置方式可以避免在Action中通過硬編碼來處理異常從而提高應用程序異常處理的靈活性和可維護性一般情況下一個異常處理對象可以通過以下步驟實現
  
  
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28937.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.