Struts2

1、概念

  輕量級的MVC框架,主要解決了請求分發的問題,重心在控制層和表現層。低侵入性,與業務代碼的耦合度很低。Struts2實現了MVC(功能模塊和顯示模塊的分離),並提供了一系列 API,採用模式化方式簡化業務開發過程。web

  注:MVC 由 Model(模型),View(視圖),Controller(控制器)組成。數組

    ① 模型對應 service 層,表示業務數據或業務邏輯。瀏覽器

    ② 視圖對應 如: JSP ,是用戶看到並與之交互的界面。session

    ③ 控制器 對應 controller ,根據用戶的輸入,控制用戶界面數據顯示和更新 model 對象。app

 

2、框架結構和工做原理

  2.1 框架結構

  (圖片來源見水印)框架

 

  2.2 工做原理

  (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

 

  2.3 工做流程

  一、客戶端瀏覽器發出HTTP請求。
  二、根據 web.xml 配置,該請求會被  StrutsPrepareAndExecuteFilter(核心控制器) 接收。
  三、根據 struts.xml 配置,找到須要調用的 Action 類和方法, 並經過 IoC 方式,將值注入給 Aciton。
  四、Action 調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。
  五、Action 執行完畢,根據 struts.xml 中的配置找到對應的返回結果 result,並跳轉到相應頁面。
  六、返回 HTTP 響應到客戶端瀏覽器。
 

3、組件說明

  ActionMapper:經過 method 參數將請求轉發到具體的 action 。 

  ActionProxy代理:是 Action 的一個代理類,也就是說 Action 的調用是經過 ActionProxy 實現的,其實就是調用了 ActionProxy.execute()方法,而該方法又調用了 ActionInvocation.invoke()方法。歸根到底,最後調用的是 DefaultActionInvocation.invokeAction() 方法。

  ActionInvocation:就是 Action 的調用者。ActionInvocation 在 Action 的執行過程當中,負責 Interceptor、Action和Result 等一系列元素的調度。

  Interceptor攔截器:是 Struts2 的一個強有力的工具,有許多功能(feature)都是構建於它之上,如國際化、校驗等。

 

4、參數傳遞

  1.Action從頁面取值  

    a)模型驅動

    b)屬性驅動

  2.頁面從Action取值

    a)使用EL表達式

      取基本屬性值  { 屬性名 }

      取域模型對象值  { 對象 . 屬性名 }

    b)OGNL

 

 

5、其餘

  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的實例。

相關文章
相關標籤/搜索