日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

走進(jìn)Struts2(一)— Struts2的運(yùn)行流程及其工作原理

 昵稱27831725 2017-10-31

 Struts2是一套非常優(yōu)秀的Web應(yīng)用框架,實(shí)現(xiàn)優(yōu)雅、功能強(qiáng)大、使用簡(jiǎn)潔??梢哉f(shuō)是Struts2是一款非常成熟的MVC架構(gòu)。

在我們學(xué)習(xí)Struts2時(shí),最好是先學(xué)習(xí)它的運(yùn)行流程、核心概念,從中得到啟發(fā),提升自己,而不僅僅是學(xué)習(xí)怎么怎么使用它。

在網(wǎng)上看到這樣一句話:

你千萬(wàn)不要成為一個(gè)只會(huì)熟練使用框架的程序員,那樣,你會(huì)疲于奔命,你也許永遠(yuǎn)只會(huì)使用 Hadoop ,而寫(xiě)不出一個(gè) Hadoop ,你只是一個(gè) Hadoop程序員,而不是一個(gè)分布式工程師。
你也許永遠(yuǎn)只會(huì)使用 Struts,而忘記了自己寫(xiě) filter,你只是一個(gè) SSH 程序員,而不是一個(gè) Web 工程師。

話不多說(shuō),一起走進(jìn)Struts2

一、系統(tǒng)架構(gòu)

Struts2的官方文檔附帶了Struts2的架構(gòu)圖。從這張圖可以很好的去理解Struts2


關(guān)于圖中的Key:

  • Servlet Filters:過(guò)濾器鏈,客戶端的所有請(qǐng)求都要經(jīng)過(guò)Filter鏈的處理。
  • Struts Core:Struts2的核心部分,但是Struts2已經(jīng)幫我們做好了,我們不需要去做這個(gè)
  • Interceptors,Struts2的攔截器。Struts2提供了很多默認(rèn)的攔截器,可以完成日常開(kāi)發(fā)的絕大部分工作;而我們自定義的攔截器,用來(lái)實(shí)現(xiàn)實(shí)際的客戶業(yè)務(wù)需要的功能。
  • User Created,由開(kāi)發(fā)人員創(chuàng)建的,包括struts.xml、Action、Template,這些是每個(gè)使用Struts2來(lái)進(jìn)行開(kāi)發(fā)的人員都必須會(huì)的。


  • 1.FilterDispatcher是整個(gè)Struts2的調(diào)度中心,也就是MVC中的C(控制中心),根據(jù)ActionMapper的結(jié)果來(lái)決定是否處理請(qǐng)求,如果ActionMapper指出該URL應(yīng)該被Struts2處理,那么它將會(huì)執(zhí)行Action處理,并停止過(guò)濾器鏈上還沒(méi)有執(zhí)行的過(guò)濾器。
  • 2.ActionMapper 會(huì)判斷這個(gè)請(qǐng)求是否應(yīng)該被Struts2處理,如果需要Struts2處理,ActionMapper會(huì)返回一個(gè)對(duì)象來(lái)描述請(qǐng)求對(duì)應(yīng)的ActionInvocation的信息。
  • 3.ActionProxy,它會(huì)創(chuàng)建一個(gè)ActionInvocation實(shí)例,位于Action和xwork之間,使得我們?cè)趯?lái)有機(jī)會(huì)引入更多的實(shí)現(xiàn)方式,比如通過(guò)WebService來(lái)實(shí)現(xiàn)等。
  • 4.ConfigurationManager是xwork配置的管理中心,可以把它看做struts.xml這個(gè)配置文件在內(nèi)存中的對(duì)應(yīng)。
  • 5.struts.xml,是開(kāi)發(fā)人員必須光顧的地方。是Stuts2的應(yīng)用配置文件,負(fù)責(zé)諸如URL與Action之間映射關(guān)系的配置、以及執(zhí)行后頁(yè)面跳轉(zhuǎn)的Result配置等。
  • 6.ActionInvocation:真正調(diào)用并執(zhí)行Action,它擁有一個(gè)Action實(shí)例和這個(gè)Action所依賴的攔截器實(shí)例。ActionInvocation會(huì)按照指定的順序去執(zhí)行這些攔截器、Action以及相應(yīng)的Result。
  • Interceptor(攔截器):是Struts2的基石,類似于JavaWeb的Filter,攔截器是一些無(wú)狀態(tài)的類,攔截器可以自動(dòng)攔截Action,它們給開(kāi)發(fā)者提供了在Action運(yùn)行之前或Result運(yùn)行之后來(lái)執(zhí)行一些功能代碼的機(jī)會(huì)。
  • 7.Action:用來(lái)處理請(qǐng)求,封裝數(shù)據(jù)。

  • 二、運(yùn)行流程

