java struct工作原理_Struts2的工作原理(图解)详解
Struts2的工作原理
上圖來源于Struts2官方站點(diǎn),是Struts 2 的整體結(jié)構(gòu)。
一個(gè)請求在Struts2框架中的處理大概分為以下幾個(gè)步驟(可查看源碼:https://github.com/apache/struts):
1 客戶端初始化一個(gè)指向Servlet容器(例如Tomcat)的請求
2 這個(gè)請求經(jīng)過一系列的過濾器(Filter)(這些過濾器中有一個(gè)叫做ActionContextCleanUp的可選過濾器,這個(gè)過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)
3 接著FilterDispatcher(現(xiàn)已過時(shí))被調(diào)用,FilterDispatcher詢問ActionMapper來決定這個(gè)請是否需要調(diào)用某個(gè)Action
4 如果ActionMapper決定需要調(diào)用某個(gè)Action,FilterDispatcher把請求的處理交給ActionProxy
5 ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調(diào)用的Action類
6 ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。
7 ActionInvocation實(shí)例使用命名模式來調(diào)用,在調(diào)用Action的過程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。
8 一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可 能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標(biāo)簽。在這個(gè)過程中需要涉及到ActionMapper
在上述過程中所有的對象(Action,Results,Interceptors,等)都是通過ObjectFactory來創(chuàng)建的。
Struts開源架構(gòu)很好的實(shí)現(xiàn)了MVC模式,MVC即Model-View-Controller的縮寫,是一種常用的設(shè)計(jì)模式。MVC 減弱了業(yè)務(wù)邏輯接口和數(shù)據(jù)接口之間的耦合,以及讓視圖層更富于變化。MVC的工作原理,如下圖1所示:
Struts 是MVC的一種實(shí)現(xiàn),它將 Servlet和 JSP 標(biāo)記(屬于 J2EE 規(guī)范)用作實(shí)現(xiàn)的一部分。Struts繼承了MVC的各項(xiàng)特性,并根據(jù)J2EE的特點(diǎn),做了相應(yīng)的變化與擴(kuò)展。下面是Struts實(shí)現(xiàn)MVC的原理。如下圖2所示:
控制:通過圖2大家可以看到有一個(gè)XML文件Struts-config.xml,與之相關(guān)聯(lián)的是Controller, ,它可以稱作為Struts神經(jīng)中樞。
視圖:主要由JSP生成頁面完成視圖,Struts提供豐富的JSP 標(biāo)簽庫: Html,Bean,Logic,Template等,這有利于分開在Struts中,承擔(dān)MVC中Controller角色的是一個(gè)Servlet,叫ActionServlet。ActionServlet是一個(gè)通用的控制組件。這個(gè)控制組件提供了處理所有發(fā)送到Struts的HTTP請求的入口點(diǎn)。它截取和分發(fā)這些請求到相應(yīng)的動(dòng)作類(這些動(dòng)作類都是Action類的子類)。另外控制組件也負(fù)責(zé)用相應(yīng)的請求參數(shù)填充 Action From(通常稱之為FromBean),并傳給動(dòng)作類(通常稱之為ActionBean)。動(dòng)作類實(shí)現(xiàn)核心商業(yè)邏輯,它可以訪問java bean 或調(diào)用EJB。最后動(dòng)作類把控制權(quán)傳給后續(xù)的JSP 文件,后者生成視圖。所有這些控制邏輯利用Struts-config.xml文件來配置。表現(xiàn)邏輯和程序邏輯。
模型:模型以一個(gè)或多個(gè)java bean的形式存在。這些bean分為三類:Action Form、Action、JavaBean or EJB。Action Form通常稱之為FormBean,封裝了來自于Client的用戶請求信息,如表單信息。Action通常稱之為ActionBean,獲取從ActionSevlet傳來的FormBean,取出FormBean中的相關(guān)信息,并做出相關(guān)的處理,一般是調(diào)用Java Bean或EJB等。
流程:在Struts中,用戶的請求一般以*.do作為請求服務(wù)名,所有的*.do請求均被指向ActionSevlet,ActionSevlet根據(jù)Struts-config.xml中的配置信息,將用戶請求封裝成一個(gè)指定名稱的FormBean,并將此FormBean傳至指定名稱的ActionBean,由ActionBean完成相應(yīng)的業(yè)務(wù)操作,如文件操作,數(shù)據(jù)庫操作等。每一個(gè)*.do均有對應(yīng)的FormBean名稱和ActionBean名稱,這些在Struts-config.xml中配置。
Struts2和struts1的比較
struts2相對于struts1來說簡單了很多,并且功能強(qiáng)大了很多,我們可以從幾個(gè)方面來看:
從體系結(jié)構(gòu)來看:struts2大量使用攔截器來處理請求,從而允許與業(yè)務(wù)邏輯控制器?與?servlet-api分離,避免了侵入性(所謂侵入性就是指的這個(gè)架構(gòu)設(shè)計(jì)出來的部件對系統(tǒng)的影響范圍,比如框架的侵入性就很高,因?yàn)樵谝粋€(gè)工程中引入一個(gè)框架,你的整個(gè)設(shè)計(jì)都必須圍繞這個(gè)框架來進(jìn)行,一旦使用了,框架的可替代性幾乎為0,這樣子就是高侵入性。組件的侵入性就比較低);而struts1.x在action中明顯的侵入了servlet-api.
從線程安全分析:struts2.x是線程安全的,每一個(gè)對象產(chǎn)生一個(gè)實(shí)例,避免了線程安全問題;而struts1.x在action中屬于單線程。
性能方面:struts2.x測試可以脫離web容器,而struts1.x依賴servlet-api,測試需要依賴web容器。
請求參數(shù)封裝對比:struts2.x使用ModelDriven模式,這樣我們?直接?封裝model對象,無需要繼承任何struts2的基類,避免了侵入性。
標(biāo)簽的優(yōu)勢:標(biāo)簽庫幾乎可以完全替代JSTL的標(biāo)簽庫,并且?struts2.x支持強(qiáng)大的ognl表達(dá)式。
當(dāng)然,struts2和struts1相比,在文件上傳,數(shù)據(jù)校驗(yàn)?等方面也?方便了好多。
原文:http://www.cnblogs.com/langtianya/archive/2013/04/09/3011090.html
總結(jié)
以上是生活随笔為你收集整理的java struct工作原理_Struts2的工作原理(图解)详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android底部弹出显示不全,Andr
- 下一篇: 服务器采购框架合同协议书范本,手写一个满