1.2 Struts的體系結構
Struts 有一組相互協(xié)作的類、 Serlvet 以及 Jsp TagLib 組成?;? Struts 構架的 web 應用程序基本上符合 JSP Model2 的設計標準,可以說是 MVC 設計模式的一種變化類型。根據(jù)上面對 framework 的描述,我們很容易理解為什么說 Struts 是一個 web framwork ,而不僅僅是一些標記庫的組合。但 Struts 也包含了豐富的標記庫和獨立于該框架工作的實用程序類。
Struts 有其自己的控制器( Controller ),同時整合了其他的一些技術去實現(xiàn)模型層( Model )和視圖層( View )。在模型層, Struts 可以很容易的與數(shù)據(jù)訪問技術相結合,包括 EJB,JDBC 和 Object Relation Bridge 。在視圖層, Struts 能夠與 JSP, Velocity Templates,XSL 等等這些表示層組件想結合。
?
1.2.1 Struts的與Web App的關系
???? 既然
struts
叫做
web framework
,那么其肯定主要基于
web
層的應用系統(tǒng)開發(fā)。按照
J2EE Architecture
的標準,
struts
應當和
jsp/servlet
一樣,存在于
web container
一層。
?
?
?
?
1.2.2 Struts 的體系結構 ? ?
?
???? Struts 是一個基于 Sun J2EE 平臺的 MVC 框架,主要是采用 Servlet 和 JSP 技術來實現(xiàn)的。其最初萌芽于 Craig McClanahan 的構思, 2000 年 1.0 版本誕生至今年已經快 10 年了?,F(xiàn)在, Struts 是 Apache 軟件基金會旗下 Jakarta 項目組的一部分,其官方網(wǎng)站是 http://jakarta.apache.org/struts 。由于 Struts 能充分滿足應用開發(fā)的需求,簡單易用,敏捷迅速,一直是 WEB 開發(fā)的主流框架。 Struts 把 Servlet 、 JSP 、自定義標簽和信息資源 (message resources) 整合到一個統(tǒng)一的框架中,開發(fā)人員利用其進行開發(fā)時不用再自己編碼實現(xiàn)全套 MVC 模式,極大的節(jié)省了時間,所以說 Struts 是一個非常不錯的應用框架。
我們說 struts framework 是 MVC 模式的體現(xiàn),下面我們就從分別從模型、視圖、控制來看看 struts 的體系結構( Architecture )。下圖顯示了 struts framework 的體系結構響應客戶請求時候,各個部分工作的原理。
?
?
?
Struts 的體系結構實現(xiàn)了 Model-View-Controller 設計模式的概念,它將這些概念映射到 web 應用程序的組件和概念中,如下圖所示:
?
?
?
?
?
1.2.3 Struts 的基本組件包
整個 struts 大約有 15 包,近 200 個類所組成,而且數(shù)量還在不斷的擴展。在此我們不能一一介紹,只能列舉幾個主要的簡要的介紹一下。下表說明了目前 struts api 中基本的幾個組件包,包括 action,actions,config,util,taglib,validator 。下圖則顯現(xiàn)了這幾個組件包之間的關系。其中 action 是整個 struts framework 的核心
org.apache.struts.action |
基本上,控制整個 struts framework 的運行的核心類、組件都在這個包中,比如我們上面提到的控制器 ActionServlet 。已經有 Action,ActionForm,ActionMapping 等等。 struts1.1 比 1.0 多了 DynaActionForm 類。增加了動態(tài)擴展生成 FormBean 功能 |
org.apache.struts.actions |
這個包是主要作用是提供客戶的 http 請求和業(yè)務邏輯處理之間的特定適配器轉換功能,而 1.0 版本中的部分動態(tài)增刪 FromBean 的類,也在 struts1.1 中被 Action 包的 DynaActionForm 組件所取代 |
org.apache.struts.config |
提供對配置文件 struts-config.xml 元素的映射。這也是 sturts1.1 中新增的功能 |
org.apache.struts.util |
Struts 為了更好支持 web application 的應用,體統(tǒng)了一些常用服務的支持,比如 Connection Pool 和 Message Source 。詳細信息請參考 http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html |
org.apache.struts.taglib |
這不是一個包,而是是一個客戶標簽類的集合。下面包括 Bean Tags , HTML Tags , Logic Tags , Nested Tags , Template Tags 這幾個用于構建用戶界面的標簽類。 |
org.apache.struts.validator |
Struts1.1 framework 中增加了 validator framework ,用于動態(tài)的配置 from 表單的驗證。 |
Struts 的基本組件關系圖
?
Struts 的框架可分為以下四個主要部分,其中三個就和 MVC 模式緊密相關:可分為以下四個主要部分,其中三個就和 MVC 模式緊密相關:
1. 模型 (Model) ,本質上來說在 Struts 中 Model 是一個 Action 類 ( 這個會在后面詳細討論 ) ,開發(fā)者通過其實現(xiàn)商業(yè)邏輯,同時用戶請求通過控制器 (Controller) 向 Action 的轉發(fā)過程是基于由 struts-config.xml 文件描述的配置信息的。
2. 視圖 (View) , View 是由與控制器 Servlet 配合工作的一整套 JSP 定制標簽庫構成,利用她們我們可以快速建立應用系統(tǒng)的界面。
3. 控制器 (Controller) ,本質上是一個 Servlet ,將客戶端請求轉發(fā)到相應的 Action 類。
4. 一堆用來做 XML 文件解析的工具包, Struts 是用 XML 來描述如何自動產生一些 JavaBean 的屬性的,此外 Struts 還利用 XML 來描述在國際化應用中的用戶提示信息的 ( 這樣一來就實現(xiàn)了應用系統(tǒng)的多語言支持 ) 。
好,下一步咱們來看看構成這個框架的各個部分以及相互之間是怎樣運作的吧!
? ???? 在使用 Struts 之前,咱們必先設置好 JSP 服務器,以便讓服務器在用戶請求時,知道該如何將指定后綴的請求轉到相應的 Controller - Struts ActionServlet 處理,當然,這些配置信息都一般在服務器啟動時通過 web.xml 文件讀入的。我們可以在 web.xml 定義多個 Controlloer ,為每一個應用定義一個。一個典型的 web.xml 文件配置如下,其中有相應的注釋,很好懂的,在后面討論 Action 的時候,我們將主要分析 struts-config.xml 。
<web-app>
<servlet>
<!--
以下配置信息聲明了 Struts 中的 ActionServlet ,即一個名為 OreillyAction 的 Servlet ,其具體實現(xiàn)為 org.apache.struts.action.ActionServlet 。在這個配置中還有這個 Servlet 的兩個參數(shù): debug level 和 detail ,此處這兩個參數(shù)的值都設為了 2 ,此外還設置了在啟動載入時創(chuàng)建兩個實例。
-->
?
<servlet-name>OreillyActionServlet</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!--
設置所有后綴為 .action 的請求,都轉發(fā)到 OreillyActionServlet
-->
<servlet-mapping>
<servlet-name> OreillyActionServlet </servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<!--
將初始請求頁面設置為 login.jsp
-->
<welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list>
<!--
設置 Struts 的 JSP 頁面要用到的標簽庫和她們的路徑
-->
<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-html.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
</web-app>
?
1. 控制器 (Controller)
?
Controller 是這個框架中扮演“交通警察”的角色,當客戶端與服務器有交互動作時,都由她來控制。 Controller 將 HTTP 請求封包并轉發(fā)到框架中相應的對象,這些對象可能是一個 JSP 頁面或一個 Action 。
Controller 在 web.xml 中設置為 org.apache.struts.action.ActionServlet 的一個實例,在本例中,這個實例就是 OreillyActionServlet 。在一個完整的控制過程中,也就是處理一個 HTTP 請求時,在控制過程之初,這個 Servlet 會從一個配置文件 struts-config.xml 中獲取請求與控制動作向對應的配置信息,這個我們會在后面詳細討論, Controller 通過這些配置信息來決定 HTTP 請求該往何處轉發(fā),而這些 Action 在接收到轉發(fā)來的請求后,實現(xiàn)真正的商業(yè)邏輯。我們要注意的非常重要的一點是 Action 對象要能夠調用這個 ActionServlet 的若干方法,通過這個有力的特性,當 Action 對象在控制過程中將請求再向別的 Action 對象轉發(fā)時 ( 最初的請求是由 ActionServlet 獲取,向 Action 對象轉發(fā),而 Action 對象還可以再轉發(fā)到別的對象 ) ,我們可以將一些需要共享的數(shù)據(jù)對象通過調用一些方法放入這個 Servlet 相關的一些標準容器中捎帶過去。
?
2. 模型 (Model)
?
所謂 Model 就是在對用戶請求的整個控制過程中,真正處理用戶請求并保存處理結果的對象,在整個過程中,我們一般利用 JavaBean 來把一些信息保存起來以便在各個對象之間傳遞。因為在框架中, Model 對象是真正處理商業(yè)邏輯功能的對象,因此也就是框架中應用需求實現(xiàn)相關性最大的部分。在 Struts 的實現(xiàn)里, Model 的具體表現(xiàn)形式就是 ActionForm 對象和與其對應的 Action 對象了。對用戶提交表單的數(shù)據(jù)進行校驗,甚至對數(shù)據(jù)進行預處理都能在 ActionForm 中完成。通常的應用中,一般是一個 Model 對象和一個請求頁面對應的關系,但也可以一個 Model 對象對應多個頁面請求。如果 struts-config.xml 配置文件沒有指定一個 Model 對象對應的 Action ,那么控制器將直接把 ( 通過 Model 對象完成數(shù)據(jù)封裝的 ) 請求轉到一個 View 對象。
?
3.struts-config.xml 文件
?
前面多次提到的 struts-config.xml 配置文件是整個框架的主心骨。 web.xml 文件定義了一個請求到來應向何處轉發(fā)后,后面的工作就全權由 struts-config.xml 管理控制了。可以說 struts-config.xml 就是整個 Struts 框架的“扛把子” ( 譯注 3) ,只有這位“老大”清楚所有請求與動作的映射關系,要是他哪里沒有搞定或不爽的話,整個“社團”就什么也擺不平了 :) 如今的應用系統(tǒng), XML 形式的配置文件越來越多,如果整個系統(tǒng)只使用一個這樣的配置文件的話,那么保持整個系統(tǒng)的模塊化和可維護性都非常的輕松。使用配置文件來描述請求 - 動作的控制過程和相互關系,而不是在代碼中將對象之間的調用關系寫死,那么都應用系統(tǒng)有變動時,我們只用修改配置文件就行了,而不是再重新編譯發(fā)布程序了。
Controller 通過 struts-config.xml 文件的配置信息確定當有請求時應該調用那個對象來處理,從效率的角度出發(fā),這些信息都是在系統(tǒng)啟動時讀入并存在內存中的。下面我們將講解一個極短小的 struts-config.xml 文件,文件中定義了一個與登錄請求對應的登錄動作,請求到達后將被轉發(fā)到 com.oreilly.ui.authentication.actions.LoginAction 這個 Action 對象,該對象處理的結果決定向用戶返回的頁面。這個例子同時還示范了一個 Action 對象將請求轉發(fā)到別的 Action 對象,而例子中另一個返回的對象則是一個 View 對象,即我們看到的 login.jsp 頁面。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
?
<struts-config>
<!-- ========== Action 映射定義 =================== -->
<action-mappings>
<!-- <action> 屬性的說明 -->
<!-
type - 完整的 Action 實現(xiàn)類名
name - 該 Action 要用到的 ActionForm 名
path - 請求該 Action 的 URI
unknown – 如果將該屬性設置為 true ,那么就是聲明這個 Action 將處理整個應用中所有未找到相應處理 Action 的請求,當然,一個應用系統(tǒng)中也只會有一個 Action 的 unknown 屬性可以設為 true 了
validate - 如果本屬性為 true 則在 Action 動作之前其對應的 ActionForm 的 validate 方法會自動被調用,一般用以校驗用戶輸入的數(shù)據(jù)
-->
<!-- ~~~~~~~~~~~~~~~~~~~~~ -->
<!-- O'Reilly Main Actions -->
<!-- ~~~~~~~~~~~~~~~~~~~~~ -->
<action path="/Login"
type="com.oreilly.ui.authentication.actions.LoginAction">
<forward name="success" path="/DisplayMainPage.action"/>
<forward name="failure" path="/login.jsp"/>
</action>
</action-mappings>
</struts-config>
?
4. 視圖 (View)
?
View 對象通常來說都是指的 JSP 頁面。 Struts 框架實際上并沒有真正的 JSP 的要求規(guī)范,而是提供了大量的標簽庫來為開發(fā)者更簡便的將 JSP 整合到 Struts 框架中。在 Struts 中通過標簽定義方式的 JSP 頁面能夠將用戶通過表單輸入的數(shù)據(jù)存入一個 JavaBean 中,也就是我們前面提到的 ActionForm bean 。通過 Action 類調用 ( 自動或手動 )ActionForm 的校驗方法來檢查用戶輸入的數(shù)據(jù),如果發(fā)現(xiàn)不合法的數(shù)據(jù),再通過 Struts 的一個通用機制將錯誤信息返回給用戶顯示。
Struts 框架提供了若干個標簽庫,它們有各自不同的用途。由于這些庫還可以脫離 Struts 框架單獨使用,這樣我們也可以在其他系統(tǒng)中嘗試使用這些標簽庫,它們包括:
* struts-html - 這個標簽庫用來創(chuàng)建動態(tài)的 HTML 頁面和表單。
* struts-bean - 提供了類似甚至更強于 <jsp:useBean> 中的功能。
* struts-logic - 用于在頁面輸出文本信息時的條件、循環(huán)等流程的控制。
* struts-template - 用于產生有共同風格的動態(tài) JSP 頁面模板。
此外,可定制標簽庫在 Struts 中還有一大用處是,通過資源文件的方式來實現(xiàn)應用系統(tǒng)的多語言特性,應用 Struts 的系統(tǒng)若想將系統(tǒng)中的用戶交互信息換一種語言的會很簡單,更換一個不同的資源文件就可以了。
?
?
?
1. ?????? 從視圖角度( View )
?
首先, Struts 提供了 Java 類 org. apache.struts.action.ActionForm , Java 開發(fā)者將該類細分來創(chuàng)建表單 bean 。在運行時,該 bean 有兩種用法:
(1) 當 JSP 準備相關的 HTML ,表單以進行顯示時, JSP 將訪問該 bean( 它保存要放入表單中的值 ) 。那些值是從業(yè)務邏輯或者是從先前的用戶輸入來提供的。
(2) 當從 Web 瀏覽器中返回用戶輸入時,該 bean 將驗證并保存該輸入以供業(yè)務邏輯或 ( 如果驗證失敗的話 ) 后續(xù)重新顯示使用。
(3) 其次, Struts 提供了許多定制 JSP 標記,它們的使用簡單,但是它們在隱藏信息方面功能強大。例如,除了 bean 名稱和給定 bean 中每個段的名稱必須相同。 StudentView.jsp :它從 Student.java 獲得學生數(shù)據(jù)來顯示。
2 .模型角度( Model )
?
Struts 雖然不直接有助于模型開發(fā)。 在 Struts 中,系統(tǒng) 模型 的狀態(tài)主要由 ActiomForm Bean 和值對象體現(xiàn)。如: Student.java- 學生信息,它提供一個簡單的組件方法來維護學生信息。
3 .控制器角度( Controller )
?
??? 在 Struts framework 中, Controller 主要是 ActionServlet ,但是對于業(yè)務邏輯的操作則主要由 Action 、 ActionMapping 、 ActionForward 這幾個組件協(xié)調完成(也許這幾個組件,應該劃分到模型中的業(yè)務邏輯一塊)。其中, Action 扮演了真正的控制邏輯的實現(xiàn)者,而 ActionMapping 和 ActionForward 則指定了不同業(yè)務邏輯或流程的運行方向。 StudentAction.java :用來幫助用戶輸入數(shù)據(jù)的確認,并選擇哪個 View 來顯示結果,如果出錯則顯示一個錯誤頁面。
??? 總之: model 提供了一個內部數(shù)據(jù)的表示。 View 不做任何決定,只顯示數(shù)據(jù)。 Controler 決定處理的過程以及下一步要做什么?
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
