STRUTS

STRUTS

struts是開源軟體。使用Struts的目的是為了幫助我們減少在運用MVC設計模型來開發Web套用的時間。如果我們想混合使用Servlets和JSP的優點來建立可擴展的套用,struts是一個不錯的選擇。 Struts 是Apache軟體基金會(ASF)贊助的一個開源項目。它最初是Jakarta項目中的一個子項目,並在2004年3月成為ASF的頂級項目。它通過採用JavaServlet/JSP技術,實現了基於Java EEWeb套用的MVC設計模式的套用框架,是MVC經典設計模式中的一個經典產品。

基本信息

介紹

Struts是Apache軟體基金會(ASF)贊助的一個開源項目。它最初是Jakarta項目中的一個子項目,並在2004年3月成為ASF的頂級項目。它通過採用JavaServlet/JSP技術,實現了基於JavaEEWeb套用的MVC設計模式的套用框架,是MVC經典設計模式中的一個經典產品。
STRUTSSTRUTS
當建立一個物理建築時,建築工程師使用支柱為建築的每一層提供支持。同樣,軟體工程師使用Struts為業務套用的每一層提供支持。它的目的是為了幫助減少在運用MVC設計模型來開發Web套用的時間。我們仍然需要學習和套用該架構,不過它將可以完成其中一些繁重的工作。如果想混合使用Servlets和JSP的優點來建立可擴展的套用,Struts是一個不錯的選擇。

早期Smalltalk程式語言便採用了MVC(Model-View-Controller)模式(Patterns)以增加程式代碼彈性,MVC模式將程式代碼整理切割為三部份,Model部分是業務與套用領域(Businessdomain)相關邏輯、管理狀態之對象,Controller部分接收來自View所輸入的資料並與Model部分互動,是業務流程控制(FlowControl)之處,View部分則負責展現資料、接收使用者輸入資料。在Java套用中,JFC/Swing、AWT、JSP皆是可用作View之技術規格,而JavaBean與EnterpriseJavaBean規格則可用於Model程式代碼,一旦應用程式以MVC模式加以適當之分割,Model部分程式代碼可在不同使用者接口外觀之應用程式中重複使用。隨著JSP與Servlet技術大量套用於以Web為基礎之應用程式,Java開發人員群體認為應以較佳之模式以提升Web應用程式之可維護性與重複使用性。早期JSP規格書中曾列舉兩種可行之JSP套用架構,分別為Model1與Model2。

發展歷史

struts最早是作為ApacheJakarta項目的組成部分,項目的創立者希望通過對該項目的研究,改進和提高JavaServerPagSTRUTSSTRUTSes、Servlet、標籤庫以及面向對象的技術水準。Struts這個名字來源於在建築和舊式飛機中使用的支持金屬架。這個框架之所以叫"Struts",是為了提醒我們記住那些支撐我

STRUTSSTRUTS
們房屋,建築,橋樑,甚至我們踩高蹺時候的基礎支撐。這也是一個解釋Struts在開發Web應用程式中所扮演的角色的精彩描述。當建立一個物理建築時,建築工程師使用支柱為建築的每一層提供支持。同樣,軟體工程師使用Struts為業務套用的每一層提供支持。它的目的是為了幫助我們減少在運用MVC設計模型來開發Web套用的時間。我們仍然需要學習和套用該架構,不過它將可以完成其中一些繁重的工作。如果想混合使用Servlets和JSP的優點來建立可擴展的套用,Struts是一個不錯的選擇。

早期

