日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Struts由入門到精通(第一章)- Struts的體系結(jié)

系統(tǒng) 1696 0

1.2 Struts的體系結(jié)構(gòu)

Struts 有一組相互協(xié)作的類、 Serlvet 以及 Jsp TagLib 組成。基于 Struts 構(gòu)架的 web 應(yīng)用程序基本上符合 JSP Model2 的設(shè)計標(biāo)準(zhǔn),可以說是 MVC 設(shè)計模式的一種變化類型。根據(jù)上面對 framework 的描述,我們很容易理解為什么說 Struts 是一個 web framwork ,而不僅僅是一些標(biāo)記庫的組合。但 Struts 也包含了豐富的標(biāo)記庫和獨立于該框架工作的實用程序類。

Struts 有其自己的控制器( Controller ),同時整合了其他的一些技術(shù)去實現(xiàn)模型層( Model )和視圖層( View )。在模型層, Struts 可以很容易的與數(shù)據(jù)訪問技術(shù)相結(jié)合,包括 EJB,JDBC Object Relation Bridge 。在視圖層, Struts 能夠與 JSP, Velocity Templates,XSL 等等這些表示層組件想結(jié)合。

?

1.2.1 Struts的與Web App的關(guān)系


???? 既然 struts 叫做 web framework ,那么其肯定主要基于 web 層的應(yīng)用系統(tǒng)開發(fā)。按照 J2EE Architecture 的標(biāo)準(zhǔn), struts 應(yīng)當(dāng)和 jsp/servlet 一樣,存在于 web container 一層。

?

Struts由入門到精通(第一章)- Struts的體系結(jié)構(gòu)

?

?

?

1.2.2 Struts 的體系結(jié)構(gòu) ? ?

?

???? Struts 是一個基于 Sun J2EE 平臺的 MVC 框架,主要是采用 Servlet JSP 技術(shù)來實現(xiàn)的。其最初萌芽于 Craig McClanahan 的構(gòu)思, 2000 1.0 版本誕生至今年已經(jīng)快 10 年了。現(xiàn)在, Struts Apache 軟件基金會旗下 Jakarta 項目組的一部分,其官方網(wǎng)站是 http://jakarta.apache.org/struts 。由于 Struts 能充分滿足應(yīng)用開發(fā)的需求,簡單易用,敏捷迅速,一直是 WEB 開發(fā)的主流框架。 Struts Servlet JSP 、自定義標(biāo)簽和信息資源 (message resources) 整合到一個統(tǒng)一的框架中,開發(fā)人員利用其進(jìn)行開發(fā)時不用再自己編碼實現(xiàn)全套 MVC 模式,極大的節(jié)省了時間,所以說 Struts 是一個非常不錯的應(yīng)用框架。

我們說 struts framework MVC 模式的體現(xiàn),下面我們就從分別從模型、視圖、控制來看看 struts 的體系結(jié)構(gòu)( Architecture )。下圖顯示了 struts framework 的體系結(jié)構(gòu)響應(yīng)客戶請求時候,各個部分工作的原理。

?

?

Struts由入門到精通(第一章)- Struts的體系結(jié)構(gòu)

?

Struts 的體系結(jié)構(gòu)實現(xiàn)了 Model-View-Controller 設(shè)計模式的概念,它將這些概念映射到 web 應(yīng)用程序的組件和概念中,如下圖所示:

?

Struts由入門到精通(第一章)- Struts的體系結(jié)構(gòu)

?

?

?

?

1.2.3 Struts 的基本組件包

整個 struts 大約有 15 包,近 200 個類所組成,而且數(shù)量還在不斷的擴展。在此我們不能一一介紹,只能列舉幾個主要的簡要的介紹一下。下表說明了目前 struts api 中基本的幾個組件包,包括 action,actions,config,util,taglib,validator 。下圖則顯現(xiàn)了這幾個組件包之間的關(guān)系。其中 action 是整個 struts framework 的核心

org.apache.struts.action

基本上,控制整個 struts framework 的運行的核心類、組件都在這個包中,比如我們上面提到的控制器 ActionServlet 。已經(jīng)有 Action,ActionForm,ActionMapping 等等。 struts1.1 1.0 多了 DynaActionForm 類。增加了動態(tài)擴展生成 FormBean 功能

org.apache.struts.actions

這個包是主要作用是提供客戶的 http 請求和業(yè)務(wù)邏輯處理之間的特定適配器轉(zhuǎn)換功能,而 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 的應(yīng)用,體統(tǒng)了一些常用服務(wù)的支持,比如 Connection Pool Message Source 。詳細(xì)信息請參考

