1. 在 struts1.x 系列中 , 所有的請(qǐng)求是通過(guò)一個(gè) servlet(ActionServlet) 來(lái)管理控制的 , 在 Struts2.X 而是經(jīng)過(guò)一個(gè) Filter 來(lái)處理請(qǐng)求的。 Struts 2 將核心控制器設(shè)計(jì)成 Filter ,而不是一個(gè)普通 Servlet 。 因?yàn)樵O(shè)計(jì)者為了實(shí)現(xiàn)AOP(面向方面 編程)概念. struts1.x 中 <servlet> Struts2.X 中 <filter> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
2. Struts 2框架由3個(gè)部分組成:核心控制器FilterDispatcher、業(yè)務(wù)控制器和用戶實(shí)現(xiàn)的業(yè)務(wù)邏輯組件。在這3個(gè)部分里,Struts 2框架提供了核心控制器FilterDispatcher,而用戶需要實(shí)現(xiàn)業(yè)務(wù)控制器和業(yè)務(wù)邏輯組件。 核心控制器:FilterDispatcher Struts 2框架獲得了*.action請(qǐng)求后,將根據(jù)*.action請(qǐng)求的前面部分決定調(diào)用哪個(gè)業(yè)務(wù)邏輯組件,例如,對(duì)于login.action請(qǐng)求,Struts 2調(diào)用名為login的Action來(lái)處理該請(qǐng)求。
Struts 2應(yīng)用中的Action都被定義在struts.xml文件中,在該文件中定義Action時(shí),定義了該Action的name屬性和 class屬性,其中name屬性決定了該Action處理哪個(gè)用戶請(qǐng)求,而class屬性決定了該Action的實(shí)現(xiàn)類。 Struts 2用于處理用戶請(qǐng)求的Act ion實(shí)例,并不是用戶實(shí)現(xiàn)的業(yè)務(wù)控制器,而是Act ion代理 ——因?yàn)橛脩魧?shí)現(xiàn)的業(yè)務(wù)控制器并沒(méi)有與Servlet API耦合,顯然無(wú)法處理用戶請(qǐng)求。而Struts 2框架提供了系列攔截器,該系列攔截器負(fù)責(zé)將 HttpServletRequest請(qǐng)求中的請(qǐng)求參數(shù)解析出來(lái),傳入到Action中,并回調(diào)Action的execute方法來(lái)處理用戶請(qǐng)求。 顯然,上面的處理過(guò)程是典型的AOP(面向切面編程)處理方式。圖3.19顯示了這種處理模型。 ![]() Struts 2的攔截器和Action從圖
3.19中可以看出,用戶實(shí)現(xiàn)的Action類僅僅是Struts 2的Action代理的代理目標(biāo)。用戶實(shí)現(xiàn)的業(yè)務(wù)控制器(Action)則包含了對(duì)用
戶請(qǐng)求的處理。用戶的請(qǐng)求數(shù)據(jù)包含在HttpServletRequest對(duì)象里,而用戶的Action類無(wú)需訪問(wèn)HttpServletRequest
對(duì)象。攔截器負(fù)責(zé)將HttpServletRequest里的請(qǐng)求數(shù)據(jù)解析出來(lái),并傳給業(yè)務(wù)邏輯組件Action實(shí)例。
|
|