早期Smalltalk程式語言便採用了MVC(Model-View-Controller)模式(Patterns)以增加程式代碼彈性,MVC模式將程式代碼整理切割為三部分,Model部分是業務與套用領域(Businessdomain)相關邏輯、管理狀態之對象,Controller部分接收來自View所輸入的資料並與Model部分互動是業務流程控制(FlowControl)之處,View部分則負責展現資料、接收使用者輸入資料。在Java套用中,JFC/Swing、AWT、JSP皆是可用作View的技術規格,而JavaBean與EnterpriseJavaBean規格則可用於Model程式代碼,一旦應用程式以MVC模式加以適當的分割,Model部分程式代碼可在不同使用者接口外觀的應用程式中重複使用。
隨著JSP與Servlet技術大量套用於以Web為基礎的應用程式,Java開發人員群體認為應以較佳的模式以提升Web應用程式的可維護性與重複使用性。早期JSP規格書中曾列舉兩種可行之JSP套用架構,分別為Model1與Model2。
在Model1架構中,JSP直接處理Web瀏覽器送來的請求(Request),並輔以JavaBean處理套用相關邏輯。Model1架構單純編寫比較容易,但在Model1中JSP可能同時肩負View與Controller角色,兩類程式代碼有可能混雜而不易維護。而Model2中將Servlet入架構中扮演前端Controller角色,將Web瀏覽器送出的請求集中送至Servlet,Servlet可集中管理使用者登入、許可權控制、多國語言轉換等前置處理,再視需求轉向給對應的JSP處理。Model2中採用了較佳的MVC模式,但增加了編寫複雜度。
Struts是Apache軟體基金下Jakarta項目的一部分。除Struts之外,還有其他成功的開源產品,包括Tomcat,Ant和Velocity。2000年CraigR.McClanahan先生貢獻了他編寫的JSPModel2架構的ApplicationFramework原始程式代碼給Apache基金會,成為ApacheJakarta計畫StrutsFramework前身。
開始的代碼基礎從2000年5月開始開發,直到2001年6月,1.0版本發布。有30多個開發者參與進來,並有數千人參與到討論組中。Struts代碼基礎由一個志願的Commnitter團隊來管理。到2002年,Struts小組共有9個志願Commnitter。
Struts框架的主要架構設計和開發者是CraigR.McClanahan。Craig也是Tomcat4的主要架構師,以及JavaWebServicesDeveloperPack的主要架構師和實現者。他是Sun(於2010年1月被oracle收購)的JavaServerFaces(JSR-127)以及J2EE平台的Web層架構的規範領導。CraigR.McClanahan先生是JCPExpertGroup成員之一,曾參與JSP規格制定與Tomcat4編寫,因此StrutsFramework廣受Java開發人員群體所重視。Borland自2002年底開始於開發工具JBuilder中支持StrutsFramework。
Struts是Apache基金會Jakarta項目組的一個OpenSource項目,它採用MVC模式,能夠很好地幫助java開發者利用J2EE開發Web套用。和其他的java架構一樣,Struts也是面向對象設計,將MVC模式"分離顯示邏輯和業務邏輯"的能力發揮得淋漓盡致。Structs框架的核心是一個彈性的控制層,基於如JavaServlets,JavaBeans,ResourceBundles與XML等標準技術,以及JakartaCommons的一些類庫。Struts由一組相互協作的類(組件)、Servlet以及jsptaglib組成。基於struts構架的web應用程式基本上符合JSPModel2的設計標準,可以說是一個傳統MVC設計模式的一種變化類型。

構架開發

STRUTSSTRUTS
在Model1架構中,JSP直接處理Web瀏覽器送來之請求(Request),並輔以JavaBean處理套用相關邏輯。Model1架構單純編寫比較容易,但在Model1中JSP可能同時肩負View與Controller角色,兩類程式代碼有可能混雜而不易維護。而Model2中將Servlet納入架構中扮演前端Controller角色,將Web瀏覽器送出之請求集中送至Servlet,Servlet可集中管理使用者登入、許可權控制、多國語言轉換等前置處理,再視需求轉向給對應之JSP處理。Model2中採用了較佳之MVC模式,但增加了編寫複雜度。
Struts是Apache軟體基金下Jakarta項目的一部分。除Struts之外,還有其他成功的開源產品,包括Tomcat,Ant和Velocity。2000年CraigR.McClanahan先生貢獻了他編寫的JSPModel2架構之ApplicationFramework原始程式代碼給Apache基金會,成為ApacheJakarta計畫StrutsFramework前身。
開始的代碼基礎從2000年5月開始開發,直到2001年6月,1.0版本發布。有30多個開發者參與進來,並有數千人參與到討論組中。Struts代碼基礎由一個志願的Commnitter團隊來管理。到2002年,Struts小組共有9個志願Commnitter。
Struts框架的主要架構設計和開發者是CraigR.McClanahan。Craig也是Tomcat4的主要架構師,以及JavaWebServicesDeveloperPack的主要架構師和實現者。他現在是Sun的JavaServerFaces(JSR-127)以及J2EE平台的Web層架構的規範領導。CraigR.McClanahan先生是JCPExpertGroup成員之一,曾參與JSP規格制定與Tomcat4之編寫,因此StrutsFramework廣受Java開發人員群體所重視。Borland自2002年底開始於開發工具JBuilder中支持StrutsFramework。

軟體優點

Struts跟Tomcat、Turbine等諸多Apache項目一樣,是開源軟體,這是它的一大優點,使開發者能更深入的了解其內部實現機制。
除此之外,Struts的優點主要集中體現在兩個方面:Taglib和頁面導航。Taglib是Struts的標記庫,靈活運用,能大大提高開發效率。另外,就目前國內的JSP開發者而言,除了使用JSP自帶的常用標記外,很少開發自己的標記,或許Struts是一個很好的起點。
關於頁面導航,我認為那將是今後的一個發展方向,事實上,這樣做,使系統的脈絡更加清晰。通過一個配置檔案,即可把握整個系統各部分之間的聯繫,這對於後期的維護有著莫大的好處。尤其是當另一批開發者接手這個項目時,這種優勢體現得更加明顯。
MVC即Model-View-Controller的縮寫,是一種常用的設計模式。MVC減弱了業務邏輯接口和數據接口之間的耦合,以及讓視圖層更富於變化。Struts是MVC的一種實現,它將Servlet和JSP標記(屬於J2EE規範)用作實現的一部分。Struts繼承了MVC的各項特性,並根據J2EE的特點,做了相應的變化與擴展。

