国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Struts2運(yùn)行流程

2019-11-14 15:02:24
字體:
供稿:網(wǎng)友

   這篇文章大部分是轉(zhuǎn)載的,雖然不知道作者是誰,但是還是非常膜拜的,描述的非常清晰,我覺得要是自己去陳訴也沒有這么好,中間我修改了最新的核心控制器名稱,主要是struts2的核心控制器現(xiàn)在并不是FilterDispatcher對(duì)象,而是StrutsPRepareAndExcuteFilter對(duì)象;中間有許多圖片還是FilterDisptcher,我這邊偷下懶,大家知道就行

第一步 :我們先來看下struts2官方提供的運(yùn)行流程圖

 

這張圖上分了好多塊,彼此之間相互聯(lián)系,先瀏覽一下各塊的名字,再留心一下運(yùn)行圖最下面的圖例,分為四種顏色。

  • 橙色是Servlet Filters,過濾器鏈,所有的請(qǐng)求都要經(jīng)過Filter鏈的處理。
  • 淺藍(lán)色是Struts Core,Struts2的核心部分,Struts2中已經(jīng)做好的功能,在實(shí)際開發(fā)中不需要?jiǎng)铀鼈儭?/li>
  • 淺綠色是Interceptors,Struts2的攔截器。Struts2提供了很多默認(rèn)的攔截器,可以完成日常開發(fā)的絕大部分工作;當(dāng)然,也可以自定義攔截器,用來實(shí)現(xiàn)具體業(yè)務(wù)需要的功能。
  • 淺黃色是User Created,由開發(fā)人員創(chuàng)建的,包括struts.xml、Action、Template,這些其實(shí)就是在前面HelloWorld應(yīng)用里面折騰的那些東西,是每個(gè)使用Struts2來進(jìn)行開發(fā)的人員都必須會(huì)的。

 

第二部分我們粗略的陳訴下各個(gè)模塊作用

                  

  • StrutsPrepareAndExcuteFilter是整個(gè)Struts2的調(diào)度中心,根據(jù)ActionMapper的結(jié)果來決定是否處理請(qǐng)求,如果ActionMapper指出該URL應(yīng)該被Struts2處理,那么它將會(huì)執(zhí)行Action處理,并停止過濾器鏈上還沒有執(zhí)行的過濾器。
  • ActionMapper提供了HTTP請(qǐng)求與action執(zhí)行之間的映射,簡單點(diǎn)說,ActionMapper會(huì)判斷這個(gè)請(qǐng)求是否應(yīng)該被 Struts2處理,如果需要Struts2處理,ActionMapper會(huì)返回一個(gè)對(duì)象來描述請(qǐng)求對(duì)應(yīng)的ActionInvocation的信息。
  • ActionProxy是一個(gè)特別的中間層,位于Action和xwork之間,使得我們?cè)趯碛袡C(jī)會(huì)引入更多的實(shí)現(xiàn)方式,比如通過WebService來實(shí)現(xiàn)等。
  • ConfigurationManager是xwork配置的管理中心,通俗的講,可以把它看做struts.xml這個(gè)配置文件在內(nèi)存中的對(duì)應(yīng)。
  • struts.xml是Stuts2的應(yīng)用配置文件,負(fù)責(zé)諸如URL與Action之間映射的配置、以及執(zhí)行后頁面跳轉(zhuǎn)的Result配置等。
  • ActionInvocation:真正調(diào)用并執(zhí)行Action,它擁有一個(gè)Action實(shí)例和這個(gè)Action所依賴的攔截器實(shí)例。ActionInvocation會(huì)執(zhí)行這些攔截器、Action以及相應(yīng)的Result。
  • Interceptor(攔截器):攔截器是一些無狀態(tài)的類,攔截器可以自動(dòng)攔截Action,它們給開發(fā)者提供了在Action運(yùn)行之前或Result運(yùn)行之后來執(zhí)行一些功能代碼的機(jī)會(huì)。類似于我們熟悉的javax.servlet.Filter。
  • Action:動(dòng)作類是Struts2中的動(dòng)作執(zhí)行單元。用來處理用戶請(qǐng)求,并封裝業(yè)務(wù)所需要的數(shù)據(jù)。
  • Result:Result就是不同視圖類型的抽象封裝模型,不同的視圖類型會(huì)對(duì)應(yīng)不同的Result實(shí)現(xiàn),Struts2中支持多種視圖類型,比如jsp,F(xiàn)reeMarker等。
  • Templates:各種視圖類型的頁面模板,比如JSP就是一種模板頁面技術(shù)。
  • Tag Subsystem:Struts2的標(biāo)簽庫,它抽象了三種不同的視圖技術(shù)JSP、velocity、freemarker,可以在不同的視圖技術(shù)中,幾乎沒有差別的使用這些標(biāo)簽。

 