1.當(dāng)用戶的發(fā)出請(qǐng)求,比如http:localhost:8080/Struts2/helloworld/helloworldAction.action,請(qǐng)求會(huì)被Tomcat接收到,Tomcat服務(wù)器來(lái)選擇處理這個(gè)請(qǐng)求的Web應(yīng)用,那就是由helloworld這個(gè)web工程來(lái)處理這個(gè)請(qǐng)求。
2.Web容器會(huì)去讀取helloworld這個(gè)工程的web.xml,在web.xml中進(jìn)行匹配,但發(fā)現(xiàn),由struts2這個(gè)過(guò)濾器來(lái)進(jìn)行處理(也就是
StrutsPrepareAndExecuteFilter),根據(jù)Filter的配置,找到FilterDispatcher(Struts2的調(diào)度中心
3.然后會(huì)獲取FilterDispatcher實(shí)例,然后回調(diào)doFilter方法,進(jìn)行真正的處理
PS:FilterDispatcher是任何一個(gè)Struts2應(yīng)用都需要配置的,通常情況下,web.xml文件中還有其他過(guò)濾器時(shí),F(xiàn)ilterDispatcher是放在濾器鏈的最后;如果在FilterDispatcher前出現(xiàn)了如SiteMesh這種特殊的過(guò)濾器,還必須在SiteMesh前引用Struts2的ActionContextCleanUp過(guò)濾器

對(duì)應(yīng)Struts2的架構(gòu)圖如下



4.這時(shí)FilterDispatcher會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給ActionMapperActionMapper負(fù)責(zé)識(shí)別當(dāng)前的請(qǐng)求是否需要Struts2做出處理。ActionMapper就類似于公司的保安,來(lái)識(shí)別是不是當(dāng)前客戶是不是我公司的人

對(duì)應(yīng)Struts2的架構(gòu)圖如下



5.如果需要Struts2處理,ActionMapper會(huì)通知FilterDispatcher,需要處理這個(gè)請(qǐng)求,F(xiàn)ilterDispatcher會(huì)停止過(guò)濾器鏈以后的部分,(這也就是為什么,F(xiàn)ilterDispatcher應(yīng)該出現(xiàn)在過(guò)濾器鏈的最后的原因)。然后建立一個(gè)ActionProxy實(shí)例,這個(gè)對(duì)象作為Action與xwork之間的中間層,會(huì)代理Action的運(yùn)行過(guò)程。

對(duì)應(yīng)Struts2的架構(gòu)圖如下



6.ActionProxy對(duì)象在被創(chuàng)建出來(lái)的時(shí)候,并不知道要運(yùn)行哪個(gè)Action,它手里只有從FilterDispatcher中拿到的請(qǐng)求的URL。
而真正知道要運(yùn)行哪個(gè)Action的是ConfigurationManager。因?yàn)橹挥兴拍茏x取我們的strtus.xml

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

對(duì)應(yīng)Struts2的架構(gòu)圖如下

  -> 

7.ActionProxy知道自己該干什么事之后(運(yùn)行哪個(gè)Action、相關(guān)的攔截器以及所有可能使用的result信息),然后馬上建立ActionInvocation對(duì)象了,ActionInvocation對(duì)象描述了Action運(yùn)行的整個(gè)過(guò)程。

注意:Action完整的調(diào)用過(guò)程都是由ActionInvocation對(duì)象負(fù)責(zé)


對(duì)應(yīng)Struts2的架構(gòu)圖如下




8.在execute方法之前,好像URL請(qǐng)求中的參數(shù)已經(jīng)賦值到了Action的屬性上,這就是我們的"雷鋒"—攔截器。

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

這就好比,你要去奶奶家,需要通過(guò) 水泊梁山->盤絲洞 -> 索馬里,到了奶奶家,看奶奶回來(lái)的時(shí)候,就必須要通過(guò) 索馬里 -> 盤絲洞 -> 水泊梁山。

所以ActionInvocation對(duì)象執(zhí)行的時(shí)候需要通過(guò)很多復(fù)雜的過(guò)程,按照指定攔截器的順序依次執(zhí)行。


對(duì)應(yīng)Struts2的架構(gòu)圖如下





9.到了奶奶家,然后執(zhí)行Action的execute方法





10.然后根據(jù)execute方法返回的結(jié)果(Result),去struts.xml中匹配選擇下一個(gè)頁(yè)面




11.根據(jù)結(jié)果(Result)找到頁(yè)面后,在頁(yè)面上(有很多Struts2提供的模板),可以通過(guò)Struts2自帶的標(biāo)簽庫(kù)來(lái)訪問(wèn)需要的數(shù)據(jù),并生成最終頁(yè)面

注意:這時(shí)還沒(méi)有給客戶端應(yīng)答,只是生成了頁(yè)面




12.最后,ActionInvocation對(duì)象倒序執(zhí)行攔截器,從奶奶家回來(lái)




13.ActionInvocation對(duì)象執(zhí)行完畢后,已經(jīng)得到響應(yīng)對(duì)象(HttpServletResponse)了,最后按與過(guò)濾器(Filter)配置定義相反的順序依次經(jīng)過(guò)過(guò)濾器,向客戶端展示出響應(yīng)的結(jié)果


得到完整Struts2架構(gòu)圖



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多