集成模式

STRUTSSTRUTS
Struts是Apache基金會Jakarta項目組的一個OpenSource項目,它採用MVC模式,能夠很好地幫助java開發者利用J2EE開發Web套用。和其他的java架構一樣,Struts也是面向對象設計,將MVC模式“分離顯示邏輯和業務邏輯”的能力發揮得淋漓盡致。Structs框架的核心是一個彈性的控制層,基於如JavaServlets,JavaBeans,ResourceBundles與XML等標準技術,以及JakartaCommons的一些類庫。Struts有一組相互協作的類(組件)、Serlvet以及jsptaglib組成。基於struts構架的web應用程式基本上符合JSPModel2的設計標準,可以說是一個傳統MVC設計模式的一種變化類型。
Struts最早是作為ApacheJakarta項目的組成部分問世運作。項目的創立者希望通過對該項目的研究,改進和提高JavaServerPages、Servlet、標籤庫以及面向對象的技術水準。
Struts的目的是為了減少在運用MVC設計模型來開發Web套用的時間。你仍然需要學習和套用該架構,不過它將可以完成其中一些繁重的工作。

Struts跟Tomcat、Turbine等諸多Apache項目一樣,是開源軟體,這是它的一大優點,使開發者能更深入的了解其內部實現機制。除此之外,Struts的優點主要集中體現在兩個方面:Taglib和頁面導航。Taglib是Struts的標記庫,靈活動用,能大大提高開發效率。另外,就目前國內的JSP開發者而言,除了使用JSP自帶的常用標記外,很少開發自己的標記,或許Struts是一個很好的起點。關於頁面導航,我認為那將是今後的一個發展方向,事實上,這樣做,使系統的脈絡更加清晰。通過一個配置檔案,即可把握整個系統各部分之間的聯繫,這對於後期的維護有著莫大的好處。尤其是當另一批開發者接手這個項目時,這種優勢體現得更加明顯。

MVC即Model-View-Controller的縮寫,是一種常用的設計模式。MVC減弱了業務邏輯接口和數據接口之間的耦合,以及讓視圖層更富於變化。Struts是MVC的一種實現,它將Servlet和JSP標記(屬於J2EE規範)用作實現的一部分。Struts繼承了MVC的各項特性,並根據J2EE的特點,做了相應的變化與擴展。

操作流程

伺服器啟動後,根據web.xml載入Action Servlet讀取struts-config.xml檔案內容到記憶體。以登入為例:第一次進login.jsp會先實例化Form、把默認值賦給表單元素

輸入用戶名密碼提交表單、提交到action屬性的login.do,通過ActionServlet讀struts-config.xml檔案找到action下的path屬性找到.do,通過name屬性找form-beans中的form-bean的name屬性得到ActionForm的包名類名,先實例化form,把表單的值填充給form,調用form的validate方法驗證、ActionErrors返回null表示驗證通過,否則失敗返回input指定的頁面。驗證通過會實例化Action,執行Action的excute方法。

體系結構

框架中三個部分:模型,視窗和控制器。
在struts框架中,模型分為兩個部分:
STRUTSSTRUTS

系統的內部狀態

可以改變狀態的操作(事務邏輯)
內部狀態通常由一組ActinFormJavaBean表示。根據設計或應用程式複雜度的不同,這些Bean可以是自包含的並具有持續的狀態,或只在需要時才獲得數據(從某個資料庫)。大型應用程式通常在方法內部封裝事務邏輯(操作),這些方法可以被擁有狀態信息的bean調用。比如購物車bean,它擁有用戶購買商品的信息,可能還有checkOut()方法用來檢查用戶的信用卡,並向倉庫發定貨信息。
小型程式中,操作可能會被內嵌在Action類,它是struts框架中控制器角色的一部分。當邏輯簡單時這個方法很適合。建議用戶將事務邏輯(要做什麼)與Action類所扮演的角色(決定做什麼)分開。
視窗:由JSP建立,struts包含擴展自定義標籤庫,可以簡化創建完全國際化用戶界面的過程。
控制器:struts中,基本的控制器組件是ActionServlet類中的實例servelt,實際使用的servlet在配置檔案中由一組映射(由ActionMapping類進行描述)進行定義。

框架中的組件

框架中所使用的組件: 
ActionServlet控制器
ActionClass包含事務邏輯
ActionForm顯示模組數據
ActionMapping幫助控制器將請求映射到操作
ActionForward用來指示操作轉移的對象
ActionError用來存儲和回收錯誤
Struts標記庫可以減輕開發顯示層次的工作

