偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Struts framework的工作原理和組件

開發(fā) 后端
本文介紹的是Struts framework的工作原理和組件,介紹的組件有ActionServlet,Action Classes,Action Mapping(此處包括ActionForward),ActionFrom Bean。希望對你有幫助,一起來看。

Struts是基于 MVC 模式的 Web 應(yīng)用最經(jīng)典框架。對于Struts 如何控制、處理客戶請求,讓我們通過對struts的四個核心組件介紹來具體說明。這幾個組件就是:ActionServlet,Action Classes,Action Mapping(此處包括ActionForward),ActionFrom Bean。

Struts ActionServlet控制器對象

ActionServlet繼承自javax.servlet.http.HttpServlet類,其在Struts framework中扮演的角色是中心控制器。它提供一個中心位置來處理全部的終端請求??刂破鰽ctionServlet主要負(fù)責(zé)將HTTP的客戶請求信息組裝后,根據(jù)配置文件的指定描述,轉(zhuǎn)發(fā)到適當(dāng)?shù)奶幚砥鳌?/p>

按照Servelt的標(biāo)準(zhǔn),所有得Servlet必須在web配置文件(web.xml)聲明。同樣,ActoinServlet必須在Web Application配置文件(web.xml)中描述,有關(guān)配置信息如下。

  1. <servlet>  
  2. <servlet-name>action</servlet-name>  
  3. <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>  
  4. </servlet> 

全部的請求URI以*.do的模式存在并映射到這個servlet,其配置如下:

  1. <servlet-mapping>  
  2. <servlet-name>action</servlet-name>  
  3. <url-pattern>*.do</url-pattern>  
  4. </servlet-mapping> 

一個該模式的請求URI符合如下格式:http://www.my_site_name.com/mycontext/actionName.do

中心控制器為所有的表示層請求提供了一個集中的訪問點。這個控制器提供的抽象概念減輕了開發(fā)者建立公共應(yīng)用系統(tǒng)服務(wù)的困難,如管理視圖、會話及表單數(shù)據(jù)。它也提供一個通用機(jī)制如錯誤及異常處理,導(dǎo)航,國際化,數(shù)據(jù)驗證,數(shù)據(jù)轉(zhuǎn)換等。

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

Struts Action Classes

ActionServlet把全部提交的請求都被控制器委托到RequestProcessor對象。RequestProcessor使用struts-config.xml文件檢查請求URI找到動作Action標(biāo)示符。

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

  1. public ActionForward execute(ActionMapping mapping,  
  2. ActionForm form,  
  3. javax.servlet.ServletRequest request,  
  4. javax.servlet.ServletResponse response)  
  5. throws java.io.IOException,javax.servlet.ServletException 

Action最為常用的是execute()方法。(注意,以前的perform方法在struts1.1中已經(jīng)不再支持),還有一個execute()方法,請參考apidoc,在此不在說明。

當(dāng)Controller收到客戶的請求的時候,在將請求轉(zhuǎn)移到一個Action實例時,如果這個實例不存在,控制器會首先創(chuàng)建,然后會調(diào)用這個Action實例的execute()方法。Struts Framework為應(yīng)用系統(tǒng)中的每一個Action類只創(chuàng)建一個實例。因為所有的用戶都使用這一個實例,所以你必須確定你的Action 類運行在一個多線程的環(huán)境中。下圖顯示了一個execute()方法如何被訪問:

Action實例的execute()方法

注意,客戶自己繼承的Action子類,必須重寫execute()方法,因為Action類在默認(rèn)情況下是返回null的。

Struts Action Mapping

上面講到了一個客戶請求是如何被控制器轉(zhuǎn)發(fā)和處理的,但是,控制器如何知道什么樣的信息轉(zhuǎn)發(fā)到什么樣的Action類呢?這就需要一些與動作和請求信息相對應(yīng)的映射配置說明。在struts 中,這些配置映射信息是存儲在特定的XML文件(比如struts-config.xml)。

