- Java EE框架開(kāi)發(fā)技術(shù)與案例教程
- 張繼軍 董衛(wèi)
- 1303字
- 2020-05-28 14:20:31
3.1 Struts 2簡(jiǎn)介
Struts 2是基于MVC模式的Web框架,主要包括控制器組件(包括核心控制器StrutsPrepareAndExecuteFilter、業(yè)務(wù)控制器Action)、模型組件(包括業(yè)務(wù)邏輯組件和數(shù)據(jù)庫(kù)訪問(wèn)組件)和視圖組件。它們之間的關(guān)系如圖3-1所示。

圖3-1 Struts 2框架的組成結(jié)構(gòu)圖
● 模型組件:是實(shí)現(xiàn)業(yè)務(wù)邏輯的模塊,由JavaBean或EJB構(gòu)成。
● 視圖組件:主要有HTML、JSP和Struts 2標(biāo)簽等視圖技術(shù)。
● 控制器組件:控制器組件主要由核心控制器和業(yè)務(wù)控制器Action組成。
核心控制器:過(guò)濾器類(lèi)StrutsPrepareAndExecuteFilter稱(chēng)為Struts 2的核心控制器。
業(yè)務(wù)控制器:業(yè)務(wù)控制器稱(chēng)為Action,負(fù)責(zé)處理業(yè)務(wù)特定請(qǐng)求的類(lèi)。
1.Struts 2架構(gòu)的結(jié)構(gòu)
Struts 2框架是由多個(gè)不同功能的組件構(gòu)成的,其架構(gòu)結(jié)構(gòu)及內(nèi)部各模塊功能、它們之間的關(guān)系,以及它們的運(yùn)行流程如圖3-2所示。