框架結構

簡述

strutsstruts

struts框架具有組件的模組化,靈活性和重用性的優點,同時簡化了基於MVC的web應用程式的開發。
struts可以清晰地區分控制,事務邏輯和外觀,從而簡化了開發應用程式的過程。struts提供的類使得開發工作更加簡單,這些類包括:
控制程式流程的類
實現和執行程式事務邏輯的類
自定義的標記庫使得創建和驗證HTML表單更加容易
壓縮檔內容
資料夾jakarta-struts-1.0.2包含兩個目錄,lib和webapps。在lib目錄中有使用struts創建應用程式是所需的檔案。
1jdbc2_0-stdext.jar包含JDBC2.0OptionalPackageAPI類。如果我們要使用struts提供的數據資源,就需要將這個檔案拷貝到WEB-INF\lib下
2Struts.jar包含struts中所有的java類。同樣也需要拷貝到WEB-INF\lib下
3*.tld標記庫描述器檔案,描述了多個struts標記庫中的自定義標記。同樣要拷貝到WEB-INF\lib下
在webapps目錄下有如下檔案:
1Struts-blank.war一個簡單的web應用程式
2Struts-documentation.war包含struts站點上所有struts文檔
3Struts-example.warStruts很多特性的示範
4Struts-exercisetaglib.war主要用於對自定義標籤庫進行增加而使用的測試頁,但也可以示範如何使用struts標記
5Struts-template.war包含struts模板標記的介紹和範例
6Struts-upload.war一個簡單的例子,示範如何使用struts框架上傳檔案

體系結構

