<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sung in Blog

               一些技術(shù)文章 & 一些生活雜碎
    Struts是Apache 基金會(huì)Jakarta 項(xiàng)目組的一個(gè)Open Source 項(xiàng)目,它采用MVC模式,能夠很好地幫助java 開(kāi)發(fā)者利用J2EE開(kāi)發(fā)Web應(yīng)用。和其他的java架構(gòu)一樣,Struts 也是面向?qū)ο笤O(shè)計(jì),將MVC模式"分離顯示邏輯和業(yè)務(wù)邏輯"的能力發(fā)揮得淋漓盡致。Structs 框架的核心是一個(gè)彈性的控制層,基于如 Java Servlets,JavaBeans,ResourceBundles與XML等標(biāo)準(zhǔn)技術(shù),以及 Jakarta Commons 的一些類庫(kù)。Struts有一組相互協(xié)作的類(組件)、Serlvet以及jsp tag lib組成。基于struts構(gòu)架的web應(yīng)用程序基本上符合JSP Model2的設(shè)計(jì)標(biāo)準(zhǔn),可以說(shuō)是一個(gè)傳統(tǒng) MVC設(shè)計(jì)模式的一種變化類型。
      
      Struts有其自己的控制器(Controller),同時(shí)整合了其他的一些技術(shù)去實(shí)現(xiàn)模型層(Model)和視圖層(View)。在模型層,Struts可以很容易的與數(shù)據(jù)訪問(wèn)技術(shù)相結(jié)合,如 JDBC / EJB ,以及其它第三方類庫(kù),如 Hibernate / iBATIS ,或者 Object Relational Bridge(對(duì)象關(guān)系橋)。在視圖層,Struts能夠與JSP,包括 JSTL 與 JSF,以及 Velocity 模板,XSLT 與其它表示層技術(shù)。
      
      Struts 為每個(gè)專業(yè)的 Web 應(yīng)用程序做背后的支撐,幫助為你的應(yīng)用創(chuàng)建一個(gè)擴(kuò)展的開(kāi)發(fā)環(huán)境。
      
      Struts的體系結(jié)構(gòu)與工作原理
      
      MVC即Model-View-Controller的縮寫(xiě),是一種常用的設(shè)計(jì)模式。MVC 減弱了業(yè)務(wù)邏輯接口和數(shù)據(jù)接口之間的耦合,以及讓視圖層更富于變化。MVC的工作原理,如下圖1所示:
      
     

      
    圖1

      
      Struts 是MVC的一種實(shí)現(xiàn),它將 Servlet和 JSP 標(biāo)記(屬于 J2EE 規(guī)范)用作實(shí)現(xiàn)的一部分。Struts繼承了MVC的各項(xiàng)特性,并根據(jù)J2EE的特點(diǎn),做了相應(yīng)的變化與擴(kuò)展。Struts的體系結(jié)構(gòu)與工作原理如下圖2所示:
      
     

      
    圖2

      
      從圖2中我們可以知道,Struts的體系結(jié)構(gòu)包括模型(Model),視圖(View)和控制器(Controller)三部分。
      
      下面讓我們從MVC角度來(lái)看看struts的體系結(jié)構(gòu)(Model 2)與工作原理:
      
      1)模型(Model)
      
      在Struts的體系結(jié)構(gòu)中,模型分為兩個(gè)部分:系統(tǒng)的內(nèi)部狀態(tài)和可以改變狀態(tài)的操作(事務(wù)邏輯)。內(nèi)部狀態(tài)通常由一組Actinform Bean表示。根據(jù)設(shè)計(jì)或應(yīng)用程序復(fù)雜度的不同,這些Bean可以是自包含的并具有持續(xù)的狀態(tài),或只在需要時(shí)才獲得數(shù)據(jù)(從某個(gè)數(shù)據(jù)庫(kù))。大型應(yīng)用程序通常在方法內(nèi)部封裝事務(wù)邏輯(操作),這些方法可以被擁有狀態(tài)信息的bean調(diào)用。比如購(gòu)物車bean,它擁有用戶購(gòu)買商品的信息,可能還有checkOut()方法用來(lái)檢查用戶的信用卡,并向倉(cāng)庫(kù)發(fā)定貨信息。 小型程序中,操作可能會(huì)被內(nèi)嵌在Action類,它是struts框架中控制器角色的一部分。當(dāng)邏輯簡(jiǎn)單時(shí)這個(gè)方法很適合。 建議用戶將事務(wù)邏輯(要做什么)與Action類所扮演的角色(決定做什么)分開(kāi)。
      
      2)視圖(View)
      
      視圖主要由JSP建立,struts包含擴(kuò)展自定義標(biāo)簽庫(kù)(TagLib),可以簡(jiǎn)化創(chuàng)建完全國(guó)際化用戶界面的過(guò)程。目前的標(biāo)簽庫(kù)包括:Bean Tags、HTML tags、Logic Tags、Nested Tags 以及Template Tags等。
      
      3)控制器(Controller)
      
      在struts中,基本的控制器組件是ActionServlet類中的實(shí)例servelt,實(shí)際使用的servlet在配置文件中由一組映射(由ActionMapping類進(jìn)行描述)進(jìn)行定義。對(duì)于業(yè)務(wù)邏輯的操作則主要由Action、ActionMapping、ActionForward這幾個(gè)組件協(xié)調(diào)完成的,其中Action扮演了真正的業(yè)務(wù)邏輯的實(shí)現(xiàn)者,ActionMapping與ActionForward則指定了不同業(yè)務(wù)邏輯或流程的運(yùn)行方向。struts-config.xml 文件配置控制器。
      
      Struts體系結(jié)構(gòu)中的組件
      

      
    圖3

      
      上圖3顯示了 ActionServlet (Controller)、Actionform (form State) 和 Action (Model Wrapper) 之間的最簡(jiǎn)關(guān)系。
      體系結(jié)構(gòu)中所使用的組件如下表:
      ActionServlet  控制器
      ActionClass   包含事務(wù)邏輯
      Actionform   顯示模塊數(shù)據(jù)
      ActionMapping  幫助控制器將請(qǐng)求映射到操作
      ActionForward  用來(lái)指示操作轉(zhuǎn)移的對(duì)象
      ActionError   用來(lái)存儲(chǔ)和回收錯(cuò)誤
      Struts標(biāo)記庫(kù)  可以減輕開(kāi)發(fā)顯示層次的工作
      
      Struts配置文件:struts-config.xml
      
      Struts配置文件struts-config.xml,我們默認(rèn)可以在目錄WEB-INFstruts-config.xml找到這個(gè)文件。文件的配置包括全局轉(zhuǎn)發(fā)、ActionMapping類、Actionform bean 和JDBC數(shù)據(jù)源四個(gè)部分。
      
      1)配置全局轉(zhuǎn)發(fā)
      
      全局轉(zhuǎn)發(fā)用來(lái)在JSP頁(yè)之間創(chuàng)建邏輯名稱映射。轉(zhuǎn)發(fā)都可以通過(guò)對(duì)調(diào)用操作映射的實(shí)例來(lái)獲得,例如:NuW=mactionMappingInstace.findForward("logicalName");
      
      全局轉(zhuǎn)發(fā)的例子:
      <global-forwards>
      <forward name="bookCreated" path="/BookView.jsp"/>
      </global-forwards>
      
      屬性   描述
      Name   全局轉(zhuǎn)發(fā)的名字
      Path   與目標(biāo)URL的相對(duì)路徑
      
      2)配置ActionMapping
      ActionMapping對(duì)象幫助進(jìn)行框架內(nèi)部的流程控制,它們可將請(qǐng)求URI映射到Action類,并且將Action類與Actionform bean相關(guān)聯(lián)。ActionServlet在內(nèi)部使用這些映射,并將控制轉(zhuǎn)移到特定Action類的實(shí)例。所有Action類使用perform()方法實(shí)現(xiàn)特定應(yīng)用程序代碼,返回一個(gè)ActionForward對(duì)象,其中包括響應(yīng)轉(zhuǎn)發(fā)的目標(biāo)資源名稱。例如:
      
      <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類的相對(duì)路徑
      Name        與本操作關(guān)聯(lián)的Action bean的名稱
      Type        連接到本映射的Action類的全稱(可有包名)
      Scope        Actionform bean的作用域(請(qǐng)求或會(huì)話)
      Prefix       用來(lái)匹配請(qǐng)求參數(shù)與bean屬性的前綴
      Suffix       用來(lái)匹配請(qǐng)求參數(shù)與bean屬性的后綴
      attribute      作用域名稱。
      className      ActionMapping對(duì)象的類的完全限定名默認(rèn)的是
      org.apache.struts.action.ActionMapping
      input        輸入表單的路徑,指向bean發(fā)生輸入錯(cuò)誤必須返回的控制
      unknown       設(shè)為true,操作將被作為所有沒(méi)有定義的ActionMapping的URI的默認(rèn)操作
      validate      設(shè)置為true,則在調(diào)用Action對(duì)象上的perform()方法前, ActionServlet將調(diào)用Actionform bean的validate()方法來(lái)進(jìn)行輸入檢查
      通過(guò)<forward>元素,可以定義資源的邏輯名稱,該資源是Action類的響應(yīng)要轉(zhuǎn)發(fā)的目標(biāo)。
      屬性               描述
      Id ID
      ClassName           ActionForward類的完全限定名,默認(rèn)是
      org.apache.struts.action.ActionForward
      Name             操作類訪問(wèn)ActionForward時(shí)所用的邏輯名
      Path             響應(yīng)轉(zhuǎn)發(fā)的目標(biāo)資源的路徑
      redirect           若設(shè)置為true,則ActionServlet使用sendRedirec方法來(lái)轉(zhuǎn)發(fā)資源
      3)配置Actionform Bean
      ActionServlet使用Actionform來(lái)保存請(qǐng)求的參數(shù),這些bean的屬性名稱與HTTP請(qǐng)求參數(shù)中的名稱相對(duì)應(yīng),控制器將請(qǐng)求參數(shù)傳遞到Actionform bean的實(shí)例,然后將這個(gè)實(shí)例傳送到Action類。例子:
      <form-beans>
      <form-bean name="bookform" type="Bookform"/>
      </form-beans>
      屬性               描述
      Id ID
      className       Actionform bean的完全限定名,默認(rèn)值是org.apache.struts.action.ActionformBean
      Name               表單bean在相關(guān)作用域的名稱,這個(gè)屬性用來(lái)將bean與ActionMapping進(jìn)行關(guān)聯(lián)
      Type          類的完全限定名
      4)配置JDBC數(shù)據(jù)源
      用<data-sources>元素可以定義多個(gè)數(shù)據(jù)源:
      屬性        描述
      Id         ID
      Key         Action類使用這個(gè)名稱來(lái)尋找連接
      Type        實(shí)現(xiàn)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 數(shù)據(jù)源的描述
      autoCommit 數(shù)據(jù)源創(chuàng)建的連接所使用的默認(rèn)自動(dòng)更新數(shù)據(jù)庫(kù)模式
      driverClass 數(shù)據(jù)源所使用的類,用來(lái)顯示JDBC驅(qū)動(dòng)程序接口
      loginTimeout 數(shù)據(jù)庫(kù)登陸時(shí)間的限制,以秒為單位
      maxCount   最多能建立的連接數(shù)目
      minCount   要?jiǎng)?chuàng)建的最少連接數(shù)目
      password   數(shù)據(jù)庫(kù)訪問(wèn)的密碼
      eadOnly   創(chuàng)建只讀的連接
      User     訪問(wèn)數(shù)據(jù)庫(kù)的用戶名
      url     JDBC的URL
      
      通過(guò)指定關(guān)鍵字名稱,Action類可以訪問(wèn)數(shù)據(jù)源,例如:
      javax.sql.DataSource ds = servlet.findDataSource("conPool");
      javax.sql.Connection con = ds.getConnection();
      
      從struts的組件來(lái)看Struts 的工作原理
      
      對(duì)于Struts 如何控制、處理客戶請(qǐng)求,讓我們通過(guò)對(duì)struts的四個(gè)核心組件介紹來(lái)具體說(shuō)明。這四個(gè)組件就是:ActionServlet、Action Classes,Action Mapping以及ActionFrom Bean。
      
      1) Struts ActionServlet
      
      ActionServlet繼承自javax.servlet.http.HttpServlet類,其在Struts 體系結(jié)構(gòu)中扮演的角色失控制器,控制器ActionServlet主要負(fù)責(zé)將HTTP的客戶請(qǐng)求信息組裝后,根據(jù)配置文件的指定描述,轉(zhuǎn)發(fā)到適當(dāng)?shù)奶幚砥鳌?BR>  
      按照Servelt的標(biāo)準(zhǔn),所有得Servlet必須在web配置文件(web.xml)聲明。同樣,ActoinServlet必須在Web Application配置文件(web.xml)中描述。
      
      當(dāng)用戶向服務(wù)器端提交請(qǐng)求的時(shí)候,實(shí)際上信息是首先發(fā)送到控制器ActionServlet,一旦控制器獲得了請(qǐng)求,其就會(huì)將請(qǐng)求信息傳交給一些輔助類(help classes)處理。這些輔助類知道如何去處理與請(qǐng)求信息所對(duì)應(yīng)的業(yè)務(wù)操作。在Struts中,這個(gè)輔助類就是org.apache.struts.action.Action。通常開(kāi)發(fā)者需要自己繼承Aciton類,從而實(shí)現(xiàn)自己的Action實(shí)例。
      
      2) Struts Action Classes
      
      一個(gè)Action 類的角色,就像客戶請(qǐng)求動(dòng)作和業(yè)務(wù)邏輯處理之間的一個(gè)適配器(Adaptor),其功能就是將請(qǐng)求與業(yè)務(wù)邏輯分開(kāi)。這樣的分離,使得客戶請(qǐng)求和Action類之間可以有多個(gè)點(diǎn)對(duì)點(diǎn)的映射。而且Action類通常還提供了其它的輔助功能,比如:認(rèn)證(authorization)、日志(logging)和數(shù)據(jù)驗(yàn)證(validation)。
      
      3) Struts ActionMapping
      
      將特定請(qǐng)求映射到特定Action的相關(guān)信息存儲(chǔ)在ActionMapping中,ActionServelt將ActionMapping傳送到Action類的perform()方法,Action將使用ActionMapping的findForward()方法,此方法返回一個(gè)指定名稱的ActionForward,這樣Action就完成了本地轉(zhuǎn)發(fā)。若沒(méi)有找到具體的ActionForward,就返回一個(gè)null。
      
      4) Struts Actionform Bean
      
      一個(gè)應(yīng)用系統(tǒng)的消息轉(zhuǎn)移(或者說(shuō)狀態(tài)轉(zhuǎn)移)的非持久性數(shù)據(jù)存儲(chǔ),是由Actionform Bean的負(fù)責(zé)保持的。
      
      Actionform的主要功能就是為Action的操作提供與客戶表單相映射的數(shù)據(jù)(如果在客戶指定的情況下,還包括對(duì)數(shù)據(jù)進(jìn)行校驗(yàn))。Action負(fù)責(zé)對(duì)系統(tǒng)數(shù)據(jù)狀態(tài)的保持,而Action則負(fù)責(zé)根據(jù)業(yè)務(wù)邏輯的需要,對(duì)數(shù)據(jù)狀態(tài)進(jìn)行修改,在改變系統(tǒng)狀態(tài)后,Actionform則自動(dòng)的回寫(xiě)新的數(shù)據(jù)狀態(tài)并保持。
      
      在Actionform的使用中,Struts提倡使用到值對(duì)象。這樣將客戶或開(kāi)發(fā)人員,對(duì)數(shù)據(jù)狀態(tài)與對(duì)象狀態(tài)能夠更加清晰的理解和使用。
      
      對(duì)于每一個(gè)客戶請(qǐng)求,Struts 體系結(jié)構(gòu)在處理Actionform的時(shí)候,一般需要經(jīng)歷如下幾個(gè)步驟:
      
      ① 檢查Action的映射,確定Action中已經(jīng)配置了對(duì)Actionform的映射;
      
      ② 根據(jù)name屬性,查找form bean的配置信息;
      
      ③ 檢查Action的formbean的使用范圍,確定在此范圍下,是否已經(jīng)有此form bean的實(shí)例;
      
      ④假如當(dāng)前范圍下,已經(jīng)存在了此form bean的實(shí)例,而是對(duì)當(dāng)前請(qǐng)求來(lái)說(shuō),是同一種類型的話,那么就重用;
      
      ⑤ 否則,就重新構(gòu)建一個(gè)form bean的實(shí)例;
      
      ⑥form bean的reset()方法備調(diào)用;
      
      ⑦ 調(diào)用對(duì)應(yīng)的setter方法,對(duì)狀態(tài)屬性賦值;
      
      ⑧ 如果validatede的屬性北設(shè)置為true,那么就調(diào)用form bean的validate()方法。
      
      如果validate()方法沒(méi)有返回任何錯(cuò)誤,控制器將Actionform作為參數(shù),傳給Action實(shí)例的execute()方法并執(zhí)行。
    posted on 2005-10-26 16:20 Sung 閱讀(446) 評(píng)論(0)  編輯  收藏 所屬分類: Struts
    主站蜘蛛池模板: 亚洲日韩图片专区第1页| 亚洲AV无码AV吞精久久| 成年美女黄网站18禁免费| 久久精品国产亚洲AV电影网| 久久久久噜噜噜亚洲熟女综合 | 久久99久久成人免费播放| 久久久久亚洲精品美女| 永久免费AV无码网站在线观看| 一级免费黄色毛片| 亚洲伊人久久大香线蕉影院| 又黄又爽一线毛片免费观看 | 瑟瑟网站免费网站入口| 91情国产l精品国产亚洲区| 拨牐拨牐x8免费| 精品国产污污免费网站| 亚洲AV综合永久无码精品天堂 | 亚洲一区二区三区91 | 色www免费视频| 亚洲特级aaaaaa毛片| 亚洲无线一二三四区手机| 无码国产精品久久一区免费| 久久成人18免费网站 | 国产妇乱子伦视频免费| 中文字幕不卡免费高清视频| 亚洲国产精品成人午夜在线观看| 国产亚洲婷婷香蕉久久精品| 四虎影院永久免费观看| 成人在线免费看片| 国内精品免费在线观看| 四虎影视久久久免费| 亚洲久热无码av中文字幕| 亚洲视频一区在线播放| 亚洲自偷自偷图片| 亚洲 自拍 另类小说综合图区| 无码日韩精品一区二区免费| 色猫咪免费人成网站在线观看| A国产一区二区免费入口| 亚洲第一成年网站视频| 精品亚洲成在人线AV无码| 亚洲酒色1314狠狠做| 久久亚洲国产精品|