通過Struts應用MVC設計模型

javaprogramers發表於2006-05-13
模型--檢視--控制器(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可以幫助你完成其中的一些工作。

相關文章