圖3-2 Struts 2框架結(jié)構(gòu)與工作流程圖
1)StrutsPrepareAndExecuteFilter是整個(gè)Struts 2的核心控制器,根據(jù)ActionMapper的結(jié)果來(lái)決定是否處理請(qǐng)求,如果ActionMapper指出該URL應(yīng)該被Struts 2處理,就執(zhí)行Action處理,并停止過(guò)濾器鏈上還沒(méi)有執(zhí)行的過(guò)濾器。
2)ActionMapper提供了HTTP請(qǐng)求與Action執(zhí)行之間的映射,即ActionMapper判斷請(qǐng)求是否應(yīng)該被Struts 2處理。若需要Struts 2處理,ActionMapper返回一個(gè)對(duì)象來(lái)描述請(qǐng)求對(duì)應(yīng)的ActionInvocation的信息。
3)ActionProxy是一個(gè)特別的中間層,位于Action和xwork之間,可以根據(jù)需求引入更多的實(shí)現(xiàn)方式,比如通過(guò)WebService來(lái)實(shí)現(xiàn)等。
4)ConfigurationManager是xwork配置的管理中心,可以理解為struts.xml配置文件在內(nèi)存中的對(duì)應(yīng)。
5)struts.xml是Stuts 2的應(yīng)用配置文件,負(fù)責(zé)URL與Action之間映射的配置,以及執(zhí)行后頁(yè)面跳轉(zhuǎn)的Result配置等。
6)ActionInvocation:調(diào)用并執(zhí)行Action,它擁有一個(gè)Action實(shí)例和這個(gè)Action所依賴的攔截器實(shí)例。ActionInvocation執(zhí)行攔截器鏈、Action及相應(yīng)的Result。
7)Interceptor(攔截器):自動(dòng)攔截Action,提供了在Action運(yùn)行之前或Result運(yùn)行之后可能需要執(zhí)行的某些功能代碼。類(lèi)似于javax.servlet.Filter(過(guò)濾器)。
8)Action:是Struts 2中的動(dòng)作執(zhí)行單元(執(zhí)行類(lèi)),用來(lái)處理用戶請(qǐng)求,并封裝業(yè)務(wù)所需要的數(shù)據(jù)。
9)Result:是不同視圖類(lèi)型的抽象封裝模型,不同的視圖類(lèi)型會(huì)對(duì)應(yīng)不同的Result實(shí)現(xiàn),Struts 2中支持多種視圖類(lèi)型,比如JSP、FreeMarker等。
10)Templates:各種視圖類(lèi)型的頁(yè)面模板,比如JSP就是一種模板頁(yè)面技術(shù)。
11)TagSubsystem:Struts 2的標(biāo)簽庫(kù),它抽象了3種不同的視圖技術(shù):JSP、velocity和freemarker,可以在不同的視圖技術(shù)中直接使用這些標(biāo)簽。
2.Struts 2的工作流程
Struts 2框架的核心控制器負(fù)責(zé)攔截由<url-pattern>/*</url-pattern>指定的所有用戶請(qǐng)求,當(dāng)用戶請(qǐng)求到達(dá)時(shí),該Filter會(huì)過(guò)濾用戶的請(qǐng)求。當(dāng)請(qǐng)求轉(zhuǎn)入Struts 2框架處理時(shí)會(huì)先經(jīng)過(guò)一系列的攔截器,然后再到Action。Struts 2對(duì)用戶的每一次請(qǐng)求都會(huì)創(chuàng)建一個(gè)Action并運(yùn)行,根據(jù)其運(yùn)行返回的值,按Result配置信息,跳轉(zhuǎn)到新的服務(wù)(進(jìn)入視圖或Action)。根據(jù)圖3-2所給出的各組件之間的關(guān)系,其工作流程如下。
1)客戶發(fā)送請(qǐng)求給StrutsPrepareAndExecuteFilter。
2)StrutsPrepareAndExecuteFilter詢問(wèn)ActionMapper,該請(qǐng)求是否是一個(gè)Struts 2請(qǐng)求(即是否返回一個(gè)非空的ActionMapping對(duì)象)。
3)若ActionMapper認(rèn)為該請(qǐng)求是一個(gè)Struts 2請(qǐng)求,則StrutsPrepareAndExecuteFilter把請(qǐng)求交給ActionProxy處理。
4)ActionProxy通過(guò)Configuration Manager詢問(wèn)框架的配置文件,確定需要調(diào)用的Action類(lèi)及Action方法。
5)ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例,并進(jìn)行初始化。
6)ActionInvocation實(shí)例在調(diào)用Action的過(guò)程前后,涉及相關(guān)攔截器(Interceptor)的調(diào)用。
7)Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。調(diào)用結(jié)果的execute方法(或配置指定的方法),渲染結(jié)果。
8)執(zhí)行各個(gè)攔截器invocation.invoke()之后的代碼。
9)把結(jié)果發(fā)送到客戶端。
通過(guò)對(duì)Struts 2框架及其工作流程的分析,基于Struts 2框架開(kāi)發(fā)Web應(yīng)用程序,開(kāi)發(fā)者主要的任務(wù)就是設(shè)計(jì)Action、在配置文件內(nèi)配置Action信息,以及編寫(xiě)視圖等工作。
- Node.js+Webpack開(kāi)發(fā)實(shí)戰(zhàn)
- Leap Motion Development Essentials
- 趣學(xué)Python算法100例
- The HTML and CSS Workshop
- Android傳感器開(kāi)發(fā)與智能設(shè)備案例實(shí)戰(zhàn)
- Hadoop 2.X HDFS源碼剖析
- uni-app跨平臺(tái)開(kāi)發(fā)與應(yīng)用從入門(mén)到實(shí)踐
- 小程序從0到1:微信全棧工程師一本通
- Python大規(guī)模機(jī)器學(xué)習(xí)
- .NET 4.0面向?qū)ο缶幊搪劊簯?yīng)用篇
- 深入大型數(shù)據(jù)集:并行與分布化Python代碼
- Hands-On ROS for Robotics Programming
- Leaflet.js Essentials
- Mastering Machine Learning with scikit-learn
- Python深度學(xué)習(xí)入門(mén):從零構(gòu)建CNN和RNN