程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Struts的概念及體系結構與工作原理

Struts的概念及體系結構與工作原理

編輯:關於JAVA

基本概念

Struts是Apache 基金會Jakarta 項目組的一個Open Source 項目,它采用MVC模式,能夠很好地幫助java 開發者利用J2EE開發Web應用。和其他的java架構一樣,Struts 也是面向對象設計,將MVC模式"分離顯示邏輯和業務邏輯"的能力發揮得淋漓盡致。Structs 框架的核心是一個彈性的控制層,基於如 Java Servlets,JavaBeans,ResourceBundles與XML等標准技術,以及 Jakarta Commons 的一些類庫。Struts有一組相互協作的類(組件)、Serlvet以及jsp tag lib組成。基於struts構架的web應用程序基本上符合JSP Model2的設計標准,可以說是一個傳統 MVC設計模式的一種變化類型。

Struts有其自己的控制器(Controller),同時整合了其他的一些技術去實現模型層(Model)和視圖層(View)。在模型層,Struts可以很容易的與數據訪問技術相結合,如 JDBC / EJB ,以及其它第三方類庫,如 Hibernate / iBATIS ,或者 Object Relational Bridge(對象關系橋)。在視圖層,Struts能夠與JSP,包括 JSTL 與 JSF,以及 Velocity 模板,XSLT 與其它表示層技術。

Struts 為每個專業的 Web 應用程序做背後的支撐,幫助為你的應用創建一個擴展的開發環境。

Struts的體系結構與工作原理

MVC即Model-View-Controller的縮寫,是一種常用的設計模式。MVC 減弱了業務邏輯接口和數據接口之間的耦合,以及讓視圖層更富於變化。MVC的工作原理,如下圖1所示:

圖1

Struts 是MVC的一種實現,它將 Servlet和 JSP 標記(屬於 J2EE 規范)用作實現的一部分。Struts繼承了MVC的各項特性,並根據J2EE的特點,做了相應的變化與擴展。Struts的體系結構與工作原理如下圖2所示:

圖2

從圖2中我們可以知道,Struts的體系結構包括模型(Model),視圖(View)和控制器(Controller)三部分。

下面讓我們從MVC角度來看看struts的體系結構(Model 2)與工作原理:

1)模型(Model)

在Struts的體系結構中,模型分為兩個部分:系統的內部狀態和可以改變狀態的操作(事務邏輯)。內部狀態通常由一組ActinForm Bean表示。根據設計或應用程序復雜度的不同,這些Bean可以是自包含的並具有持續的狀態,或只在需要時才獲得數據(從某個數據庫)。大型應用程序通常在方法內部封裝事務邏輯(操作),這些方法可以被擁有狀態信息的bean調用。比如購物車bean,它擁有用戶購買商品的信息,可能還有checkOut()方法用來檢查用戶的信用卡,並向倉庫發定貨信息。 小型程序中,操作可能會被內嵌在Action類,它是struts框架中控制器角色的一部分。當邏輯簡單時這個方法很適合。 建議用戶將事務邏輯(要做什麼)與Action類所扮演的角色(決定做什麼)分開。

2)視圖(View)

視圖主要由JSP建立,struts包含擴展自定義標簽庫(TagLib),可以簡化創建完全國際化用戶界面的過程。目前的標簽庫包括:Bean Tags、HTML tags、Logic Tags、Nested Tags 以及Template Tags等。

3)控制器(Controller)

在struts中,基本的控制器組件是ActionServlet類中的實例servelt,實際使用的servlet在配置文件中由一組映射(由ActionMapping類進行描述)進行定義。對於業務邏輯的操作則主要由Action、ActionMapping、ActionForward這幾個組件協調完成的,其中Action扮演了真正的業務邏輯的實現者,ActionMapping與ActionForward則指定了不同業務邏輯或流程的運行方向。struts-config.xml 文件配置控制器。

  Struts體系結構中的組件

圖3

上圖3顯示了 ActionServlet (Controller)、ActionForm (Form State) 和 Action (Model Wrapper) 之間的最簡關系。