http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html

org.apache.struts.taglib

這不是一個包,而是是一個客戶標(biāo)簽類的集合。下面包括 Bean Tags HTML Tags Logic Tags Nested Tags Template Tags 這幾個用于構(gòu)建用戶界面的標(biāo)簽類。

org.apache.struts.validator

Struts1.1 framework 中增加了 validator framework ,用于動態(tài)的配置 from 表單的驗證。

?

Struts 的基本組件關(guān)系圖

?
1.2.4 Struts 的框架

?

Struts 的框架可分為以下四個主要部分,其中三個就和 MVC 模式緊密相關(guān):可分為以下四個主要部分,其中三個就和 MVC 模式緊密相關(guān):

1. 模型 (Model) ,本質(zhì)上來說在 Struts Model 是一個 Action ( 這個會在后面詳細(xì)討論 ) ,開發(fā)者通過其實現(xiàn)商業(yè)邏輯,同時用戶請求通過控制器 (Controller) Action 的轉(zhuǎn)發(fā)過程是基于由 struts-config.xml 文件描述的配置信息的。

2. 視圖 (View) View 是由與控制器 Servlet 配合工作的一整套 JSP 定制標(biāo)簽庫構(gòu)成,利用她們我們可以快速建立應(yīng)用系統(tǒng)的界面。

3. 控制器 (Controller) ,本質(zhì)上是一個 Servlet ,將客戶端請求轉(zhuǎn)發(fā)到相應(yīng)的 Action 類。

4. 一堆用來做 XML 文件解析的工具包, Struts 是用 XML 來描述如何自動產(chǎn)生一些 JavaBean 的屬性的,此外 Struts 還利用 XML 來描述在國際化應(yīng)用中的用戶提示信息的 ( 這樣一來就實現(xiàn)了應(yīng)用系統(tǒng)的多語言支持 )

好,下一步咱們來看看構(gòu)成這個框架的各個部分以及相互之間是怎樣運作的吧!

? ???? 在使用 Struts 之前,咱們必先設(shè)置好 JSP 服務(wù)器,以便讓服務(wù)器在用戶請求時,知道該如何將指定后綴的請求轉(zhuǎn)到相應(yīng)的 Controller Struts ActionServlet 處理,當(dāng)然,這些配置信息都一般在服務(wù)器啟動時通過 web.xml 文件讀入的。我們可以在 web.xml 定義多個 Controlloer ,為每一個應(yīng)用定義一個。一個典型的 web.xml 文件配置如下,其中有相應(yīng)的注釋,很好懂的,在后面討論 Action 的時候,我們將主要分析 struts-config.xml

<web-app>

<servlet>

<!--

以下配置信息聲明了 Struts 中的 ActionServlet ,即一個名為 OreillyAction Servlet ,其具體實現(xiàn)為 org.apache.struts.action.ActionServlet 。在這個配置中還有這個 Servlet 的兩個參數(shù): debug level detail ,此處這兩個參數(shù)的值都設(shè)為了 2 ,此外還設(shè)置了在啟動載入時創(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>

<!--

設(shè)置所有后綴為 .action 的請求,都轉(zhuǎn)發(fā)到 OreillyActionServlet

-->

<servlet-mapping>

<servlet-name> OreillyActionServlet </servlet-name>

<url-pattern>*.action</url-pattern>

</servlet-mapping>

<!--

將初始請求頁面設(shè)置為 login.jsp

-->

<welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list>

<!--

設(shè)置 Struts JSP 頁面要用到的標(biāo)簽庫和她們的路徑

-->

<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 是這個框架中扮演“交通警察”的角色,當(dāng)客戶端與服務(wù)器有交互動作時,都由她來控制。 Controller HTTP 請求封包并轉(zhuǎn)發(fā)到框架中相應(yīng)的對象,這些對象可能是一個 JSP 頁面或一個 Action

Controller web.xml 中設(shè)置為 org.apache.struts.action.ActionServlet 的一個實例,在本例中,這個實例就是 OreillyActionServlet 。在一個完整的控制過程中,也就是處理一個 HTTP 請求時,在控制過程之初,這個 Servlet 會從一個配置文件 struts-config.xml 中獲取請求與控制動作向?qū)?yīng)的配置信息,這個我們會在后面詳細(xì)討論, Controller 通過這些配置信息來決定 HTTP 請求該往何處轉(zhuǎn)發(fā),而這些 Action 在接收到轉(zhuǎn)發(fā)來的請求后,實現(xiàn)真正的商業(yè)邏輯。我們要注意的非常重要的一點是 Action 對象要能夠調(diào)用這個 ActionServlet 的若干方法,通過這個有力的特性,當(dāng) Action 對象在控制過程中將請求再向別的 Action 對象轉(zhuǎn)發(fā)時 ( 最初的請求是由 ActionServlet 獲取,向 Action 對象轉(zhuǎn)發(fā),而 Action 對象還可以再轉(zhuǎn)發(fā)到別的對象 ) ,我們可以將一些需要共享的數(shù)據(jù)對象通過調(diào)用一些方法放入這個 Servlet 相關(guān)的一些標(biāo)準(zhǔn)容器中捎帶過去。