第三部分接下來我們來真正陳訴下運(yùn)行流程

             前提:我們正在模擬用戶登入,進(jìn)入index.jsp頁面,該頁面有兩個(gè)輸入框,分別是賬號(hào)與密碼,還有提交按鈕,當(dāng)輸入的信息后然后提交到后臺(tái)處理,插入web.xml文件中的過濾器配置

 

Java代碼  收藏代碼
  1. <!-- 配置Struts2控制器 -->  
  2. <filter>  
  3.     <filter-name>struts2</filter-name>  
  4.     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  5. </filter>  
  6.   
  7. <filter-mapping>  
  8.     <filter-name>struts2</filter-name>  
  9.     <url-pattern>*.action</url-pattern>  
  10. </filter-mapping>  

 

 

             過程:

 

1首先是在登錄頁面,用戶填入帳號(hào)和密碼,然后點(diǎn)擊提交按鈕,好了,就從這里開始分析背后的處理流程,這是我們進(jìn)行分析的起點(diǎn)。

2當(dāng)用戶提交登錄請(qǐng)求后,請(qǐng)求的URL為:“/helloworld /helloworldAction.action”,請(qǐng)求會(huì)被Tomcat服務(wù)器接收到,Tomcat服務(wù)器會(huì)根據(jù)請(qǐng)求URL中的web上下文,也就是 “/helloworld”,來選擇處理這個(gè)請(qǐng)求的Web應(yīng)用,那就是由helloworld這個(gè)web工程來處理這個(gè)請(qǐng)求。

3Web容器會(huì)去讀取helloworld這個(gè)工程的web.xml,在web.xml中進(jìn)行匹配,發(fā)現(xiàn)后綴為“.action”的請(qǐng)求,由struts2這個(gè)過濾器來進(jìn)行處理,根據(jù)Filter的配置,找到實(shí)際的類為FilterDispatcher。

4Web容器會(huì)獲取FilterDispatcher這個(gè)類的實(shí)例,然后回調(diào)doFilter方法,進(jìn)行真正的處理。StrutsPrepareAndExcuteFilter作為前端控制器,是整個(gè)Struts2的調(diào)度中心。

注意:在架構(gòu)圖上,可以看到有三個(gè)過濾器層次,分別是ActionContextCleanUp、 SiteMesh等其他過濾器和FilterDispatcher。這三個(gè)層次中,ActionContextCleanUp和 FilterDispatcher是Struts2的過濾器,而SiteMeshSiteMesh等其他過濾器不是。

StrutsPrepareAndExcuteFilter是任何一個(gè)Struts2應(yīng)用都需要配置的,一般出現(xiàn)在過濾器鏈的最后;如果在StrutsPrepareAndExcuteFilter前出現(xiàn)了如SiteMesh這種特殊的過濾器,還必須在SiteMesh前引用Struts2的ActionContextCleanUp過濾器。

在前面的helloworld中,并沒有出現(xiàn)SiteMesh這種特殊的過濾器,所以只需要引用StrutsPrepareAndExcuteFilter就可以了。

這就相當(dāng)于前進(jìn)到Struts2架構(gòu)圖上的第一步,如下所示:



 

 

5StrutsPrepareAndExcuteFilter將請(qǐng)求轉(zhuǎn)發(fā)給ActionMapper。ActionMapper負(fù)責(zé)識(shí)別當(dāng)前的請(qǐng)求是否需要Struts2做出處理。這就相當(dāng)于前進(jìn)到Struts2架構(gòu)圖上的第二步,如下所示:



 

6ActionMapper告訴StrutsPrepareAndExcuteFilter,需要處理這個(gè)請(qǐng)求,StrutsPrepareAndExcuteFilter會(huì)停止過濾器鏈以后的部分,所以通常情況下:StrutsPrepareAndExcuteFilter應(yīng)該出現(xiàn)在過濾器鏈的最后。然后建立一個(gè)ActionProxy對(duì)象,這個(gè)對(duì)象作為Action與xwork之間的中間層,會(huì)代理Action的運(yùn)行過程。

這就相當(dāng)于前進(jìn)到Struts2架構(gòu)圖上的第三步,如下所示:

                   

 

7ActionProxy對(duì)象剛被創(chuàng)建出來的時(shí)候,并不知道要運(yùn)行哪個(gè)Action,它手里只有從StrutsPrepareAndExcuteFilter中拿到的請(qǐng)求的URL。這時(shí)候,它去向ConfigurationManager詢問到底要運(yùn)行哪個(gè)Action。