體系結構中所使用的組件如下表:

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

Struts配置文件:struts-config.xml

Struts配置文件struts-config.xml,我們默認可以在目錄\\WEB-INF\\struts-config.xml找到這個文件。文件的配置包括全局轉發、ActionMapping類、ActionForm bean 和JDBC數據源四個部分。

1)配置全局轉發

全局轉發用來在JSP頁之間創建邏輯名稱映射。轉發都可以通過對調用操作映射的實例來獲得,例如:

actionMappingInstace.findForward("logicalName");

全局轉發的例子:

<global-forwards>
 <forward name="bookCreated" path="/BookView.jsp"/>
</global-forwards>

屬性 描述 Name 全局轉發的名字 Path 與目標URL的相對路徑

2)配置ActionMapping

ActionMapping對象幫助進行框架內部的流程控制,它們可將請求URI映射到Action類,並且將Action類與ActionForm bean相關聯。ActionServlet在內部使用這些映射,並將控制轉移到特定Action類的實例。所有Action類使用perform()方法實現特定應用程序代碼,返回一個ActionForward對象,其中包括響應轉發的目標資源名稱。例如:

<action-mappings>
 <action path="/createBook" type="BookAction" name="bookForm" scope="request" input="/CreateBook.jsp">
 </action>
 <forward name="failure" path="/CreateBook.jsp"/>
 <forward name="cancel" path="/index.jsp"/>
</action-mappings>

屬性 描述 Path Action類的相對路徑 Name 與本操作關聯的Action bean的名稱 Type 連接到本映射的Action類的全稱(可有包名) Scope ActionForm bean的作用域(請求或會話) Prefix 用來匹配請求參數與bean屬性的前綴 Suffix 用來匹配請求參數與bean屬性的後綴 attribute 作用域名稱。 className ActionMapping對象的類的完全限定名默認的類是org.apache.struts.action.ActionMapping input 輸入表單的路徑,指向bean發生輸入錯誤必須返回的控制 unknown 設為true,操作將被作為所有沒有定義的ActionMapping的URI的默認操作 validate 設置為true,則在調用Action對象上的perform()方法前,ActionServlet將調用ActionForm bean的validate()方法來進行輸入檢查

通過<forward>元素,可以定義資源的邏輯名稱,該資源是Action類的響應要轉發的目標。

屬性 描述 Id ID ClassName ActionForward類的完全限定名,默認是org.apache.struts.action.ActionForward Name 操作類訪問ActionForward時所用的邏輯名 Path 響應轉發的目標資源的路徑 redirect 若設置為true,則ActionServlet使用sendRedirect()方法來轉發資源

3)配置ActionForm Bean

ActionServlet使用ActionForm來保存請求的參數,這些bean的屬性名稱與HTTP請求參數中的名稱相對應,控制器將請求參數傳遞到ActionForm bean的實例,然後將這個實例傳送到Action類。例子:

<form-beans>
 <form-bean name="bookForm" type="BookForm"/>
</form-beans>

屬性 描述 Id ID className ActionForm bean的完全限定名,默認值是org.apache.struts.action.ActionFormBean Name 表單bean在相關作用域的名稱,這個屬性用來將bean與ActionMapping進行關聯 Type 類的完全限定名

4)配置JDBC數據源

用<data-sources>元素可以定義多個數據源:

屬性 描述 Id ID Key Action類使用這個名稱來尋找連接 Type 實現JDBC接口的類的名稱

下面屬性需要<set-property>元素定義,在Struts 1.1版本中已不在使用,但你可用<data-source>元素。例如:

<data-sources>
 <data-source id="DS1" key="conPool" type="org.apache.struts.util.GenericDataSource"
  <set-property id="SP1" autoCommit="true" description="Example Data Source Configuration"
driverClass="org.test.mm.mysql.Driver" maxCount="4"
minCount="2" url="jdbc:mysql://localhost/test" user="struts" password="ghq123" />
 <data-source/>
</data-sources>