?

2. 模型 (Model)

?

所謂 Model 就是在對用戶請求的整個控制過程中,真正處理用戶請求并保存處理結(jié)果的對象,在整個過程中,我們一般利用 JavaBean 來把一些信息保存起來以便在各個對象之間傳遞。因為在框架中, Model 對象是真正處理商業(yè)邏輯功能的對象,因此也就是框架中應(yīng)用需求實現(xiàn)相關(guān)性最大的部分。在 Struts 的實現(xiàn)里, Model 的具體表現(xiàn)形式就是 ActionForm 對象和與其對應(yīng)的 Action 對象了。對用戶提交表單的數(shù)據(jù)進(jìn)行校驗,甚至對數(shù)據(jù)進(jìn)行預(yù)處理都能在 ActionForm 中完成。通常的應(yīng)用中,一般是一個 Model 對象和一個請求頁面對應(yīng)的關(guān)系,但也可以一個 Model 對象對應(yīng)多個頁面請求。如果 struts-config.xml 配置文件沒有指定一個 Model 對象對應(yīng)的 Action ,那么控制器將直接把 ( 通過 Model 對象完成數(shù)據(jù)封裝的 ) 請求轉(zhuǎn)到一個 View 對象。

?

3.struts-config.xml 文件

?

前面多次提到的 struts-config.xml 配置文件是整個框架的主心骨。 web.xml 文件定義了一個請求到來應(yīng)向何處轉(zhuǎn)發(fā)后,后面的工作就全權(quán)由 struts-config.xml 管理控制了。可以說 struts-config.xml 就是整個 Struts 框架的“扛把子” ( 譯注 3) ,只有這位“老大”清楚所有請求與動作的映射關(guān)系,要是他哪里沒有搞定或不爽的話,整個“社團(tuán)”就什么也擺不平了 :) 如今的應(yīng)用系統(tǒng), XML 形式的配置文件越來越多,如果整個系統(tǒng)只使用一個這樣的配置文件的話,那么保持整個系統(tǒng)的模塊化和可維護(hù)性都非常的輕松。使用配置文件來描述請求 - 動作的控制過程和相互關(guān)系,而不是在代碼中將對象之間的調(diào)用關(guān)系寫死,那么都應(yīng)用系統(tǒng)有變動時,我們只用修改配置文件就行了,而不是再重新編譯發(fā)布程序了。

Controller 通過 struts-config.xml 文件的配置信息確定當(dāng)有請求時應(yīng)該調(diào)用那個對象來處理,從效率的角度出發(fā),這些信息都是在系統(tǒng)啟動時讀入并存在內(nèi)存中的。下面我們將講解一個極短小的 struts-config.xml 文件,文件中定義了一個與登錄請求對應(yīng)的登錄動作,請求到達(dá)后將被轉(zhuǎn)發(fā)到 com.oreilly.ui.authentication.actions.LoginAction 這個 Action 對象,該對象處理的結(jié)果決定向用戶返回的頁面。這個例子同時還示范了一個 Action 對象將請求轉(zhuǎn)發(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 如果將該屬性設(shè)置為 true ,那么就是聲明這個 Action 將處理整個應(yīng)用中所有未找到相應(yīng)處理 Action 的請求,當(dāng)然,一個應(yīng)用系統(tǒng)中也只會有一個 Action unknown 屬性可以設(shè)為 true

validate - 如果本屬性為 true 則在 Action 動作之前其對應(yīng)的 ActionForm validate 方法會自動被調(diào)用,一般用以校驗用戶輸入的數(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ī)范,而是提供了大量的標(biāo)簽庫來為開發(fā)者更簡便的將 JSP 整合到 Struts 框架中。在 Struts 中通過標(biāo)簽定義方式的 JSP 頁面能夠?qū)⒂脩敉ㄟ^表單輸入的數(shù)據(jù)存入一個 JavaBean 中,也就是我們前面提到的 ActionForm bean 。通過 Action 類調(diào)用 ( 自動或手動 )ActionForm 的校驗方法來檢查用戶輸入的數(shù)據(jù),如果發(fā)現(xiàn)不合法的數(shù)據(jù),再通過 Struts 的一個通用機制將錯誤信息返回給用戶顯示。

Struts 框架提供了若干個標(biāo)簽庫,它們有各自不同的用途。由于這些庫還可以脫離 Struts 框架單獨使用,這樣我們也可以在其他系統(tǒng)中嘗試使用這些標(biāo)簽庫,它們包括:

* struts-html - 這個標(biāo)簽庫用來創(chuàng)建動態(tài)的 HTML 頁面和表單。

* struts-bean - 提供了類似甚至更強于 <jsp:useBean> 中的功能。

* struts-logic - 用于在頁面輸出文本信息時的條件、循環(huán)等流程的控制。

* struts-template - 用于產(chǎn)生有共同風(fēng)格的動態(tài) JSP 頁面模板。

此外,可定制標(biāo)簽庫在 Struts 中還有一大用處是,通過資源文件的方式來實現(xiàn)應(yīng)用系統(tǒng)的多語言特性,應(yīng)用 Struts 的系統(tǒng)若想將系統(tǒng)中的用戶交互信息換一種語言的會很簡單,更換一個不同的資源文件就可以了。

?

?

?

1. ?????? 從視圖角度( View

?

首先, Struts 提供了 Java org. apache.struts.action.ActionForm Java 開發(fā)者將該類細(xì)分來創(chuàng)建表單 bean 。在運行時,該 bean 有兩種用法:

(1) 當(dāng) JSP 準(zhǔn)備相關(guān)的 HTML ,表單以進(jìn)行顯示時, JSP 將訪問該 bean( 它保存要放入表單中的值 ) 。那些值是從業(yè)務(wù)邏輯或者是從先前的用戶輸入來提供的。

(2) 當(dāng)從 Web 瀏覽器中返回用戶輸入時,該 bean 將驗證并保存該輸入以供業(yè)務(wù)邏輯或 ( 如果驗證失敗的話 ) 后續(xù)重新顯示使用。

(3) 其次, Struts 提供了許多定制 JSP 標(biāo)記,它們的使用簡單,但是它們在隱藏信息方面功能強大。例如,除了 bean 名稱和給定 bean 中每個段的名稱必須相同。 StudentView.jsp :它從 Student.java 獲得學(xué)生數(shù)據(jù)來顯示。

?

2 .模型角度( Model

?

Struts 雖然不直接有助于模型開發(fā)。 Struts 中,系統(tǒng) 模型 的狀態(tài)主要由 ActiomForm Bean 和值對象體現(xiàn)。如: Student.java- 學(xué)生信息,它提供一個簡單的組件方法來維護(hù)學(xué)生信息。

?

3 .控制器角度( Controller

?

??? Struts framework 中, Controller 主要是 ActionServlet ,但是對于業(yè)務(wù)邏輯的操作則主要由 Action ActionMapping ActionForward 這幾個組件協(xié)調(diào)完成(也許這幾個組件,應(yīng)該劃分到模型中的業(yè)務(wù)邏輯一塊)。其中, Action 扮演了真正的控制邏輯的實現(xiàn)者,而 ActionMapping ActionForward 則指定了不同業(yè)務(wù)邏輯或流程的運行方向。 StudentAction.java :用來幫助用戶輸入數(shù)據(jù)的確認(rèn),并選擇哪個 View 來顯示結(jié)果,如果出錯則顯示一個錯誤頁面。

??? 總之: model 提供了一個內(nèi)部數(shù)據(jù)的表示。 View 不做任何決定,只顯示數(shù)據(jù)。 Controler 決定處理的過程以及下一步要做什么?

Struts由入門到精通(第一章)- Struts的體系結(jié)構(gòu)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 麦盖提县| 太仓市| 宁城县| 沁阳市| 江永县| 炎陵县| 奉化市| 安化县| 闽清县| 顺平县| 县级市| 广汉市| 建平县| 仁怀市| 朝阳市| 东莞市| 东丰县| 巴南区| 普安县| 安吉县| 郁南县| 华池县| 河津市| 天台县| 德安县| 宜宾市| 大新县| 临夏市| 万宁市| 蒙阴县| 镇平县| 安吉县| 泽州县| 新竹市| 剑河县| 友谊县| 革吉县| 随州市| 通州区| 阳朔县| 华亭县|