輕量級的MVC框架,主要解決了請求分發的問題,重心在控制層和表現層。低侵入性,與業務代碼的耦合度很低。Struts2實現了MVC(功能模塊和顯示模塊的分離),並提供了一系列 API,採用模式化方式簡化業務開發過程。web
注:MVC 由 Model(模型),View(視圖),Controller(控制器)組成。數組
① 模型對應 service 層,表示業務數據或業務邏輯。瀏覽器
② 視圖對應 如: JSP ,是用戶看到並與之交互的界面。session
③ 控制器 對應 controller ,根據用戶的輸入,控制用戶界面數據顯示和更新 model 對象。app
(圖片來源見水印)框架
(1)客戶端瀏覽器發送 HTTP 請求到 Web 應用 。
(2)這個請求通過一系列的過濾器(Filter)到達 StrutsPrepareAndExecuteFilter (核心控制器)(這些過濾器中有一個叫作 ActionContextCleanUp 的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMesh Plugin) 。
(3)StrutsPrepareAndExecuteFilter 調用 ActionMapper(Action映射器)肯定調用哪一個Action。
(4)若是有合適的 Action 再將控制權轉移給 ActionProxy 代理 。
(5)ActionProxy 經過 Configuration Manager 詢問框架的配置文件(開始加載配置文件),找到須要調用的 Action 類,建立一個ActionInvocation的實例。
(6)ActionInvocation 在調用攔截器鏈中的攔截器後再調用 Action。
(7)根據 Action 返回的結果字符串在 struts.xml 中的配置找到對應的 Result 。返回結果一般是(但不老是,也多是另外的一個 Action 鏈)一個須要被表示的JSP或者FreeMarker的模版。再以相反的順序執行攔截器鏈,返回HTTP響應 。
(8)HTTP響應以相反的順序返回給核心控制器 StrutsPrepareAndExecuteFilter 以及其餘 web.xml 中定義的過濾器,最終返回給客戶端。工具
FilterDispatch和StrutsPrepareAndExecuteFilter區別?spa
FilterDispatcher 是 struts 2.0.x到2.1.2版本的核心過濾器,
代理
StrutsPrepareAndExecuteFilter 是自 2.1.3 開始就替代了 FilterDispatcher 。xml
ActionMapper:經過 method 參數將請求轉發到具體的 action 。
ActionProxy代理:是 Action 的一個代理類,也就是說 Action 的調用是經過 ActionProxy 實現的,其實就是調用了 ActionProxy.execute()方法,而該方法又調用了 ActionInvocation.invoke()方法。歸根到底,最後調用的是 DefaultActionInvocation.invokeAction() 方法。
ActionInvocation:就是 Action 的調用者。ActionInvocation 在 Action 的執行過程當中,負責 Interceptor、Action和Result 等一系列元素的調度。
Interceptor攔截器:是 Struts2 的一個強有力的工具,有許多功能(feature)都是構建於它之上,如國際化、校驗等。
1.Action從頁面取值
a)模型驅動
b)屬性驅動
2.頁面從Action取值
a)使用EL表達式
取基本屬性值 { 屬性名 }
取域模型對象值 { 對象 . 屬性名 }
b)OGNL
Struts2標籤庫與OGNL表達式
1.背景:在JSP中,爲了減小JSP中嵌入大量的Java代碼,JSP規範制定了JSP標準標籤庫JSTL(JSP Standard Tag Library),提升了JSP頁面的可讀性和可維護性。 而Struts2也有本身獨特的標籤庫,並且更爲強大,不只能夠替代JSTL標籤庫,還適用於任何表示層技術(如Velocity、FreeMarker等)。Strut2默認採用OGNL表達式訪問Action的數據,其實是經過ValueStack對象來訪問Action 。相似於EL。
2.注意:在JSP中使用標籤庫時,須要使用taglib指令引入標籤庫
2.OGNL 用法:在Struts2中,OGNL表達式要結合Struts2標籤來訪問數據
EL:${user.userName} <==> OGNL:<s:property value="user.userName">
*a)訪問基本屬性 <s:property value="屬性名"/>
*b)訪問實體對象 <s:property value="對象名.屬性名"/>
c)訪問數組/集合 <s:property value="someArray[1]"/> | <s:property value="someList[1]"/>
d)訪問Map <s:property value="someMap.key" />
e)運算 <s:property value="'My name is' + name" />
f)調用方法 <s:property value="name.toUpperCase()" />
g)建立集合 <s:property value="{'a','b','c'}" /> ArrayList
h)建立Map <s:property value="#{'mm':'MM','nn':'NN'}" /> LinkedHashMap
ValueStack
1.概念:是Struts2中,Action向頁面傳遞數據的媒介,封裝了Action的數據,並容許JSP經過OGNL來對其訪問
2. EL表達式訪問ValueStack
a)EL也是從ValueStack中取的值
b)EL默認的取值範圍是page,request,session,application
c)Struts2重寫的request的getAttribute方法,先試圖從原始request中取值,若是沒取到再從ValueStack中取值
建立一個ActionInvocation的實例。