回憶一下,某個(gè)特定的URL由哪個(gè)Action響應(yīng)由誰負(fù)責(zé),定義在什么地方呢?沒錯(cuò),在struts.xml里面。而 ConfigurationManager就是負(fù)責(zé)讀取并管理struts.xml的,可以簡單的理解為ConfigurationManager是 struts.xml在內(nèi)存中的映像。

在服務(wù)器啟動(dòng)的時(shí)候,ConfigurationManager會(huì)一次性的把struts.xml中的所有信息讀到內(nèi)存里,并緩存起來,以保證ActionProxy拿著來訪的URL向他詢問要運(yùn)行哪個(gè)Action的時(shí)候,就可以直接匹配、查找并回答了。

這就相當(dāng)于前進(jìn)到Struts2架構(gòu)圖上的第四步和第五步了,如下所示:



 

 

8:ActionProxy拿到了運(yùn)行哪個(gè)Action、相關(guān)的攔截器以及所有可能使用的result信息,就可以著手建立ActionInvocation對(duì)象了,ActionInvocation對(duì)象描述了Action運(yùn)行的整個(gè)過程。

注意:Action運(yùn)行絕不僅僅只是運(yùn)行Action的execute方法這么簡單,還包括其他部分,完整的調(diào)用過程由ActionInvocation對(duì)象負(fù)責(zé)。

這就相當(dāng)于前進(jìn)到Struts2架構(gòu)圖上的第六步,如下所示:



 

9回憶一下,HelloWorld中Action的execute方法運(yùn)行的時(shí)候,是不是它的屬性就已經(jīng)有了請(qǐng)求中的參數(shù)呢?這說明,在execute方法之前,有人偷偷的幫我們做了這件事,把請(qǐng)求中的參數(shù)賦值到了Action的屬性上,這個(gè)“有人”就是剛剛說的攔截器。

攔截器的運(yùn)行被分成兩部分,一部分在Action之前運(yùn)行,一部分在Result之后運(yùn)行,而且順序是剛好反過來的。也就是在Action執(zhí)行前的順序,比如是攔截器1、攔截器2、攔截器3,那么運(yùn)行Result之后,再次運(yùn)行攔截器的時(shí)候,順序就變成攔截器3、攔截器2、攔截器1了。

總之ActionInvocation對(duì)象執(zhí)行的時(shí)候比較復(fù)雜,會(huì)做很多事:

  • 首先按照攔截器的引用順序依次執(zhí)行各個(gè)攔截器的前置部分。

這就相當(dāng)于前進(jìn)到Struts2架構(gòu)圖上的第七步,如下所示:



 

  • 然后執(zhí)行Action的execute方法

這就相當(dāng)于前進(jìn)到Struts2架構(gòu)圖上的第八步,如下所示:



 然后根據(jù)execute方法返回的結(jié)果,也就是Result,在struts.xml中匹配選擇下一個(gè)頁面,這就相當(dāng)于前進(jìn)到Struts2架構(gòu)圖上的第九步,如下所示:



 

  • 找到頁面后,由于現(xiàn)在的頁面一般都是模板頁面,在頁面上,可以通過Struts2自帶的標(biāo)簽庫來訪問需要的數(shù)據(jù),并生成最終頁面

這就相當(dāng)于前進(jìn)到Struts2架構(gòu)圖上的第十步,如下所示:



 

  • 最后,ActionInvocation對(duì)象再按照攔截器的引用順序的倒序依次執(zhí)行各個(gè)攔截器的后置部分。

這就相當(dāng)于前進(jìn)到Struts2架構(gòu)圖上的第十一步,如下所示:



 

10ActionInvocation對(duì)象執(zhí)行完畢后,實(shí)際上就已經(jīng)得到響應(yīng)對(duì)象了,也就是HttpServletResponse對(duì)象,最后按與過濾器器配置定義相反的順序依次經(jīng)過過濾器,向用戶展示出響應(yīng)的結(jié)果。

這就相當(dāng)于前進(jìn)到Struts2架構(gòu)圖上的第十二步,得到最終完整的系統(tǒng)架構(gòu)圖了

 



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 开封市| 临洮县| 左贡县| 宜宾县| 健康| 崇州市| 上栗县| 合山市| 台中县| 五常市| 上虞市| 岗巴县| 山阳县| 辛集市| 通道| 屏南县| 舟山市| 张家口市| 玉田县| 攀枝花市| 临邑县| 延寿县| 封开县| 巴林右旗| 万全县| 大丰市| 武宁县| 丽水市| 将乐县| 社旗县| 伊宁市| 讷河市| 海兴县| 澄城县| 华宁县| 慈溪市| 新密市| 韩城市| 西吉县| 梨树县| 冕宁县|