模型--視圖--控制器(Model-View-Controller,MVC)體系突出了Servlets和JSP的優(yōu)點(diǎn),同時(shí)也令它們的缺點(diǎn)最小化。在實(shí)現中,用戶(hù)請求被發(fā)送到一個(gè)控制器servlet,該servlet決定請求的性質(zhì),并且根據請求的類(lèi)型傳送給適合的處理器。每個(gè)處理器都和一個(gè)特別的模型相關(guān),里面封裝有商業(yè)邏輯來(lái)執行一些特別的函數集合。處理完畢后,結果會(huì )發(fā)送回處理器,處理器選擇適合的視圖顯示它。
Struts最早于2002年5月作為Jakarta項目的組成部分問(wèn)世,Jakata項目由Apache Foundation.運做。項目的創(chuàng )立者希望該項目的研究改進(jìn)和提高Java Server Pages (JSPs)、servlet、標簽庫以及面向對象的技術(shù)水準。Struts為使用MVC體系來(lái)編寫(xiě)應用提供了一個(gè)架構。Struts使用“ActionMapping”,它允許servlet將用戶(hù)的請求轉變?yōu)閼眯袨?。ActionMapping通常指定一個(gè)請求的路徑、在請求上進(jìn)行動(dòng)作的對象類(lèi)型,以及指定其它需要的屬性。
Action對象作為ActionMapping的一個(gè)部分使用,負責處理請求,并且發(fā)送響應回適合的視圖(通常是一個(gè)Web瀏覽器),或者傳送請求至適合的模型。
在模型和視圖間的橋是一個(gè)form bean,它可以通過(guò)繼承org.apache.struts.action.ActionForm得到。form bean用來(lái)保存處理前的用戶(hù)數據,或者顯示返回給用戶(hù)的模型數據。Struts包含有自定義的標簽,它可以由創(chuàng )建的form bean中自動(dòng)組合字段。
在實(shí)踐中用戶(hù)請求JSP頁(yè)面,控制器servlet接收請求并決定由哪個(gè)應用處理它。Action對象傳送該請求到包含有接收商業(yè)邏輯的JavaBean中。商業(yè)邏輯bean將連接數據庫并進(jìn)行查詢(xún),接收結果,然后返回結果給Action對象。Action對象將結果作為請求的一部分存放到一個(gè)form bean中。一旦收集完請求的全部數據,就可以格式化結果并且顯示。最后是JavaServer Page以HTML表格的形式將結果顯示出來(lái)。
模型,控制器和視圖
Struts中的控制器的基本組件是ActionServlet類(lèi)中定義的servlet,它是由ActionMappings定義的。ActionMapping類(lèi)表示的是Action對象的名字和位置。當一個(gè)請求進(jìn)入控制器時(shí),它將請求的路徑映射到Action的位置,并且將請求傳送給Action。Struts的ActionMapping類(lèi)還可能包含有其它的信息,這些信息可能只是與你的應用相關(guān),例如本地變量,環(huán)境變量或者其它URIs。
Struts的關(guān)鍵是控制器周?chē)幕顒?dòng)。Struts控制器servlet映射事件到類(lèi)(一個(gè)事件通常是一個(gè)HTTP POST, GET,或者類(lèi)似的請求)。ActionServlet是MVC設計模型的司令部,也是Structs架構的核心。ActionServlet創(chuàng )建和使用Action,一個(gè)ActionForm和ActionForward。struts-config.xml是用來(lái)設置Action的。在創(chuàng )建Web應用期間,采用擴展Action和ActionForm來(lái)解決如何響應用戶(hù)請求的問(wèn)題。struts-config.xml則是告訴ActionServlet如何使用擴展類(lèi)。也可擴展ActionServlet以令Structs應用帶有一些自定義的特性。
這個(gè)方法有幾個(gè)優(yōu)點(diǎn)。首先,應用的整個(gè)邏輯流都是在一個(gè)分等級的文本文件中。這樣就可以比較容易地查看、理解應用,特別是大的應用。第二,編寫(xiě)網(wǎng)頁(yè)的人在修改網(wǎng)頁(yè)時(shí)就無(wú)需遍歷Java代碼來(lái)理解應用的流程,而Java開(kāi)發(fā)者在改變流程的時(shí)候也無(wú)需重新編譯代碼。
ActionForm為Web應用維護session狀態(tài)。ActionForm是一個(gè)抽象類(lèi),它可以被每個(gè)輸入表格模型擴展。它代表數據的一般概念,可以被HTML表格設置或者更新。例如,你的應用也許擁有一個(gè)被HTML表格設置的UserActionForm。Struts的架構將檢查UserActionForm是否存在,如果不存在,就會(huì )創(chuàng )建一個(gè)該類(lèi)的實(shí)例。Structs將會(huì )使用HttpServletRequest的相應字段來(lái)設置UserActionForm的狀態(tài)。在傳送UserActionForm給商業(yè)封裝層的UserAction前,Struct架構先更新UserActionForm的狀態(tài)。
Structs模型包含有系統的狀態(tài)和它可以接受的操作??梢允褂酶鞣N各樣的結構來(lái)表示模型(例如其它servlets或者JSP),不過(guò)在大多數的時(shí)候你都會(huì )使用JavaBeans。JavaBean的屬性,或者在Enterprise JavaBeans (EJBs)中由外部數據源得到的數據--表示的是狀態(tài),而方法則是表示可以在上面進(jìn)行的操作。操作并不需要被JavaBean方法定義;在簡(jiǎn)單的情況下,操作可以放置到Action對象中,雖然這樣會(huì )令處理和分級之間的區別變得模糊。
Struts MVC應用的視圖通常由JSP構造,它可以使用HTML或者XML靜態(tài)格式化頁(yè)面,還提供了一個(gè)方法可動(dòng)態(tài)插入自定義的內容來(lái)響應用戶(hù)的請求。Structs的一個(gè)關(guān)鍵是它的自定義標簽庫,它提供了一個(gè)方法,可以很容易地使用JSP來(lái)創(chuàng )建用戶(hù)界面。
Structs架構包含有自定義的標簽庫,可以通過(guò)各種不同的方式使用。雖然就使用該架構來(lái)說(shuō),這些庫并不是必須的,不過(guò)它們包含的標簽在你的應用的許多地方都很有用。Structs的一些標簽庫包括有:
. structs-html標簽庫。該庫可以用作創(chuàng )建動(dòng)態(tài)HTML用戶(hù)界面或者表格。
. structs-bean標簽庫。對于將JavaBean代碼放到JSP頁(yè)面,該庫提供了一個(gè)加強方式,通過(guò) 標簽實(shí)現。
. struts-logic標簽庫。該庫可以管理有條件地產(chǎn)生輸出文本,遍歷對象collections以重復地產(chǎn)生輸出文本,還有應用流控制。
. struts-template標簽庫。該庫包含的標簽可用作為頁(yè)面創(chuàng )建動(dòng)態(tài)的JSP模板,這些頁(yè)面都擁有一個(gè)公共的外觀(guān)或者公同的格式。
使用這些標簽庫和其它的任何庫都是一樣的。因為庫已經(jīng)寫(xiě)好了,你所要做的就是告訴servlet引擎要使用它。在Tomcat中,你可以通過(guò)web.xml文件中的<taglib>標簽來(lái)指定標簽庫的URI,以及Web服務(wù)器系統上標簽庫描述文件的位置。
The Small Print
Jakarta工程可讓你下載Structs的二進(jìn)制版本,或者直接由源代碼中編譯它。二進(jìn)制版工作得很好,不過(guò)如果你擁有一個(gè)不常見(jiàn)的軟件平臺,或者想學(xué)習一下如何編譯它,也不是很困難。無(wú)論你的選擇如何,Structs都需要以下幾個(gè)軟件:
. Java Development Kit (JDK). 你需要為你的操作系統下載和安裝一個(gè)Java 2 JDK實(shí)現。
?。甋ervlet容器。你還需要下載和安裝一個(gè)兼容Servlet API規范(2.2版以上)、JSP規范(1.1版以上)的servlet容器。一個(gè)好的選擇是下載Apache的Tomcat,它可以支持網(wǎng)頁(yè)服務(wù),并且可以運行servlet和JSP。
?。甔ML解析器。Struts需要一個(gè)兼容Java API for XML Parsing (JAXP)規范(1.1版或以上)的XML解析器。
?。甋ervlet API類(lèi)。為了編譯Structs或者使用Structs的應用,你將需要一個(gè)包含有servlet和JSP API類(lèi)的servlet.jar文件。大部分的servlet容器都包含有這個(gè)JAR文件。
?。甁DBC 2.0 optional package類(lèi)。Structs支持javax.sql.DataSource的一個(gè)可選實(shí)現,因此它需要這些API類(lèi)來(lái)編譯。你可以在這個(gè)網(wǎng)址下載這些包類(lèi):http://java.sun.com/products/jdbc/download.html
要使用Structs來(lái)建立一個(gè)應用,需要遵從以下步驟。首先,將Structs中的lib/commons-*.jar和 lib/struts.jar文件拷貝到應用中的WEB-INF/lib目錄。然后將Structs中的全部標簽庫描述文件(lib/struts-*.tld)拷貝到你的Web應用中的WEB-INF目錄。
拷貝完這些文件后,你就可以修改Web應用中的web.xml文件,令它包含有一個(gè)<servlet>元素來(lái)定義控制器servlet,還有一個(gè)<servlet-mapping>元素以指明哪個(gè)請求的URI被映射到這個(gè)servlet。如果你使用默認的目錄來(lái)進(jìn)行一個(gè)標準的安裝,你可以使用Struts例子應用中的web.xml文件來(lái)作為一個(gè)參考,看它是如何設置的,然后你就可以修改Web應用中的web.xml文件來(lái)指定適當的標簽庫聲明。再次申明,你可以由Structs的例子應用中學(xué)習如何設置。
修改完web.xml文件后,在WEB-INF目錄創(chuàng )建一個(gè)稱(chēng)為struts-config.xml的文件,在其中定義操作映射和其它與你的應用相關(guān)的特性。最后,在每個(gè)將使用Struts自定義標簽的JSP頁(yè)面的頂部,加入Struts自定義標簽的聲明。
Struts這個(gè)名字來(lái)源于在建筑和舊式飛機中使用的支持金屬架。它的目的是為了幫助你減少在運用MVC設計模型來(lái)開(kāi)發(fā)Web應用的時(shí)間。你仍然需要學(xué)習和應用該架構,不過(guò)它將可以完成其中一些繁重的工作。如果想混合使用servlets和JSP的優(yōu)點(diǎn)來(lái)建立可擴展的應用,Struct可以幫助你完成其中的一些工作。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。