隨筆 - 3, 文章 - 152, 評(píng)論 - 17, 引用 - 0
          數(shù)據(jù)加載中……

          Struts 的安裝、配置與運(yùn)行

          一、Struts的起源

            Struts最早是作為Apache Jakarta項(xiàng)目的組成部分,項(xiàng)目的創(chuàng)立者希望通過對(duì)該項(xiàng)目的研究,改進(jìn)和提高JavaServer Pages 、Servlet、標(biāo)簽庫以及面向?qū)ο蟮募夹g(shù)水準(zhǔn)。Struts這個(gè)名字來源于在建筑和舊式飛機(jī)中使用的支持金屬架。這個(gè)框架之所以叫"Struts",是為了提醒我們記住那些支撐我們房屋,建筑,橋梁,甚至我們踩高蹺時(shí)候的基礎(chǔ)支撐。這也是一個(gè)解釋Struts在開發(fā)Web應(yīng)用程序中所扮演的角色的精彩描述。當(dāng)建立一個(gè)物理建筑時(shí),建筑工程師使用支柱為建筑的每一層提供支持。同樣,軟件工程師使用Struts為業(yè)務(wù)應(yīng)用的每一層提供支持。它的目的是為了幫助我們減少在運(yùn)用MVC設(shè)計(jì)模型來開發(fā)Web應(yīng)用的時(shí)間。我們?nèi)匀恍枰獙W(xué)習(xí)和應(yīng)用該架構(gòu),不過它將可以完成其中一些繁重的工作。如果想混合使用Servlets和JSP的優(yōu)點(diǎn)來建立可擴(kuò)展的應(yīng)用,Struts是一個(gè)不錯(cuò)的選擇。

            早期Smalltalk 程序語言便采用了MVC(Model-View -Controller) 模式( Patterns ) 以增加程序代碼彈性,MVC模式將程序代碼整理切割為三部份,Model 部分是業(yè)務(wù)與應(yīng)用領(lǐng)域( Business domain) 相關(guān)邏輯、管理狀態(tài)之對(duì)象,Controller 部分接收來自View 所輸入的資料并與Model 部分互動(dòng),是業(yè)務(wù)流程控制( Flow Control) 之處,View 部分則負(fù)責(zé)展現(xiàn)資料、接收使用者輸入資料。在Java 應(yīng)用中,JFC/Swing、AWT、JSP 皆是可用作View 之技術(shù)規(guī)格,而JavaBean 與Enterprise JavaBean 規(guī)格則可用于Model 程序代碼,一旦應(yīng)用程序以MVC 模式加以適當(dāng)之分割,Model 部分程序代碼可在不同使用者接口外觀之應(yīng)用程序中重復(fù)使用。

            隨著JSP 與Servlet 技術(shù)大量應(yīng)用于以Web 為基礎(chǔ)之應(yīng)用程序,Java 開發(fā)人員群體認(rèn)為應(yīng)以較佳之模式以提升Web 應(yīng)用程序之可維護(hù)性與重復(fù)使用性。早期JSP 規(guī)格書中曾列舉兩種可行之JSP 應(yīng)用架構(gòu),分別為Model1 與Model 2。

            在Model 1 架構(gòu)中,JSP 直接處理Web 瀏覽器送來之請(qǐng)求( Request ),并輔以JavaBean 處理應(yīng)用相關(guān)邏輯。Model 1 架構(gòu)單純編寫比較容易,但在Model 1 中JSP 可能同時(shí)肩負(fù)View 與Controller 角色,兩類程序代碼有可能混雜而不易維護(hù)。而Model 2 中將Servlet 納入架構(gòu)中扮演前端Controller 角色,將Web 瀏覽器送出之請(qǐng)求集中送至Servlet ,Servlet 可集中管理使用者登入、權(quán)限控制、多國語言轉(zhuǎn)換等前置處理,再視需求轉(zhuǎn)向給對(duì)應(yīng)之JSP 處理。Model 2 中采用了較佳之MVC 模式,但增加了編寫復(fù)雜度。

            Struts是Apache軟件基金下Jakarta項(xiàng)目的一部分。除Struts之外,還有其他成功的開源產(chǎn)品,包括Tomcat, Ant 和Velocity。2000 年Craig R. McClanahan 先生貢獻(xiàn)了他編寫的JSP Model 2 架構(gòu)之Application Framework 原始程序代碼給Apache 基金會(huì),成為Apache Jakarta 計(jì)劃Struts Framework 前身。

            開始的代碼基礎(chǔ)從2000年5月開始開發(fā),直到2001年6月,1.0版本發(fā)布。有30 多個(gè)開發(fā)者參與進(jìn)來,并有數(shù)千人參與到討論組中。Struts 代碼基礎(chǔ)由一個(gè)志愿的Commnitter團(tuán)隊(duì)來管理。到2002年,Struts 小組共有9個(gè)志愿Commnitter。

            Struts框架的主要架構(gòu)設(shè)計(jì)和開發(fā)者是Craig R.McClanahan。Craig 也是Tomcat 4的主要架構(gòu)師,以及Java Web Services Developer Pack的主要架構(gòu)師和實(shí)現(xiàn)者。他現(xiàn)在是Sun的JavaServer Faces (JSR-127) 以及J2EE平臺(tái)的Web層架構(gòu)的規(guī)范領(lǐng)導(dǎo)。Craig R. McClanahan 先生是JCP ExpertGroup 成員之一,曾參與JSP 規(guī)格制定與Tomcat 4 之編寫,因此Struts Framework 廣受Java 開發(fā)人員群體所重視。Borland 自2002 年底開始于開發(fā)工具JBuilder 中支持Struts Framework。

          二、Struts安裝

            1、安裝Struts需要的軟件

            Java Development Kit-- 我們需要download和install 1.2(或之后)版本的JDK。

             下載地址:

             http://java.sun.com/j2se

            Servlet Container -- 通常的選擇是下載Tomcat(至少是3.1版,推薦使用4.0以上的版本)。

             下載地址:

             http://jakarta.apache.org/tomcat

            Ant Build System -- 如果我們通過Struts源碼發(fā)布包安裝,我們必須下載1.1或之后版本的ant build system。在我們通過Struts來開發(fā)我們自己的Web應(yīng)用程序是,推薦使用ant來build我們的應(yīng)用。

             下載地址:

             http://jakarta.apache.org/ant

            Servlet API Classes -- 為了編譯Structs自己,或應(yīng)用程序使用Struts,我們需要一個(gè)包含Servlet和JSP API對(duì)象的servlet.jar包。大多數(shù)Servlet container(例如Tomcat)已經(jīng)自帶了這個(gè)文件。否則,我們必需下載:http://jakarta.apache.org/builds/jakarta-servletapi

            XML Parser -- Structs需要一個(gè)與Java API for XML Parsing(JAXP)規(guī)格兼容的XML處理器,我們可以使用Xerces。

             下載地址:

             http://xml.apache.org/xerces-j

            Xalan XSLT Processor -- 如果我們通過Structs源碼發(fā)布版來構(gòu)造我們的Structs系統(tǒng),我們必須下載和安裝1_2_D01或之后版本的Xalan XSLT處理器(Xerces中已自帶Xalan)。這個(gè)處理器用于將基于XML的Structs文檔轉(zhuǎn)換為Html文檔。

            2、通過源碼構(gòu)造Structs

            1)下載Structs的源碼發(fā)布包。

            2)設(shè)置ANT_HOME環(huán)境變量,指向我們的Ant目錄。

            3)設(shè)置JAVA_HOME環(huán)境變量,指向我們的JDK目錄。

            4)設(shè)置SERVLETAPI_HOME環(huán)境變量,指向我們的Servlet API目錄(如果我們的CLASSPATH已經(jīng)包含了servlet.jar,就不需要指定該目錄)

            5)將Structs的源碼發(fā)布包進(jìn)行解包。

            6)進(jìn)入Structs目錄,運(yùn)行以下命令:

            ./build.sh dist

            該命令將創(chuàng)建Struts的二進(jìn)制發(fā)布包,目錄在../dist/structs(相對(duì)于我們的編譯目錄)。

            3、通過Struts的二進(jìn)制發(fā)布包安裝Structs

            1)下載Struts的二進(jìn)制發(fā)布版。

            2)將Struts的二進(jìn)制發(fā)布版進(jìn)行解包。(如果我們是通過Struts源碼構(gòu)造Struts,build的結(jié)果就已經(jīng)是已解包的Struts)。解包后的Struts包含以下內(nèi)容:

            lib/struts.jar -- 這個(gè)文件包含了Struts的所有Java對(duì)象。我們需要把它拷貝到我們的Web應(yīng)用的WEB-INF/lib目錄。

            lib/structs.tld --這是一個(gè)"tag library descriptor"文件,它描述了Struts庫的自由tag。需要將它拷貝到我們的Web應(yīng)用的WEB-INF目錄。

            webapps/struts-documentation.war -- 這是一個(gè)"web application archive"文件,包含了所有的Struts文檔。我們可以將它安裝到支持Servlet API 2.2或之后版本的servlet container(推薦使用tomcat)中。

            webapps/struts-example.war -- 這是一個(gè)web應(yīng)用實(shí)例,它廣泛地演示了Struts的許多功能。我們可以將它安裝到兼容Servlet2.2或之后版本以及JSP1.1或之后版本規(guī)范的servlet容器中(推薦使用tomcat)。
          webapps/struts-test.war -- 這個(gè)web應(yīng)用包含了Struts支持的許多tag的測試網(wǎng)頁,可以作為使用Struts tag的例子。

            4、Struts的基本組件包

            安裝好的struts大約有15包,近200個(gè)類所組成,而且數(shù)量還在不斷的擴(kuò)展。在此我們不能一一介紹,只能列舉幾個(gè)主要的簡要的介紹一下。下表說明了目前struts api中基本的幾個(gè)組件包,包括
          action,actions,config,util,taglib,validator。如下表1所示:

          org.apache.struts.action
           基本上,控制整個(gè)struts framework的運(yùn)行的核心類、組件都在這個(gè)包中,比如我們上面提到的控制器ActionServlet。已經(jīng)Action,ActionForm,ActionMapping等等。struts1.1比1.0多了 DynaActionForm 類。增加了動(dòng)態(tài)擴(kuò)展生成FormBean功能
          org.apache.struts.actions
           這個(gè)包是主要作用是提供客戶的http請(qǐng)求和業(yè)務(wù)邏輯處理之間的特定適配器轉(zhuǎn)換功能,而1.0版本中的部分動(dòng)態(tài)增刪FromBean的類,也在struts1.1中被Action包的DynaActionForm組件所取代
          org.apache.struts.config
           提供對(duì)配置文件struts-config.xml元素的映射。這也是sturts1.1中新增的功能
          org.apache.struts.util
           Strtuts為了更好支持web application的應(yīng)用,體統(tǒng)了一個(gè)些常用服務(wù)的支持,比如Connection Pool和Message Source。詳細(xì)信息請(qǐng)參考http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html
          org.apache.struts.taglib
           這不是一個(gè)包,而是是一個(gè)客戶標(biāo)簽類的集合。下面包括Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags這幾個(gè)用于構(gòu)建用戶界面的標(biāo)簽類。
          org.apache.struts.validator
           Struts1.1 framework中增加了validator framework,用于動(dòng)態(tài)的配置from表單的驗(yàn)證。詳細(xì)信息請(qǐng)參閱 http://home.earthlink.net/~dwinterfeldt/

          三、Struts 配置與組件介紹

            有關(guān)struts組件配置struts-config.xml文件說明在前面的文章中已經(jīng)介紹過,這里就不再說了,下面主要介紹框架中組件與配置。

            下表列出了Struts的核心類,即對(duì)應(yīng)的經(jīng)典的MVC組件職責(zé)。

            表格2 核心Struts 類和MVC 的對(duì)應(yīng)

          類 描述
          ActionForward 用戶指向或者視圖選擇
          ActionForm 狀態(tài)改變的數(shù)據(jù)
          ActionMapping 狀態(tài)改變事件
          ActionServlet 控制器,接受用戶請(qǐng)求和狀態(tài)改變,以及發(fā)出視圖選擇
          Action 控制器的一部分,于模型交互,執(zhí)行狀態(tài)改變或狀態(tài)查詢,以及告訴ActionServlet 下一個(gè)選擇的視圖

            除了這些核心類, Struts 使用一些配置文件和視圖助手(view helpers)來溝通控制器和模型。下表列出了Struts 配置文件和描述了他們?cè)诩軜?gòu)中的角色。

            表格3 Strtuts 配置文件

          文件 目的
          ApplicationResources.properties 存儲(chǔ)本地化信息和標(biāo)簽,以使應(yīng)用可以國際化
          struts-config.xml 存儲(chǔ)控制器對(duì)象的缺省配置,包括模型支持的用戶指向,狀態(tài)改變,狀態(tài)查詢

            為將Struts配置數(shù)據(jù)暴露給視圖,框架以JSP標(biāo)簽的形式提供了大量的助手類,如表4 Strtus 視圖助手。


          標(biāo)記庫描述符 目的
          struts-html.tld 擴(kuò)展HTML Form的JSP標(biāo)記
          struts-bean.tld 擴(kuò)展處理JavaBean的JSP標(biāo)記
          struts-logic.tld 擴(kuò)展測試屬性值的JSP標(biāo)記

            控制器組件的配置

            框架中的控制器組件是有org.apache.struts.action.ActionServlet類實(shí)現(xiàn)的,這個(gè)類是javax.servlet.http.HttpServlet類的擴(kuò)展。

            ActionServlet配置:

            我們需要在web.xml中聲明ActionServlet,并且將它配置成啟動(dòng)時(shí)進(jìn)行加載。以下為可以配置的初始化參數(shù):

          參數(shù) 默認(rèn)值 描述
          application Null 應(yīng)用程序的資源集合的類
          bufferSize 4096 文件上傳的緩沖區(qū)大小
          config /WEB-INF/struts-config.xml 配置文件的位置和名稱
          content Text/html 默認(rèn)的內(nèi)容類型
          debug 0 程序調(diào)試的級(jí)別
          detail 0 程序調(diào)試細(xì)節(jié)的級(jí)別
          factory Null 消息資源工廠,糜詮駛薪饈拖⒆試?/TD>
          formBean org.apache.struts.action.ActionFormBean 封裝ActionForm bean信息的類的名稱
          forward Org.apache.struts.action.ActionForward 封裝ActionForward對(duì)象信息的類的名稱
          locale True 為true,將在用戶會(huì)話中存儲(chǔ)一個(gè)本地對(duì)象
          mapping Org.apache.struts.action.ActionForward 封裝ActionMapping信息的類的名稱
          maxFileSize 250M 上傳文件的最大尺寸
          multipartClass Org.apache.struts.action.ActionForward 處理多部分請(qǐng)求的類的名稱
          noCache False HTTP標(biāo)頭是否要設(shè)置為禁止緩寸
          Null True 設(shè)置為true,對(duì)于無效的信息關(guān)鍵字將返回null
          tempDir 作為一個(gè)servlet參數(shù)提供給程序的工作目錄 處理下載文件是使用的臨時(shí)工作目錄
          validate True 是否使用新格式的配置文件
          vallidating True 是否對(duì)配置文件進(jìn)行有效性分析

            大多數(shù)情況下,標(biāo)準(zhǔn)的servlet就能夠滿足用戶需要。

            第一次收到特定請(qǐng)求的URI時(shí),ActionServlet將適當(dāng)?shù)腁ction類進(jìn)行實(shí)例化,然后ActionServlet在Action類實(shí)例中以servlet為變量名存儲(chǔ)一個(gè)引用。當(dāng)被實(shí)例化后,Action類會(huì)被暫存以備再用。

            錯(cuò)誤處理

            struts提供了兩個(gè)類來處理錯(cuò)誤:ActionErrors和ActionError,它們都擴(kuò)展org.apache.struts.action。ActionErrors保存著ActionError對(duì)象的集合,其中每一個(gè)代表了獨(dú)立的錯(cuò)誤信息。每個(gè)ActionError都包含了關(guān)鍵字,能夠映射到資源文件中存儲(chǔ)的錯(cuò)誤信息,而這個(gè)資源文件是在ActionServlet初始化參數(shù)中指定的。

          四、Struts的運(yùn)行

            可通過以下的步驟在我們自己的應(yīng)用程序中使用Struts:

            1、將Struts目錄的lib/struts.jar拷貝到web應(yīng)用的WEB-INF/lib目錄。

            2、將Struts目錄的lib/struts*.tld拷貝到web應(yīng)用的WEB-INF目錄。

            3、修改Web應(yīng)用目錄的WEB-INF/web.xml文件,增加一個(gè)<servlet>元素來定義controller servlet,增加一個(gè)<servlet-mapping>元素來建立URI請(qǐng)求與servlet的對(duì)應(yīng)關(guān)系。可以參照Struts例子中的WEB-INF/web.xml文件來了解詳細(xì)的語法要求。

            4、修改Web應(yīng)用目錄的WEB-INF/web.xml文件,使之包含以下的tag庫定義:

          <taglib>
          <taglib-uri>/WEB-INF/struts.tld</taglib-uri>
          <taglib-location>/WEB-INF/struts.tld</taglib-location>
          </taglib>
          <taglib>
          <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
          <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
          </taglib>
          <taglib>
          <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
          <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
          </taglib>

            5、創(chuàng)建一個(gè)WEB-INF/action.xml文件來定義我們的web應(yīng)用的action映射關(guān)系。可以參照Struts例子中的action.xml文件來了解詳細(xì)的語法要求。

            6、在使用Struts tag庫的JSP網(wǎng)頁中加入以下tag庫定義:

          <@ taglib uri="/WEB-INF/struts.tld" prefix="struts" %>
          <@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
          <@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

            7、最后,在編譯我們的web應(yīng)用的java程序時(shí),不要忘了在CLASSPATH中包含struts.jar文件。

            五、Struts優(yōu)缺點(diǎn)

            優(yōu)點(diǎn):

            Struts跟Tomcat、Turbine等諸多Apache項(xiàng)目一樣,是開源軟件,這是它的一大優(yōu)點(diǎn)。使開發(fā)者能更深入的了解其內(nèi)部實(shí)現(xiàn)機(jī)制。除此之外,Struts的優(yōu)點(diǎn)主要集中體現(xiàn)在兩個(gè)方面:Taglib和頁面導(dǎo)航。Taglib是Struts的標(biāo)記庫,靈活動(dòng)用,能大大提高開發(fā)效率。另外,就目前國內(nèi)的JSP開發(fā)者而言,除了使用JSP自帶的常用標(biāo)記外,很少開發(fā)自己的標(biāo)記,或許Struts是一個(gè)很好的起點(diǎn)。

            關(guān)于頁面導(dǎo)航,我們認(rèn)為那將是今后的一個(gè)發(fā)展方向,事實(shí)上,這樣做,使系統(tǒng)的脈絡(luò)更加清晰。通過一個(gè)配置文件,即可把握整個(gè)系統(tǒng)各部分之間的聯(lián)系,這對(duì)于后期的維護(hù)有著莫大的好處。尤其是當(dāng)另一批開發(fā)者接手這個(gè)項(xiàng)目時(shí),這種優(yōu)勢體現(xiàn)得更加明顯。

            缺點(diǎn):

            Taglib是Struts的一大優(yōu)勢,但對(duì)于初學(xué)者而言,卻需要一個(gè)持續(xù)學(xué)習(xí)的過程,甚至還會(huì)打亂我們網(wǎng)頁編寫的習(xí)慣,但是,當(dāng)我們習(xí)慣了它時(shí),我們會(huì)覺得它真的很棒。Struts將MVC的Controller一分為三,在竦媒峁垢憂邐耐保蒼黽恿訟低車母叢傭取:廖摶晌剩斫?Struts 必須接受一定的培訓(xùn)。隨著變化的不斷加入,這有時(shí)會(huì)令人很沮喪。

            Struts從產(chǎn)生到現(xiàn)在還不過3-4年時(shí)間,就已逐步越來越多運(yùn)用于商業(yè)軟件。雖然它現(xiàn)在還有不少缺點(diǎn),但它是一種非常優(yōu)秀的J2EE MVC實(shí)現(xiàn)方式,如果我們的系統(tǒng)準(zhǔn)備采用J2EE MVC架構(gòu),那么,不妨考慮一下Struts。

            Struts 是一種基于 Web 的 MVC 解決方案,所以必須用 HTML、JSP 文件和 servlet 來實(shí)現(xiàn)它,Struts 需要支持 JSP 1.1 和 Servlet 2.2 規(guī)范的 servlet 容器。學(xué)習(xí)、理解和掌握Struts是我們每個(gè)基于J2EE軟件開發(fā)人員一門必修的課程,也是我們對(duì)企業(yè)J2EE技術(shù)應(yīng)用的進(jìn)一步深化。

          posted on 2005-02-15 11:20 閱讀(163) 評(píng)論(0)  編輯  收藏 所屬分類: J2ee

          主站蜘蛛池模板: 大港区| 西乌| 察雅县| 安龙县| 庆阳市| 桦川县| 沅陵县| 温宿县| 吕梁市| 祥云县| 道孚县| 新龙县| 绥江县| 白银市| 福清市| 南城县| 邳州市| 安西县| 邛崃市| 永兴县| 简阳市| 铜山县| 台北市| 类乌齐县| 丹凤县| 崇阳县| 手游| 江华| 金溪县| 万山特区| 东平县| 车致| 大足县| 通化市| 榕江县| 新竹县| 大连市| 永泰县| 宝山区| 荥阳市| 四会市|