通過Struts應用MVC設計模型
2024-07-21 02:15:14
供稿:網友
 
  模型--視圖--控制器(model-view-controller,mvc)體系突出了servlets和jsp的優點,同時也令它們的缺點最小化。在實現中,用戶請求被發送到一個控制器servlet,該servlet決定請求的性質,并且根據請求的類型傳送給適合的處理器。每個處理器都和一個特別的模型相關,里面封裝有商業邏輯來執行一些特別的函數集合。處理完畢后,結果會發送回處理器,處理器選擇適合的視圖顯示它。
  struts最早于2002年5月作為jakarta項目的組成部分問世,jakata項目由apache foundation.運做。項目的創立者希望該項目的研究改進和提高java server pages (jsps)、servlet、標簽庫以及面向對象的技術水準。struts為使用mvc體系來編寫應用提供了一個架構。struts使用“actionmapping”,它允許servlet將用戶的請求轉變為應用行為。actionmapping通常指定一個請求的路徑、在請求上進行動作的對象類型,以及指定其它需要的屬性。
  action對象作為actionmapping的一個部分使用,負責處理請求,并且發送響應回適合的視圖(通常是一個web瀏覽器),或者傳送請求至適合的模型。
  在模型和視圖間的橋是一個form bean,它可以通過繼承org.apache.struts.action.actionform得到。form bean用來保存處理前的用戶數據,或者顯示返回給用戶的模型數據。struts包含有自定義的標簽,它可以由創建的form bean中自動組合字段。
  在實踐中用戶請求jsp頁面,控制器servlet接收請求并決定由哪個應用處理它。action對象傳送該請求到包含有接收商業邏輯的javabean中。商業邏輯bean將連接數據庫并進行查詢,接收結果,然后返回結果給action對象。action對象將結果作為請求的一部分存放到一個form bean中。一旦收集完請求的全部數據,就可以格式化結果并且顯示。最后是javaserver page以html表格的形式將結果顯示出來。
  模型,控制器和視圖
  struts中的控制器的基本組件是actionservlet類中定義的servlet,它是由actionmappings定義的。actionmapping類表示的是action對象的名字和位置。當一個請求進入控制器時,它將請求的路徑映射到action的位置,并且將請求傳送給action。struts的actionmapping類還可能包含有其它的信息,這些信息可能只是與你的應用相關,例如本地變量,環境變量或者其它uris。
  struts的關鍵是控制器周圍的活動。struts控制器servlet映射事件到類(一個事件通常是一個http post, get,或者類似的請求)。actionservlet是mvc設計模型的司令部,也是structs架構的核心。actionservlet創建和使用action,一個actionform和actionforward。struts-config.xml是用來設置action的。在創建web應用期間,采用擴展action和actionform來解決如何響應用戶請求的問題。struts-config.xml則是告訴actionservlet如何使用擴展類。也可擴展actionservlet以令structs應用帶有一些自定義的特性。
  這個方法有幾個優點。首先,應用的整個邏輯流都是在一個分等級的文本文件中。這樣就可以比較容易地查看、理解應用,特別是大的應用。第二,編寫網頁的人在修改網頁時就無需遍歷java代碼來理解應用的流程,而java開發者在改變流程的時候也無需重新編譯代碼。
  actionform為web應用維護session狀態。actionform是一個抽象類,它可以被每個輸入表格模型擴展。它代表數據的一般概念,可以被html表格設置或者更新。例如,你的應用也許擁有一個被html表格設置的useractionform。struts的架構將檢查useractionform是否存在,如果不存在,就會創建一個該類的實例。structs將會使用httpservletrequest的相應字段來設置useractionform的狀態。在傳送useractionform給商業封裝層的useraction前,struct架構先更新useractionform的狀態。
  structs模型包含有系統的狀態和它可以接受的操作。可以使用各種各樣的結構來表示模型(例如其它servlets或者jsp),不過在大多數的時候你都會使用javabeans。javabean的屬性,或者在enterprise javabeans (ejbs)中由外部數據源得到的數據--表示的是狀態,而方法則是表示可以在上面進行的操作。操作并不需要被javabean方法定義;在簡單的情況下,操作可以放置到action對象中,雖然這樣會令處理和分級之間的區別變得模糊。
  struts mvc應用的視圖通常由jsp構造,它可以使用html或者xml靜態格式化頁面,還提供了一個方法可動態插入自定義的內容來響應用戶的請求。structs的一個關鍵是它的自定義標簽庫,它提供了一個方法,可以很容易地使用jsp來創建用戶界面。
  structs架構包含有自定義的標簽庫,可以通過各種不同的方式使用。雖然就使用該架構來說,這些庫并不是必須的,不過它們包含的標簽在你的應用的許多地方都很有用。structs的一些標簽庫包括有:
  . structs-html標簽庫。該庫可以用作創建動態html用戶界面或者表格。
  . structs-bean標簽庫。對于將javabean代碼放到jsp頁面,該庫提供了一個加強方式,通過 標簽實現。
  . struts-logic標簽庫。該庫可以管理有條件地產生輸出文本,遍歷對象collections以重復地產生輸出文本,還有應用流控制。
  . struts-template標簽庫。該庫包含的標簽可用作為頁面創建動態的jsp模板,這些頁面都擁有一個公共的外觀或者公同的格式。
  使用這些標簽庫和其它的任何庫都是一樣的。因為庫已經寫好了,你所要做的就是告訴servlet引擎要使用它。在tomcat中,你可以通過web.xml文件中的<taglib>標簽來指定標簽庫的uri,以及web服務器系統上標簽庫描述文件的位置。
  the small print
  jakarta工程可讓你下載structs的二進制版本,或者直接由源代碼中編譯它。二進制版工作得很好,不過如果你擁有一個不常見的軟件平臺,或者想學習一下如何編譯它,也不是很困難。無論你的選擇如何,structs都需要以下幾個軟件:
  . java development kit (jdk). 你需要為你的操作系統下載和安裝一個java 2 jdk實現。
  .servlet容器。你還需要下載和安裝一個兼容servlet api規范(2.2版以上)、jsp規范(1.1版以上)的servlet容器。一個好的選擇是下載apache的tomcat,它可以支持網頁服務,并且可以運行servlet和jsp。
  .xml解析器。struts需要一個兼容java api for xml parsing (jaxp)規范(1.1版或以上)的xml解析器。
  .servlet api類。為了編譯structs或者使用structs的應用,你將需要一個包含有servlet和jsp api類的servlet.jar文件。大部分的servlet容器都包含有這個jar文件。
  .jdbc 2.0 optional package類。structs支持javax.sql.datasource的一個可選實現,因此它需要這些api類來編譯。你可以在這個網址下載這些包類:http://java.sun.com/products/jdbc/download.html
  要使用structs來建立一個應用,需要遵從以下步驟。首先,將structs中的lib/commons-*.jar和 lib/struts.jar文件拷貝到應用中的web-inf/lib目錄。然后將structs中的全部標簽庫描述文件(lib/struts-*.tld)拷貝到你的web應用中的web-inf目錄。
  拷貝完這些文件后,你就可以修改web應用中的web.xml文件,令它包含有一個<servlet>元素來定義控制器servlet,還有一個<servlet-mapping>元素以指明哪個請求的uri被映射到這個servlet。如果你使用默認的目錄來進行一個標準的安裝,你可以使用struts例子應用中的web.xml文件來作為一個參考,看它是如何設置的,然后你就可以修改web應用中的web.xml文件來指定適當的標簽庫聲明。再次申明,你可以由structs的例子應用中學習如何設置。
  修改完web.xml文件后,在web-inf目錄創建一個稱為struts-config.xml的文件,在其中定義操作映射和其它與你的應用相關的特性。最后,在每個將使用struts自定義標簽的jsp頁面的頂部,加入struts自定義標簽的聲明。
  struts這個名字來源于在建筑和舊式飛機中使用的支持金屬架。它的目的是為了幫助你減少在運用mvc設計模型來開發web應用的時間。你仍然需要學習和應用該架構,不過它將可以完成其中一些繁重的工作。如果想混合使用servlets和jsp的優點來建立可擴展的應用,struct可以幫助你完成其中的一些工作。