讓我們從MVC角度觀察struts框架中的組件,框架中三個部分:模型,視窗和控制器。
◆模型
在struts框架中,模型分為兩個部分:
系統的內部狀態
可以改變狀態的操作(事務邏輯
內部狀態通常由一組ActionFormJavaBean表示。根據設計或應用程式複雜度的不同,這些Bean可以是自包含的並具有持續的狀態,或只在需要時才獲得數據(從某個資料庫)。
大型應用程式通常在方法內部封裝事務邏輯(操作),這些方法可以被擁有狀態信息的bean調用。比如購物車bean,它擁有用戶購買商品的信息,可能還有checkOut()方法用來檢查用戶的信用卡,並向倉庫發定貨信息。
小型程式中,操作可能會被內嵌在Action類,它是struts框架中控制器角色的一部分。當邏輯簡單時這個方法很適合。
建議用戶將事務邏輯(要做什麼)與Action類所扮演的角色(決定做什麼)分開。
◆視窗
由JSP建立,struts包含擴展自定義標籤庫,可以簡化創建完全國際化用戶界面的過程。
◆控制器
struts中,基本的控制器組件是ActionServlet類中的實例servlet,實際使用的servlet在配置檔案中由一組映射(由ActionMapping類進行描述)進行定義。
框架中的組件 
(由於ROSE工具還未能下載,只能找來這幅圖,它說明了一定問題,特別是ActionErrors,但它並沒有將ActionMapping,JSP和TagLibrary包含進來,有時間作完替換)
框架中所使用的組件:
ActionServlet控制器
ActionClass包含事務邏輯
ActionForm顯示模組數據
ActionMapping幫助控制器將請求映射到操作
ActionForward用來指示操作轉移的對象
ActionError用來存儲和回收錯誤
Struts標記庫可以減輕開發顯示層次的工作
下面我們看看各自在框架中所扮演的角色和責任。

Struts配置檔案

框架框架

這是將struts組件結合在一起的東東:struts-config.xml。默認值\WEB-INF\struts-config.xml。配置檔案可以定義:
全局轉發
ActionMapping類幫助控制器將請求映射到操作
ActionFormbean顯示模組數據
JDBC數據源
配置全局轉發
全局轉發用來在JSP頁之間創建邏輯名稱映射。轉發都可以通過對調用操作映射的實例來獲得,例如:
actionMappingInstace.findForward(“logicalName”);
全局轉發的例子:(所有的例子我沒有進行解釋,一是結合表可以理解,二是例子大部分來自系列四的示例,你應該在作完實驗後,再來看一遍)
<global-forwards>
<forwardname="bookCreated"path="/BookView.jsp"/>
</global-forwards>
屬性描述
Name全局轉發的名字
Path與目標URL的相對路徑
配置ActionMapping
ActionMapping對象幫助進行框架內部的流程控制,它們可將請求URI映射到Action類,並且將Action類與ActionFormbean相關聯。ActionServlet在內部使用這些映射,並將控制轉移到特定Action類的實例。所有Action類使用perform()方法實現特定應用程式代碼,返回一個ActionForward對象,其中包括回響轉發的目標資源名稱。例如:
<action-mappings>
<actionpath="/createBook"
type="BookAction"
name="bookForm"
scope="request"
input="/CreateBook.jsp">
</action>
<forwardname=”failure”path=”/CreateBook.jsp”/>
<forwardname=”cancel”path=”/index.jsp”/>
</action-mappings>

屬性 描述

框架框架

PathAction類的相對路徑
Name與本操作關聯的Actionbean的名稱
Type連線到本映射的Action類的全稱(可有包名)
ScopeActionFormbean的作用域(請求或會話)
Prefix用來匹配請求參數與bean屬性的前綴
Suffix用來匹配請求參數與bean屬性的後綴
attribute作用域名稱。
classNameActionMapping對象的類的完全限定名默認的類是
input輸入表單的路徑,指向bean發生輸入錯誤必須返回的控制
unknown設為true,操作將被作為所有沒有定義的ActionMapping的URI的默認操作
validate設定為true,則在調用Action對象上的perform()方法前,ActionServlet將調用ActionFormbean的validate()方法來進行輸入檢查
通過<forward>;元素,可以定義資源的邏輯名稱,該資源是Action類的回響要轉發的目標。
屬性描述
IdID
ClassNameActionForward類的完全限定名,默認是org.apache.struts.action.ActionForward
Name操作類訪問ActionForward時所用的邏輯名
Path回響轉發的目標資源的路徑
redirect若設定為true,則ActionServlet使用sendRedirect()方法來轉發資源
配置ActionFormBean
ActionServlet使用ActionForm來保存請求的參數,這些bean的屬性名稱與HTTP請求參數中的名稱相對應,控制器將請求參數傳遞到ActionFormbean的實例,然後將這個實例傳送到Action類。例子:
<form-beans>
<form-beanname="bookForm"type="BookForm"/>
</form-beans>
屬性描述
IdID
classNameActionFormbean的完全限定名,默認值是org.apache.struts.action.ActionFormBean
Name表單bean在相關作用域的名稱,這個屬性用來將bean與ActionMapping進行關聯
Type類的完全限定名
配置JDBC數據
用<data-sources>;元素可以定義多個數據源。
屬性描述
IdID
KeyAction類使用這個名稱來尋找連線
下面屬性需要<set-property>;元素定義,在框架1.1版本中已不在使用,但你可用<data-source>;元素。例子:
<data-sources>
<data-sourceid=”DS1”
key=”conPool”
type=”org.apache.struts.util.GenericDataSource”
<set-propertyid=”SP1”
autoCommit="true"
description="ExampleDataSourceConfiguration"
driverClass="org.test.mm.mysql.Driver"
maxCount="4"
minCount="2"
url="jdbc:mysql://localhost/test"
user="struts"
password="wrox"/>
<data-source/>
</data-sources>
屬性描述
desciption數據源的描述
autoCommit數據源創建的連線所使用的默認自動更新資料庫模式
driverClass數據源所使用的類,用來顯示JDBC驅動程式接口
loginTimeout資料庫登入時間的限制,以秒為單位
maxCount最多能建立的連線數目
minCount要創建的最少連線數目
password資料庫訪問的密碼
readOnly創建唯讀的連線
User訪問資料庫的用戶名
urlJDBC的URL
通過指定關鍵字名稱,Action類可以訪問數據源,比如:
javax.sql.DataSourceds=servlet.findDataSource(“conPool”);
javax.sql.Connectioncon=ds.getConnection();
ActionServlet類
框架中的控制器組件是有org.apache.struts.action.ActionServlet類實現的,這個類是javax.servlet.http.HttpServlet類的擴展。
Strutscontroller基本功能是:
1.截獲用戶的Http請求
2.把這個請求映射到相應的Action類,如果這是此類收到的第一個請求,將初始化實例並快取。
3.創建或發現一個ActionFormbean實例(看配置檔案是否定義),然後將請求過程移植到bean.
4.調用Action實例的perform()方法並將ActioFormbean,ActionMapping對象,request和response對象傳給它。
如:publicActionForwardperform(ActionMappingmapping,
ActionFormform,
HttpServletRequestrequest,
HttpServletResponseresponse)
5.perform返回一個ActionForward對象,此對象連線到相應的jsp頁面.
ActionServlet配置
我們需要在web.xml中聲明ActionServlet,並且將它配置成啟動時進行載入。以下為可以配置的初始化參數:
參數默認值`描述
applicationnull應用程式的資源集合的類
bufferSize4096檔案上傳的緩衝區大小
config/WEB-INF/struts-config.xml配置檔案的位置和名稱
contentText/html默認的內容類型
debug0程式調試的級別
detail0程式調試細節的級別
factorynull訊息資源工廠,用於國際化中解釋訊息資源
formBeanorg.apache.struts.action.ActionFormBean封裝ActionFormbean信息的類的名稱
forwardorg.apache.struts.action.ActionForward封裝ActionForward對象信息的類的名稱
localetrue為true,將在用戶會話中存儲一個本地對象
mappingorg.apache.struts.action.ActionForward封裝ActionMapping信息的類的名稱
maxFileSize250M上傳檔案的最大尺寸
multipartClassorg.apache.struts.action.ActionForward處理多部分請求的類的名稱
noCacheFalseHTTP標頭是否要設定為禁止緩寸
NullTrue設定為true,對於無效的信息關鍵字將返回null
tempDir作為一個servlet參數提供給程式的工作目錄處理下載檔案是使用的臨時工作目錄
validateTrue是否使用新格式的配置檔案
vallidatingTrue是否對配置檔案進行有效性分析
大多數情況下,標準的servlet就能夠滿足用戶需要。
第一次收到特定請求的URI時,ActionServlet將適當的Action類進行實例化,然後ActionServlet在Action類實例中以servlet為變數名存儲一個引用。當被實例化後,Action類會被暫存以備再用。
ActionServlet也提供一些方法,由Action類用來訪問數據源和轉發目標之類的資源。
ActionServlet方法
ActinServlet提供了一組能夠被Action對象使用的方法。
StrutsAPI的全部信息在struts-documentation.war中可以找到。動態的添加或刪除,這些方法只影響應用程式當前的實例:
publicvoidaddFormBean(ActionFormBeanformBean)
publicvoidremoveFormBean(ActionFormBeanformBean)
publicvoidaddForward(ActionForwardactionForward)
publicvoidremoveForward(ActionForwardactionForward)
publicvoidaddMapping(ActionMappingactionMapping)
publicvoidremoveMapping(ActionMappingactionMapping)
根據名稱查找對象:
publicActionFormBeanfindFormBean(Stringname)
publicActionForwardfindForward(Stringname)
publicActionMappingfindMapping(Stringname)
用來處理數據源:
publicvoidaddDataSource(Stringkey,DataSourceds)
publicDataSourcefindDataSource(Stringkey)
我們還可以:
使用destroy()方法結束ActionServlet
使用reload()方法從struts配置檔案將信息重新載入。
ActionMapping類
將特定請求映射到特定Action的相關信息存儲在ActionMapping中,ActionServelt將ActionMapping傳送到Action類的perform()方法,Action將使用ActionMapping的findForward()方法,此方法返回一個指定名稱的ActionForward,這樣Action就完成了本地轉發。若沒有找到具體的ActionForward,就返回一個null.
publicActionForwardfindForward(Stringname)
可在映射中動態添加ActionForward:
publicvoidaddForward(ActionForwardforward)
可返回與映射關聯的表單bean:
publicStringgetName()
可返回映射的屬性域(會話或請求)
publicStringgetScope()
Action類
Action類真正實現應用程式的事務邏輯,它們負責處理請求。在收到請求後,ActionServlet會:
為這個請求選適當的Action
如果需要,創建Action的一個實例
調用Action的perform()方法
如果ActionServlet不能找到有效的映射,它會調用默認的Action類(在配置檔案中定義)。如果找到了ActionServlet將適當的ActionMapping類轉發給Action,這個Action使用ActionMapping找到本地轉發,然後獲得並設定ActionMapping屬性。根據servlet的環境和被覆蓋的perform()方法的簽名,ActionServlet也會傳送ServletRequest對象或HttpServletRequest對象。
所有Action類都擴展org.apache.struts.action.Action類,並且覆蓋類中定義的某一個perform()方法。有兩個perform()方法:
處理非HTTP(一般的)請求:
publicActionForwardperform(ActionMappingaction,
AcionFormform,
ServletRequestrequest,
ServletResponseresponse)
throwsIOException,ServletException
Action類必須以“執行緒安全”的方式進行編程,因為控制器會令多個同時發生的請求共享同一個實例,相應的,在設計Action類時就需要注意以下幾點:
不能使用實例或靜態變數存儲特定請求的狀態信息,它們會在同一個操作中共享跨越請求的全局資源
如果要訪問的資源(如JavaBean和會話變數)在並行訪問時需要進行保護,那么訪問就要進行同步
Action類的方法
除了perform()方法外,還有以下方法:
可以獲得或設定與請求相關聯的區域:
publicLocalegetLocale(HttpServletRequestrequest)
publicvoidsetLocale(HttpServletRequestrequest,Localelocale)
為應用程式獲得訊息資源:
publicMessageResourcesgetResources()
檢查用戶是否點擊表單上的“取消”鍵,如果是,將返回true:
publicBooleanisCancelled(HttpServletRequestrequest)
當應用程式發生錯誤時,Action類能夠使用下面方法存儲錯誤信息:
publicvoidsaveErrors(HttpServletRequestrequest,ActionErrorserrors)
ActionError實例被用來存儲錯誤信息,這個方法在錯誤關鍵字下的請求屬性列表中存儲ActionError對象。通過使用在struts標記庫中定義的自定義標記,JSP頁能夠顯示這些錯誤信息,稍後我們就介紹。
ActionForm類
框架假設用戶在應用程式中為每個表單都創建了一個ActionFormbean,對於每個在struts-config.xml檔案中定義的bean,框架在調用Action類的perform()方法之前會進行以下操作:
在相關聯的關鍵字下,它檢查用於適當類的bean實例的用戶會話,如果在會話中沒有可用的bean,它就會自動創建一個新的bean並添加到用戶的會話中。
對於請求中每個與bean屬性名稱對應的參數,Action調用相應的設定方法。
當Actionperform()被調用時,最新的ActionFormbean傳送給它,參數值就可以立即使用了。
ActionForm類擴展org.apache.struts.action.ActionForm類,程式開發人員創建的bean能夠包含額外的屬性,而且ActionServlet可能使用反射(允許從已載入的對象中回收信息)訪問它。
ActionForm類提供了另一種處理錯誤的手段,提供兩個方法:
PublicActionErrorsvalidate(ActionMappingmapping,
ServletRequestrequest)
同上
HttpServletRequestrequest)

框架框架

你應該在自己的bean里覆蓋validate()方法,並在配置檔案里設定<action>;元素的validate為true。在ActionServlet調用Action類前,它會調用validate(),如果返回的ActionErrors不是null,則ActinForm會根據錯誤關鍵字將ActionErrors存儲在請求屬性列表中。
如果返回的不是null,而且長度大於0,則根據錯誤關鍵字將實例存儲在請求的屬性列表中,然後ActionServlet將回響轉發到配置檔案<action>;元素的input屬性所指向的目標。
如果需要執行特定的數據有效性檢查,最好在Action類中進行這個操作,而不是在ActionForm類中進行。
方法reset()可將bean的屬性恢復到默認值:
publicvoidreset(ActionMappingmapping,HttpServletRequestrequest)
publicvoidreset(ActionMappingmapping,ServletRequestrequest)
典型的ActionFrombean只有屬性的設定與讀取方法(getXXX),而沒有實現事務邏輯的方法。只有簡單的輸入檢查邏輯,使用的目的是為了存儲用戶在相關表單中輸入的最新數據,以便可以將同一網頁進行再生,同時提供一組錯誤信息,這樣就可以讓用戶修改不正確的輸入數據。而真正對數據有效性進行檢查的是Action類或適當的事務邏輯bean。
ActionForward類
目的是控制器將Action類的處理結果轉發至目的地。
Action類獲得ActionForward實例的句柄,然後可用三種方法返回到ActionServlet,所以我們可以這樣使用findForward():
ActionServlet根據名稱獲取一個全局轉發
ActionMapping實例被傳送到perform()方法,並根據名稱找到一個本地轉發
另一種是調用下面的一個構造器來創建它們自己的一個實例:
publicActionForward()
publicActionForward(Stringpath)
publicActionForward(Stringpath,Booleanredirect)

錯誤處理

框架框架

struts提供了兩個類來處理錯誤:ActionErrors和ActionError,它們都擴展org.apache.struts.action。ActionErrors保存著ActionError對象的集合,其中每一個代表了獨立的錯誤信息。每個ActionError都包含了關鍵字,能夠映射到資源檔案中存儲的錯誤信息,而這個資源檔案是在ActionServlet初始化參數中指定的。
ActionError類
ActionError類定義了一組重載的構造器來創建錯誤信息,第一個構造器方法使用一個字元串作為參數,例如:
ActionErrorerror=newActionError(“error.Invalid”);
實例error映射到應用程式資源檔案中的一個錯誤訊息:
error.invalid=InvalidNumber
如果在JSP頁使用<html:error>;,用戶就會看見加粗的InvalidNumber。
另一種使用了java.text.MessageFormat類,可在訊息中指定替換字元串,例如:
error.invalid=InvalidNumber
創建一個錯誤訊息:
ActionErrorerror=newActionError(‘error.invalid’,newDouble(-1));
JSP頁顯示:InvalildNumber–1
還有獲得特定訊息的錯誤關鍵字:
publicStringgetKey()
還有獲得替換字元串數組:
publicString[]getValues()
ActionError類
ActionError類從不獨立進行錯誤處理,它們總是被存儲在ActionErrors對象中。ActionErrors對象保存ActionError類的集合以及它們特定的屬性值,我們可以使用自己定義的屬性值,或是使用ActionErrors.GLOBAL_ERROR.
下面是典型Action類的perform()中錯誤處理情況:
MyFormform=(MyForm)form;
if(number==-1){
ActionErrorserrors=newActionErrors();
ActionErrorerror=newActionError(“error.Invalid”,newDouble(-1));
errors.add(ActionErrors.GLOBAL_ERROR,error);
saveErrors(req,errors);
Stringinput=mapping.getInput();
ReturnnewActionForward(input);
}
ActionErrors有如下有用方法
方法描述
clear()清除所有錯誤信息
empty()如果ActionErrors對象是空的,它返回true
get()返回錯誤信息。若無參數,所有信息將作為一個Iterator對象返回
properties()返回包含屬性名稱的Iterator,這些屬性至少有一個錯誤
size()返回錯誤的數目(整型數)
還有基於struts二次開發出來的功能更強大的架構
這些用eclipse開發都可以找到功能非常完善的外掛程式
開發的"傻瓜"程度很高
但是理解起來會比較困難
一旦理解透徹開發則得心應手

框架結構圖

綜述

框架框架

相應框架結構如圖:
Struts對Model,View和Controller都提供了對應的組件。
在上圖中,ActionServlet,這個類是Struts的核心控制器,負責攔截來自用戶的請求。
Action,這個類通常由用戶提供,該控制器負責接收來自ActionServlet的請求,並根據該請求調用模型的業務邏輯方法處理請求,並將處理結果返回給JSP頁面顯示。

Model部分

由JavaBean組成,ActionForm用於封裝用戶的請求參數,封裝成ActionForm對象,該對象被ActionServlet轉發給Action,Action根據ActionForm裡面的請求參數處理用戶的請求。
JavaBean則封裝了底層的業務邏輯,包括資料庫訪問等。

View部分

該部分採用JSP實現。
Struts提供了豐富的標籤庫,通過標籤庫可以減少腳本的使用,自定義的標籤庫可以實現與Model的有效互動,並增加了現實功能。對應上圖的JSP部分

Controller組件

Controller組件有兩個部分組成——系統核心控制器,業務邏輯控制器。
系統核心控制器,對應上圖的ActionServlet。該控制器由Struts框架提供,繼承HttpServlet類,因此可以配置成標註的Servlet。該控制器負責攔截所有的HTTP請求,然後根據用戶請求決定是否要轉給業務邏輯控制器。
業務邏輯控制器,負責處理用戶請求,本身不具備處理能力,而是調用Model來完成處理。對應Action部分。 

OGNL

框架框架

Struts2ognl中的#、%和$符號用法說明
#、%和$符號在OGNL表達式中經常出現,而這三種符號也是開發者不容易掌握和理解的部分。在這裡筆者簡單介紹它們的相套用途。
1.#符號的用途一般有三種。
1)訪問非根對象屬性,例如示例中的#session.msg表達式,由於Struts2中值棧被視為根對象,所以訪問其他非根對象時,需要加#前綴。實際上,#相當於ActionContext.getContext();#session.msg表達式相當於ActionContext.getContext().getSession().getAttribute(”msg”)。
2)用於過濾和投影(projecting)集合,如示例中的persons.{?#this.age>20}。
3)用來構造Map,例如示例中的#{'foo1':'bar1','foo2':'bar2'}。
2.%符號%符號的用途是在標誌的屬性為字元串類型時,計算OGNL表達式的值。如下面的代碼所示:構造Map<s:setname="foobar"value="#{'foo1':'bar','foo2':'bar2'}"/>
<p>;不使用%:<s:urlvalue="#foobar['foo1']"/></p>
<p>;使用%:<s:urlvalue="%{#foobar['foo1']}"/></p>
3.$符號$符號主要有兩個方面的用途
在國際化資源檔案中,引用OGNL表達式,例如國際化資源檔案中的代碼:reg.agerange=國際化資源信息:年齡必須在${min}同${max}之間。
在Struts2框架的配置檔案中引用OGNL表達式,例如下面的代碼片斷所示:<validators><fieldname=”intb”><field-validatortype=”int”><paramname=”min”>10</param><paramname=”max”>100</param><message>BAction-test校驗:數字必須為${min}為${max}之間!</message></field-validator></field></validators>

Struts2

框架框架

Struts2是Struts的下一代產品。是在struts和WebWork的技術基礎上進行了合併,全新的Struts2框架。其全新的Struts2的體系結構與Struts1的體系結構的差別巨大。Struts2以WebWork為核心,採用攔截器的機制來處理用戶的請求,這樣的設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,所以Struts2可以理解為WebWork的更新產品。因為Struts2和Struts1有著太大的變化,但是相對於WebWork,Struts2隻有很小的變化。具體請參考百度百科Struts2。
2013年7月17日高危漏洞
ApacheStruts2高危漏洞,影響到Struts2.0.0-Struts2.3.15的所有版本。包括國內很多知名網站在內的大量網站受到此漏洞不同程度的影響。攻擊者可以利用該漏洞執行惡意java代碼,最終導致網站數據被竊取、網頁被篡改等嚴重後果,使網站及網民安全受到了極大的威脅。使用WEB伺服器其中的kangle,apache表示沒任何問題,Nginx受影響,用Nginx的用戶注意及時修復此問題,否則可能導致伺服器被入侵。

相關詞條

相關搜尋

熱門詞條

聯絡我們