這些配置信息在系統(tǒng)啟動的時候被讀入內(nèi)存,供struts framework在運行期間使用。在內(nèi)存中,每一個<action>元素都與org.apache.struts.action.ActionMapping類的一個實例對應(yīng)。下表就顯示了一個登陸的配置映射。

  1. <action-mappings>  
  2. <action path="/logonAction" 
  3. type="com.test.LogonAction" 
  4. name="LogonForm" 
  5. scope="request" 
  6. input="logoncheck.jsp" 
  7. validate="false">  
  8. <forward name="welcome" path="/welcome.jsp"/>  
  9. <forward name="failure" path="/logon_failure.jsp "/>  
  10. </action>  
  11. </action-mappings>  
  12. <form-beans>  
  13. <form-bean name="LoginForm" 
  14. type="com.test.LoginForm"/>  
  15. </form-beans> 

上面的配置表示:當(dāng)可以通過/logonAction.do(此處假設(shè)配置的控制器映射為*.do)提交請求信息的時候,控制器將信息委托com.test.LogonAction處理。調(diào)用LogonAction實例的execute()方法。同時將Mapping實例和所對應(yīng)的LogonForm Bean信息傳入。其中name=LogonForm,使用的form-bean元素所聲明的ActionForm Bean。有關(guān)form-bean的申明如下顯示。

使用ActionForward導(dǎo)航

元素<forward>則表示了當(dāng)Action實例的execute()方法運行完畢或,控制器根據(jù)Mapping可將響應(yīng)信息轉(zhuǎn)到適當(dāng)?shù)牡胤?。如上面現(xiàn)實,如果客戶登陸成功,則調(diào)用welcome forward,將成功信息返回到/welcome.jsp頁面。在你的execute()方法的結(jié)尾可以使用下面的實例代碼而返回welcome forward。當(dāng)然你的welcome forward必須在action元素屬性中定義,正如上面所聲明的那樣。

  1. return (mapping.findForward("welcome")); 

ActionForward對象是配置對象。這些配置對象擁有獨一無二的標(biāo)識以允許它們按照有意義的名稱如“success”,“failure”等來檢索。ActionForward對象封裝了向前進(jìn)的URL路徑且被請求處理器用于識別目標(biāo)視圖。ActionForward對象建立自<forward>元素位于struts-config.xml。下面是一個Struts中<forward>元素例子,屬于<action>元素范圍。

  1. <action path="/editCustomerProfile" 
  2. type="packageName.EditCustomerProfileAction" 
  3. name="customerProfileForm" scope="request">  
  4. <forward name="success" path="/MainMenu.jsp"/>  
  5. <forward name="failure" path="/CustomerService.jsp"/>  
  6. </action> 

基于執(zhí)行請求處理器的execute(…)方法的結(jié)果,當(dāng)傳遞一個值匹配指定于<forward>元素中name屬性的值的時候,下一個視圖可以在execute(…)方法中被開發(fā)者用方便的方法org.apache.struts.action.ActionMapping.findForward(…)選擇。ActionMapping.findForward(…)方法既從它的本地范圍又從全局范圍提供一個ActionForward對象,該對象返回至RequestProcessor以RequestDispatcher.forward(…)或response.sendRedirect(…)調(diào)用下一個視圖。

當(dāng)<forward>元素有redirect=“false”屬性或redirect屬性不存在的時候,RequestDispatcher.forward(…)被執(zhí)行;當(dāng)redirect=“true”是,將調(diào)用sendRedirect(…)方法。下例舉例說明了redirect屬性的用法:

  1. <forward name="success" path="/Catalog.jsp" redirect="true"/> 

如果redirect=true, URL建立如/contextPath/path因為HttpServletResponse.sendRedirect(…)中解釋URL采用”/”開頭相對于servlet容器根目錄。

如果redirect=false, URI建立如/path因為ServletContext.getRequestDisptacher(…)采用虛擬目錄相關(guān)URL。

在此稍稍說一下有關(guān)global-forwards的概念。其在配置文件中描述了整個應(yīng)用系統(tǒng)可以使用的ActionForward,而不是僅僅是一個特定的Action。

  1. <global-forwards>  
  2. <forward name="logout" path="/logout.do"/>  
  3. <forward name="error" path="/error.jsp"/>  
  4. </global-forwards> 

Struts ActionForm Bean捕獲表單數(shù)據(jù)

在上面講解ActionServlet,Action Classes和Action Mapping的時候,我們都提到了ActionForm Bean的概念。一個應(yīng)用系統(tǒng)的消息轉(zhuǎn)移(或者說狀態(tài)轉(zhuǎn)移)的非持久性數(shù)據(jù)存儲,是由ActionForm Bean的負(fù)責(zé)保持的。

ActionForm派生的對象用于保存請求對象的參數(shù),因此它們和用戶緊密聯(lián)系。

一個ActionForm類被RequestProcessor建立。這是發(fā)生在已完成向前進(jìn)到一個URL,該URL為映射到控制器servlet而不是JSP和相應(yīng)的動作映射指定的表單屬性的。在這個情況下,如果沒有在指定的活動范圍內(nèi)找到,RequestProcessor將嘗試尋找可能導(dǎo)致創(chuàng)建一個新ActionForm對象的表單bean。該ActionForm對象在指定的活動范圍內(nèi)被用<action>元素的name屬性找到;

RequestProcessor將隨后重新安排表單屬性,用請求時參數(shù)填充表單,隨即調(diào)用表單對象的validate(…)方法以履行服務(wù)器端用戶輸入驗證。僅當(dāng)ActionMapping對象中validate屬性被設(shè)為true時,validate(…)方法被調(diào)用;這就是默認(rèn)的行為。

request.getParameterValues(parameterName)被用于得到一個String[]對象,它用來表單填充;驗證的結(jié)果應(yīng)該是一個ActionErrors對象,用org.apache.struts.taglib.html.ErrorsTag來顯示驗證錯誤給用戶。ActionForm也可以被用于為當(dāng)前用戶保存即將被一個視圖引用的中間模型狀態(tài)。

當(dāng)一個表單對象被RequestProcessor找到,它被傳遞到請求處理器的execute(…)方法。一個ActionForm對象也可以被請求處理器建立。表單對象建立目的是提供中間模型狀態(tài)給使用請求范圍JSP;這將確保對象不會在有效性過期后仍然存在。

默認(rèn)的,所有的表單都被保存為會話范圍。會話中表單對象脫離有效性的存在可能導(dǎo)致浪費內(nèi)存,同樣的,請求處理器必須跟蹤保存在會話中的表單對象的生命周期。一個好的捕獲表單數(shù)據(jù)的實踐是為橫跨多用戶交互的相關(guān)表單用一個單獨的表單bean。表單bean也可以在反饋的時候用來儲存能夠被自定義標(biāo)簽改變的中間模型狀態(tài)。

在視圖中標(biāo)簽用法避免結(jié)合Java代碼,因此要成一個好的任務(wù)劃分,web生產(chǎn)組主要處理標(biāo)志,而應(yīng)用開發(fā)組主要處理Java代碼。標(biāo)簽因素退出訪問中間模型狀態(tài)的邏輯;當(dāng)訪問嵌套的對象或當(dāng)通過聚集列舉時這個邏輯可能很復(fù)雜。

注意:在struts1.1中,ActionForm的校驗功能,逐漸被剝離出來(當(dāng)然依然可以使用)。使用了validator framework對整個應(yīng)用系統(tǒng)的表單數(shù)據(jù)驗證進(jìn)行統(tǒng)一管理。詳細(xì)信息請參考:http://home.earthlink.net/~dwinterfeldt

在ActionForm的使用中,Struts提倡使用到值對象(Value Object)。這樣將客戶或開發(fā)人員,對數(shù)據(jù)狀態(tài)與對象狀態(tài)能夠更加清晰的理解和使用。

對于每一個客戶請求,Struts framework在處理ActionForm的時候,一般需要經(jīng)歷如下幾個步驟:

(1)檢查Action的映射,確定Action中已經(jīng)配置了對ActionForm的映射

(2)根據(jù)name屬性,查找form bean的配置信息

(3)檢查Action的formbean的使用范圍,確定在此范圍下,是否已經(jīng)有此form bean的實例。

(4)假如當(dāng)前范圍下,已經(jīng)存在了此form bean的實例,而是對當(dāng)前請求來說,是同一種類型的話,那么就重用。

(5)否則,就重新構(gòu)建一個form bean的實例

(6)form bean的reset()方法備調(diào)用

(7)調(diào)用對應(yīng)的setter方法,對狀態(tài)屬性賦值

(8)如果validatede的屬性北設(shè)置為true,那么就調(diào)用form bean的validate()方法。

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

注意:直接從ActionFrom類繼承的reset()和validate()方法,并不能實現(xiàn)什么處理功能,所以有必要自己重新覆蓋。

Struts的其他組件

Struts framework本身提供了很多可擴(kuò)展的組件或sub framework,方便的開發(fā)人員在其構(gòu)架上構(gòu)建web層的應(yīng)用系統(tǒng)。比如upload,collections ,logging等等。讓我們來看看兩個比較重要的組件:validationg framework和struts taglib。有關(guān)其他組件請參考Struts用戶手冊(http://jakarta.apache.org/struts/userGuide)。

Validation Framework for Struts

在struts1.1中,新增了validation framework。增加了對form數(shù)據(jù)提交的驗證。將原本需要在ActionFrom Bean的validate()進(jìn)行的驗證通過配置文件的描述進(jìn)行驗證。

有關(guān)其詳細(xì)信息,請參考http://home.earthlink.net/~dwinterfeldt 。個人建議對于小型應(yīng)用系統(tǒng)可以采用這種配置方式,但是對于應(yīng)用系統(tǒng)中有大量web層表單應(yīng)用的系統(tǒng),并且業(yè)務(wù)需求變動比較大的,使用validation framework 可能會加重開發(fā)難度、系統(tǒng)維護(hù)難度??梢越梃bvalidation framework的Javascript Validator Tag。

Struts TagLib

struts提供了一組可擴(kuò)展的自定義標(biāo)簽庫(TagLib),可以簡化創(chuàng)建用戶界面的過程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags 這幾個Taglib。有關(guān)Struts Taglib的結(jié)構(gòu)和使用,可以參考前面有關(guān)Cutomer Tag Lib的介紹.

BeanUtils

這個組件的全稱是Bean Introspection Utilites。是屬于Jakarta Commons項目組的。主要是幫助構(gòu)建javabean的屬性操作的(getter,setter),已經(jīng)提供一種動態(tài)定義和訪問bean的屬性。有關(guān)詳細(xì)信息,請參考。
http://jakarta.apache.org/commons/beanutils.html

如果各位對這方面有很興趣,可以參考一些有關(guān)java反射(Reflectio)方面的資料。

Collections

這個組件主要是提供了一些集合或列表對象,在原有的java collections framework的基礎(chǔ)上進(jìn)行了擴(kuò)展。詳細(xì)資料請參考:
http://jakarta.apache.org/commons/collections.html 以及
http://cvs.apache.org/viewcvs/~checkout~/jakarta-commons/collections/STATUS.html?rev=1.13

Digester

這個組件翻譯成中文的意思是“匯編”。其主要功能是根據(jù)xml配置文件,初始化系統(tǒng)的一些java類對象。Digester幫助你指定XML與java對象之間映射模型,而且允許客戶話定制映射規(guī)則(rules)。詳細(xì)資料請參考
http://jakarta.apache.org/commons/digester.html

通過本文的介紹,希望對你有幫助。

【編輯推薦】

  1. JAVA開發(fā) 分析JNI標(biāo)準(zhǔn)原理
  2. 談JAVA靜態(tài)載入的兩種方式
  3. JAVA入門 基于Java的移動游戲開發(fā)
  4. JavaScript重構(gòu) 模塊劃分和命名空間
  5. C++和Java 的缺省初始化問題
責(zé)任編輯:于鐵 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2009-06-03 09:16:03

Hibernate工作原理使用

2009-06-04 10:41:52

Struts工作原理

2009-06-05 11:01:23

struts mvcMVC工作原理

2011-04-22 10:01:59

SimpleFrame

2009-06-04 15:58:55

Struts原理基本配置

2009-11-23 19:48:50

ibmdwJava

2009-06-05 10:26:05

struts工作流程

2009-07-09 14:01:22

JVM工作原理

2010-09-26 08:50:11

JVM工作原理

2010-09-16 14:42:44

JVM

2023-09-27 12:22:50

Kafka架構(gòu)

2015-07-02 09:56:48

ReactiveCociOS

2009-06-03 09:11:03

Hibernate工作原理體系結(jié)構(gòu)

2023-07-10 09:23:31

2023-05-26 10:37:17

ChatGPT人工智能

2010-07-23 16:10:32

SQL Server復(fù)

2020-10-30 09:00:00

JavaScriptJavaScript引前端

2025-06-06 08:04:17

2024-11-27 08:15:50

2023-01-10 16:08:04

人工智能擴(kuò)散模型
點贊
收藏

51CTO技術(shù)棧公眾號