官术网_书友最值得收藏!

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ě)視圖等工作。

主站蜘蛛池模板: 五华县| 林西县| 大方县| 白水县| 丽水市| 平舆县| 夹江县| 疏勒县| 阿瓦提县| 乌拉特后旗| 临江市| 墨江| 禹城市| 崇仁县| 武陟县| 钟祥市| 宁远县| 渑池县| 株洲县| 浙江省| 通化市| 乌鲁木齐市| 商南县| 利辛县| 洛浦县| 资兴市| 大竹县| 都安| 大埔县| 屏东市| 福泉市| 岱山县| 宁强县| 宝丰县| 北海市| 温泉县| 玉田县| 连江县| 伊宁县| 和田县| 靖远县|