屬性 描述 desciption 數據源的描述 autoCommit 數據源創建的連接所使用的默認自動更新數據庫模式 driverClass 數據源所使用的類,用來顯示JDBC驅動程序接口 loginTimeout 數據庫登陸時間的限制,以秒為單位 maxCount 最多能建立的連接數目 minCount 要創建的最少連接數目 password 數據庫訪問的密碼 readOnly 創建只讀的連接 User 訪問數據庫的用戶名 url JDBC的URL

通過指定關鍵字名稱,Action類可以訪問數據源,例如:

javax.sql.DataSource ds = servlet.findDataSource("conPool");
javax.sql.Connection con = ds.getConnection();

從struts的組件來看Struts 的工作原理

對於Struts 如何控制、處理客戶請求,讓我們通過對struts的四個核心組件介紹來具體說明。這四個組件就是:ActionServlet、Action Classes,Action Mapping以及ActionFrom Bean。

1) Struts ActionServlet

ActionServlet繼承自javax.servlet.http.HttpServlet類,其在Struts 體系結構中扮演的角色失控制器,控制器ActionServlet主要負責將HTTP的客戶請求信息組裝後,根據配置文件的指定描述,轉發到適當的處理器。

按照Servelt的標准,所有得Servlet必須在web配置文件(web.xml)聲明。同樣,ActoinServlet必須在Web Application配置文件(web.xml)中描述。

當用戶向服務器端提交請求的時候,實際上信息是首先發送到控制器ActionServlet,一旦控制器獲得了請求,其就會將請求信息傳交給一些輔助類(help classes)處理。這些輔助類知道如何去處理與請求信息所對應的業務操作。在Struts中,這個輔助類就是org.apache.struts.action.Action。通常開發者需要自己繼承Aciton類,從而實現自己的Action實例。

2) Struts Action Classes

一個Action 類的角色,就像客戶請求動作和業務邏輯處理之間的一個適配器(Adaptor),其功能就是將請求與業務邏輯分開。這樣的分離,使得客戶請求和Action類之間可以有多個點對點的映射。而且Action類通常還提供了其它的輔助功能,比如:認證(authorization)、日志(logging)和數據驗證(validation)。

3) Struts ActionMapping

將特定請求映射到特定Action的相關信息存儲在ActionMapping中,ActionServelt將ActionMapping傳送到Action類的perform()方法,Action將使用ActionMapping的findForward()方法,此方法返回一個指定名稱的ActionForward,這樣Action就完成了本地轉發。若沒有找到具體的ActionForward,就返回一個null。

4) Struts ActionForm Bean

一個應用系統的消息轉移(或者說狀態轉移)的非持久性數據存儲,是由ActionForm Bean的負責保持的。

ActionForm的主要功能就是為Action的操作提供與客戶表單相映射的數據(如果在客戶指定的情況下,還包括對數據進行校驗)。Action負責對系統數據狀態的保持,而Action則負責根據業務邏輯的需要,對數據狀態進行修改,在改變系統狀態後,ActionForm則自動的回寫新的數據狀態並保持。

在ActionForm的使用中,Struts提倡使用到值對象。這樣將客戶或開發人員,對數據狀態與對象狀態能夠更加清晰的理解和使用。

對於每一個客戶請求,Struts 體系結構在處理ActionForm的時候,一般需要經歷如下幾個步驟:

① 檢查Action的映射,確定Action中已經配置了對ActionForm的映射;

② 根據name屬性,查找form bean的配置信息;

③ 檢查Action的formbean的使用范圍,確定在此范圍下,是否已經有此form bean的實例;

④假如當前范圍下,已經存在了此form bean的實例,而是對當前請求來說,是同一種類型的話,那麼就重用;

⑤ 否則,就重新構建一個form bean的實例;

⑥form bean的reset()方法備調用;

⑦ 調用對應的setter方法,對狀態屬性賦值;

⑧ 如果validatede的屬性北設置為true,那麼就調用form bean的validate()方法。

如果validate()方法沒有返回任何錯誤,控制器將ActionForm作為參數,傳給Action實例的execute()方法並執行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved