Struts2框架基礎概念總結

1、struts2框架

Struts2是一個基於MVC設計模式的Web應用框架,它本質上至關於一個servlet,在MVC設計模式中,Struts2做爲控制器(Controller)來創建模型與視圖的數據交互。Struts2Struts1融合webwork前端

ONGL表達式:就是對象圖形化導航語言在前端頁面中,訪問action的屬性、方法;相似於認爲就是對JSP的封裝,是編程更加方便。(如下詳解)java

2、framework(框架)

一個基本概念上的結構,用於去解決或者處理複雜的問題,框架是在特定的領域內解決問題。web

框架的優勢:spring

(1)重用代碼大大增長,軟件生產效率和質量也獲得了提升apache

(2)使用框架開發,它提供統一的標準,大大下降了咱們的後期維護。編程

3、Struts2框架運做

 

工做流程:
1)客戶端瀏覽器發送HTTP請求到Web應用
2Web容器將請求傳遞到標準ActionContextCleanUp過濾器以消除屬性,而不讓後續過濾器清楚,以延長Action中屬性(包括自定義屬性)的生命週期。
3)再通過如stimesh等其餘過濾器後,請求傳遞給StrutsPrepareAndExecuteFilter核心控制器
4StrutsPrepareAndExecuteFilter調用ActionMapperAction映射器)肯定調用哪一個Action,再將控制權轉移給ActionProxy代理
5ActionProxy代理調用配置管理器ConfigurationManager從配置文件struts.xml中讀取配置信息,而後建立ActionInvocation對象
6ActionInvocation在調用攔截器鏈中的攔截器後再調用Action,根據Action返回的結果字符串查找對應的Result
7Result調用視圖模板,再以相反的順序執行攔截器鏈,返回HTTP響應
8HTTP響應以相反的順序返回給核心控制器StrutsPrepareAndExecuteFilter以及其餘web.xml中定義的過濾器,最終返回給客戶端設計模式

4、Struts2執行流程

  1. Struts2源碼導入(Struts2官網下載地址:https://struts.apache.org/

              (1) struts2核心部分源代碼org.apache.struts2xx : src\core\src\main\java瀏覽器

    (2) struts2xwork核心部分源代碼 :src\xwork-core\src\main\java\com\opensymphony\xwork2緩存

    (3)struts2的插件的源代碼: src\plugins安全

   2.關於struts.xml的中文亂碼

   第一步:

    在eclipsewindow下首選面中查找xml  catalog

   第二步:

    Location:配置本地的dtd文件路徑

    key type:選擇URI

    Key: http://struts.apache.org/dtds/struts-2.3.dtd

  注意版本要對應,若是你能夠上網,那麼會自動緩存dtd,具備提示功能。

  3.執行流程介紹

    1.當經過瀏覽器發送一個請求

    2.會被StrutsPrepareAndExecuteFilter攔截

    3.會調用struts2框架默認的攔截器(interceptor)完成部分功能

    4.在執行Action中操做

   5.根據Action中方法的執行結果來選擇來跳轉頁面Resutl視圖通常管StrutsPrepareAndExecuteFilter叫作前端控制器(核心控制器),只有配置了這個filterStruts2框架才能使     用,Struts2的默認攔截器(interceptor)它們是在struts-default.xml文件中配置。

  注意:這上xml文件是在struts-core.jar包中,默認的攔截器是在defaultStack中定義的。

5、Struts2配置詳解

  1. Struts2配置文件加載順序

   init_DefaultProperties()加載的是 default.properties 文件

    位置:struts2-core.jar org.apache.struts2 包下

    做用:主要是聲明瞭 struts2 框架的常量

    init_TraditionXmlConfigurations()加載的是一批配置文件

    Struts-default.xml

    位置:struts2-corl.jar

    做用:聲明瞭 interceptor result bean

    Struts-plugin.xml

    位置:struts2 的插件包中

    做用:主要用於插件的配置聲明

    Struts.xml

    位置:在咱們本身的工程中

    做用:用於咱們本身工程使用 struts2 框架的配置

    init_LegacyStrutsProperties()加載的是自定義的struts.properties

    位置:都是在本身工程的 src

    做用:定製常量

    init_CustomConfigurationProviders()自定義配置提供

    init_FilterInitParmeters()加載的是 web.xml 配置文件

    主要是加載 struts2 框架在 web.xml 文件中的相關配置.

    init_AliasStandardObjects() bean 相關配置

    重點掌握:

     1.Default.properties

     2.Struts-default.xml

       3.Struts-plugin.xml

     4.Struts.xml

     5.web.xml

 2.struts.xml件配置介紹

   (1) package配置(strust.xml只存在一個package至關於一個struts的項目)

    name屬性做用:定義一個包的名稱,它必須惟一。

    namespace屬性做用:主要是與action標籤的name屬性聯合使用來肯定一個 action的訪問路徑。

    extends屬性做用:指定繼承自哪一個包。通常值是struts-defaultstruts-default包是 struts-default.xml文件中聲明的。

    abstruct屬性它表明當前包是一個抽象的,主要是用於被繼承。

(2) action配置(對應相應的以action結尾的類,一個package能夠有多個action

     name屬性做用:主要是與packagenamespace聯合使用來肯定action的訪問路徑。

    class屬性做用:用於指示當前的action類。

   method屬性做用:用於指示當前的action類中的哪一個方法執行。

(3) result配置(用於顯示視圖的結果)

    name屬性做用是與action類的method方法的返回值進行匹配,來肯定跳轉路徑。

   type屬性做用是用於指定跳轉方式。

6、Action類詳解

   Action類至關於javaWeb階段下的Servlet類,作着調用service層的關係,實現頁面的 跳轉,完成業務邏輯操做。

  1. Action類的建立(注意:action類的全路徑(即包名)必須含有action的詞彙)

   (1) 建立一個POJO類;(hibernate自動會封裝成PO類)

   (2) 建立一個類實現一個Action接口;

   (3) 建立一個類繼承ActionSupport類。

  2. 訪問Action

   (1) 直接經過<action>標籤來配置,經過method來指定訪問的方法,若是method沒有,默認訪問的是execute方法;

   (2) 簡化的 action 訪問方式,可使用*通配符來訪問,使用*來簡化操做方案,它對名稱規範必須進行一個統一。

7、Struts2框架封裝數據

  1. 屬性驅動

    直接在 action 類中提供與請求參數匹配屬性,提供get/set方法在, action 類中創始一個javaBean,對其提供get/set,在請求時頁面上要進行修改,例如 user.username     user.password ,要使用ognl表達式

    以上兩種方式的優缺點:

      第一種比較簡單,在實際操做咱們須要將action的屬性在賦值給模型(javaBean)去操做;

      第二種:不須要在直接將值給javaBean過程,由於直接將數據封裝到javaBean中。它要求在頁面上必須使用ognl表達式,就存在頁面不通用問題。

  2. 模型驅動

         (1) Action 類要實現一個指定接口 ModelDriven

    (2)實例化模型對象(就是要new出來javaBean)

    (3)重寫getModel方法將實例化的模型返回。

8、Struts2中獲取Servlet

  1.ServletActionContext獲取

    獲取request: ServletActionContext.getRequest();

    獲取response: ServletActionContext.getResponse();

    獲取servletContext: ServletActionContext.getServletContext();

  2.採用注入方式

  Struts2框架在運行時,請求會被StrutsPrepareAndExecuteFilter攔截,會根據請求,去strtus.xml文件中查找到匹配的action,在action執行前,會走一些interceptor默認執行的攔截器是struts-default.xml文件中定義的在默認執行的攔截器中有一個

  ServletRequestAware, 實現這個接口能夠獲取HttpServletRequest;

  ServletResponseAware ,實現這個接口能夠獲取HttpServletResponse;

  ServletContextAware 實現這個接口能夠獲取ServletContext;

9、OGNL表達式

  OGNLObject-Graph Navigation Language(對象圖導航語言)的縮寫,它是一種功能強大的表達式語言,經過它簡單一致的表達式語法,能夠存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。

  Struts2框架內置了OGNLOGNL自己也是一個項目,它是能夠單獨使用。

  OGNL做用:

    支持對象的操做,調用對象的方法

    支持靜態成員訪問

    支持賦值操做與表達串聯

    訪問OGNL上下文,訪問ActionContext

    操做集合對象。

  Strtus2框架中如何使用ognl表達式

    在struts2框架中咱們使用ognl表達式的做用是從valueStack中獲取數據struts2框架中可使用ognl+valueStack達到在頁面(jsp)上來獲取相關的數據要想在jsp頁面上使用ognl表達式,就須要結合struts2框架的標籤<s:property value=表達式」>來使用。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             

10、valueStack(值棧)

1. valueStack介紹

valueStack的主要目的是爲action中產生的數據攜帶到頁面上,也就是說valueStack它就是一個容器Struts2框架中將valueStack設計成一個接口當客戶端向咱們發送一個請求,服務器就會創始一個Action來處理請求,struts2中的action是一個多例,每一次請求都會有一個新的action對應。因此它不存在線程安全問題一個valueStack對應一個actionvalueStack貫穿整個action的生命週期struts2框架將valueStack保存在request中。

2. valueStack內部結構

valueStack主要有兩部分組成:

CompoundRoot:它就是一個ArrayList它主要存儲的是action的相關數據

Map<String,Object> context:就是一個MapContext中主要存儲了一些引用,這個引用主要是關於web開發中相關信息

pameters :請求參數

request:請求對象中全部屬性

session:會話對象中全部屬性

application:application對象中的全部發展

struts2框架中咱們經過ognl表達式來獲取valueStack中數據,沒有使用#就會從CompoundRoot中獲取數據,若是使用#來獲取,這時就會從context中來獲取

3. 獲取ValueStack

(1) 經過request對象來獲取

   ValueStack  vs =  (ValueStack)ServletActionContext.getRequest()

.getAttribute(ServletActionContext.STURTS_VALUESTACK_KEY);

(2) 經過ActionContext來獲取

ValueStack  vs =  ActionContext.getServletContext()getValueStack();

4. ActionContext

ActionContext它是action上下文,Strtus2框架它使用ActionContext來保存Action在執行過程當中所須要的一些對象,例如 session, application… ActionContext的獲取  是經過它的靜態方法getContext()獲得。Struts2會根據每一次的http請求來建立對應的ActionContext,它是與當前線程綁定的。每一次請求,就是一個線程,對應着一個request,每一次請求,會建立一個Action,每個action對應一個ActionContext.每一次請求也對應着一個valueStack它們都對應着一次請求(一個線程)valueStackActionContext本質上是能夠獲取

5. ValueStack存儲數據

(1) 手動向valueStack存儲數據

     vs.push(String str); vs.set(Object obj  String str);

(2) Struts2框架自動向valueStack中存儲數據

    每次請求,訪問action,這個對象會存儲到valueStack

DefaultActionInvocationinit方法內調用:vs.push(Action action);

ModelDrivernInterceptor調用ModelDriverngetModel()方法;

6. ValueStack獲取數據

(1). Jsp頁面獲取,導入s標籤庫

<s:property  value = 「 「 />

   (2). Action中屬性

調用POgetter方法;

    (3). Model類中(即模型驅動)

   調用getModel()方法;

7. EL表達式從ValueStack中獲取數據

El表達式能夠從valueStack中獲取信息jsp頁面中顯示:如:{$ model.name}org.apache.struts2.dispatcher.StrutsRequestWrapper這個類可使ValueStack使用EL表達式,Struts2框架對request進行了加強,重寫了getAttribute方法,若是在request域中查找不到數據,就會在valueStack中獲取。

8. Ognl表達式中特殊字符

OGNL是一般要結合Struts 2的標誌一塊兒使用。主要是#%$這三個符號的使用#:它是從非root中獲取數據%用於強制是否要解析ognl表達式$主要是從配置文件中來獲取valueStack中數據

11、Interceptor攔截器

1. Interceptor攔截器介紹

Struts2中的interceptor它是基於spring aop思想,而aop思想它本質上是經過動態代理來實現。咱們strtus2的攔截器它主要是攔截Action的操做,在action的執行前或執行後進行一些其它的功能操做。

攔截器鏈(攔截器棧)簡單說,就是能夠將多個攔截器造成一個鏈,在訪問它們時依次訪問。執行圖見上圖;

執行的過程:

當咱們發送請求訪問Action時,會被StrutsPrepareAndExecuteFilter攔截在其doFilter方法內執行了execute.executeAction(request, response, mapping);這個代碼執行後dispatcher.serviceAction(request, response, mapping);serviceAction方法執行在這個方法執行過程當中會建立Action代理對象ActionProxy proxy = getContainer().getInstance(ActionProxyFactory.class).createActionProxy( namespace, name, method, extraContext, true, false);經過proxy去執行了proxy.execute();execute方法內return invocation.invoke();invocation它是ActionInvocation一個對象會去加載咱們的配置文件,將配置文件中全部的interceptor獲得進行遍歷。在struts-default.xml文件中定義了默認加載的攔截器棧 defaultStack在每個攔截器的interceptor方法內,又調用了DefaultActionInvocationinvoke方法,其實就是遞歸調用。

2. 自定義Interceptor

全部的Interceptor都要實現一個接口在配置文件中聲明Interceptor能夠將多個interceptor封裝成一個stack能夠在Action的配置中引入本身的interceptor在使用時name也能夠引入一個interceptor stack注意:當咱們顯示的引入了一個自定義的Interceptor,那麼默認的defaultStack就不會在導入,須要手動導入。

12、Struts2註解開發(現階段主流)

1. xml文件與註解互換

@Namespace來代替<package  namespace=」」>

@ParentPackage來代替<package extends=」」>

@Action來描述關於<action>配置

value屬性<action name=」」>

使用@Actionresults來描述關於結果類型的配置<result>

<result name=」」 type=」」>

@Action(results={@Result(name=」」,type=」」,location=」」)})

2. 其餘註解

@Actions

做用:能夠經過多個映射來訪問同一個action

@Results

相似於全局的結果視圖

@InterceptorRef

它是用於處理攔截器的

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1、struts2框架

Struts2是一個基於MVC設計模式的Web應用框架,它本質上至關於一個servlet,在MVC設計模式中,Struts2做爲控制器(Controller)來創建模型與視圖的數據交互。Struts2Struts1融合webwork

ONGL表達式:就是對象圖形化導航語言在前端頁面中,訪問action的屬性、方法;相似於認爲就是對JSP的封裝,是編程更加方便。(如下詳解)

2、framework(框架)

一個基本概念上的結構,用於去解決或者處理複雜的問題,框架是在特定的領域內解決問題。

框架的優勢:

(1)重用代碼大大增長,軟件生產效率和質量也獲得了提升

(2)使用框架開發,它提供統一的標準,大大下降了咱們的後期維護。

3、Struts2框架運做

工做流程:
1)客戶端瀏覽器發送HTTP請求到Web應用
2Web容器將請求傳遞到標準ActionContextCleanUp過濾器以消除屬性,而不讓後續過濾器清楚,以延長Action中屬性(包括自定義屬性)的生命週期。
3)再通過如stimesh等其餘過濾器後,請求傳遞給StrutsPrepareAndExecuteFilter核心控制器
4StrutsPrepareAndExecuteFilter調用ActionMapperAction映射器)肯定調用哪一個Action,再將控制權轉移給ActionProxy代理
5ActionProxy代理調用配置管理器ConfigurationManager從配置文件struts.xml中讀取配置信息,而後建立ActionInvocation對象
6ActionInvocation在調用攔截器鏈中的攔截器後再調用Action,根據Action返回的結果字符串查找對應的Result
7Result調用視圖模板,再以相反的順序執行攔截器鏈,返回HTTP響應
8HTTP響應以相反的順序返回給核心控制器StrutsPrepareAndExecuteFilter以及其餘web.xml中定義的過濾器,最終返回給客戶端

4、Struts2執行流程

  1. Struts2源碼導入(Struts2官網下載地址:https://struts.apache.org/

(1) struts2核心部分源代碼org.apache.struts2xx : src\core\src\main\java

(2) struts2xwork核心部分源代碼 :

src\xwork-core\src\main\java\com\opensymphony\xwork2

(3)struts2的插件的源代碼: src\plugins

  1. 關於struts.xml的中文亂碼

    第一步:

    在eclipsewindow下首選面中查找xml  catalog

    第二步:

    Location:配置本地的dtd文件路徑

    key type:選擇URI

    Key: http://struts.apache.org/dtds/struts-2.3.dtd

注意版本要對應,若是你能夠上網,那麼會自動緩存dtd,具備提示功能。

  1. 執行流程介紹

1.當經過瀏覽器發送一個請求

2.會被StrutsPrepareAndExecuteFilter攔截

3.會調用struts2框架默認的攔截器(interceptor)完成部分功能

4.在執行Action中操做

5.根據Action中方法的執行結果來選擇來跳轉頁面Resutl視圖通常管StrutsPrepareAndExecuteFilter叫作前端控制器(核心控制器),只有配置了這個filterStruts2框架才能使用,Struts2的默認攔截器(interceptor)它們是在struts-default.xml文件中配置。

注意:這上xml文件是在struts-core.jar包中,默認的攔截器是在defaultStack中定義的。

5、Struts2配置詳解

1. Struts2配置文件加載順序

init_DefaultProperties()加載的是 default.properties 文件

位置:struts2-core.jar org.apache.struts2 包下

做用:主要是聲明瞭 struts2 框架的常量

init_TraditionXmlConfigurations()加載的是一批配置文件

Struts-default.xml

位置:struts2-corl.jar

做用:聲明瞭 interceptor result bean

Struts-plugin.xml

位置:struts2 的插件包中

做用:主要用於插件的配置聲明

Struts.xml

位置:在咱們本身的工程中

做用:用於咱們本身工程使用 struts2 框架的配置

init_LegacyStrutsProperties()加載的是自定義的struts.properties

位置:都是在本身工程的 src

做用:定製常量

init_CustomConfigurationProviders()自定義配置提供

init_FilterInitParmeters()加載的是 web.xml 配置文件

主要是加載 struts2 框架在 web.xml 文件中的相關配置.

init_AliasStandardObjects() bean 相關配置

重點掌握:

1.Default.properties

2.Struts-default.xml

3.Struts-plugin.xml

4.Struts.xml

5.web.xml

 2.struts.xml件配置介紹

(1) package配置(strust.xml只存在一個package至關於一個struts的項目)

  name屬性做用:定義一個包的名稱,它必須惟一。

namespace屬性做用:主要是與action標籤的name屬性聯合使用來肯定一個 action的訪問路徑。

extends屬性做用:指定繼承自哪一個包。通常值是struts-defaultstruts-default包是 struts-default.xml文件中聲明的。

abstruct屬性它表明當前包是一個抽象的,主要是用於被繼承。

(2) action配置(對應相應的以action結尾的類,一個package能夠有多個action

  name屬性做用:主要是與packagenamespace聯合使用來肯定action的訪問路徑。

  class屬性做用:用於指示當前的action類。

method屬性做用:用於指示當前的action類中的哪一個方法執行。

(3) result配置(用於顯示視圖的結果)

    name屬性做用是與action類的method方法的返回值進行匹配,來肯定跳轉路徑。

type屬性做用是用於指定跳轉方式。

6、Action類詳解

Action類至關於javaWeb階段下的Servlet類,作着調用service層的關係,實現頁面的 跳轉,完成業務邏輯操做。

1. Action類的建立(注意:action類的全路徑(即包名)必須含有action的詞彙)

(1) 建立一個POJO類;(hibernate自動會封裝成PO類)

(2) 建立一個類實現一個Action接口;

(3) 建立一個類繼承ActionSupport類。

2. 訪問Action

(1) 直接經過<action>標籤來配置,經過method來指定訪問的方法,若是method沒有,默認訪問的是execute方法;

(2) 簡化的 action 訪問方式,可使用*通配符來訪問,使用*來簡化操做方案,它對名稱規範必須進行一個統一。

7、Struts2框架封裝數據

1. 屬性驅動

直接在 action 類中提供與請求參數匹配屬性,提供get/set方法

action 類中創始一個javaBean,對其提供get/set,在請求時頁面上要進行修改,

例如 user.username user.password ,要使用ognl表達式

以上兩種方式的優缺點:

第一種比較簡單,在實際操做咱們須要將action的屬性在賦值給模型(javaBean)

去操做;

第二種:不須要在直接將值給javaBean過程,由於直接將數據封裝到javaBean

中。它要求在頁面上必須使用ognl表達式,就存在頁面不通用問題。

2. 模型驅動

    (1) Action 類要實現一個指定接口 ModelDriven

(2)實例化模型對象(就是要new出來javaBean)

(3)重寫getModel方法將實例化的模型返回。

8、Struts2中獲取Servlet

  1. ServletActionContext獲取

獲取request: ServletActionContext.getRequest();

獲取response: ServletActionContext.getResponse();

獲取servletContext: ServletActionContext.getServletContext();

2.採用注入方式

Struts2框架在運行時,請求會被StrutsPrepareAndExecuteFilter攔截,會根據請求,去strtus.xml文件中查找到匹配的action,在action執行前,會走一些interceptor默認執行的攔截器是struts-default.xml文件中定義的在默認執行的攔截器中有一個

ServletRequestAware, 實現這個接口能夠獲取HttpServletRequest;

ServletResponseAware ,實現這個接口能夠獲取HttpServletResponse;

ServletContextAware 實現這個接口能夠獲取ServletContext;

9、OGNL表達式

OGNLObject-Graph Navigation Language(對象圖導航語言)的縮寫,它是一種功能強大的表達式語言,經過它簡單一致的表達式語法,能夠存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。

Struts2框架內置了OGNLOGNL自己也是一個項目,它是能夠單獨使用。

OGNL做用:

支持對象的操做,調用對象的方法

支持靜態成員訪問

支持賦值操做與表達串聯

訪問OGNL上下文,訪問ActionContext

操做集合對象。

Strtus2框架中如何使用ognl表達式

struts2框架中咱們使用ognl表達式的做用是從valueStack中獲取數據struts2框架中可使用ognl+valueStack達到在頁面(jsp)上來獲取相關的數據要想在jsp頁面上使用ognl表達式,就須要結合struts2框架的標籤<s:property value=表達式」>來使用                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

10、valueStack(值棧)

1. valueStack介紹

valueStack的主要目的是爲action中產生的數據攜帶到頁面上,也就是說valueStack它就是一個容器Struts2框架中將valueStack設計成一個接口當客戶端向咱們發送一個請求,服務器就會創始一個Action來處理請求,struts2中的action是一個多例,每一次請求都會有一個新的action對應。因此它不存在線程安全問題一個valueStack對應一個actionvalueStack貫穿整個action的生命週期struts2框架將valueStack保存在request中。

2. valueStack內部結構

valueStack主要有兩部分組成:

CompoundRoot:它就是一個ArrayList它主要存儲的是action的相關數據

Map<String,Object> context:就是一個MapContext中主要存儲了一些引用,這個引用主要是關於web開發中相關信息

pameters :請求參數

request:請求對象中全部屬性

session:會話對象中全部屬性

application:application對象中的全部發展

struts2框架中咱們經過ognl表達式來獲取valueStack中數據,沒有使用#就會從CompoundRoot中獲取數據,若是使用#來獲取,這時就會從context中來獲取

3. 獲取ValueStack

(1) 經過request對象來獲取

   ValueStack  vs =  (ValueStack)ServletActionContext.getRequest()

.getAttribute(ServletActionContext.STURTS_VALUESTACK_KEY);

(2) 經過ActionContext來獲取

ValueStack  vs =  ActionContext.getServletContext()getValueStack();

4. ActionContext

ActionContext它是action上下文,Strtus2框架它使用ActionContext來保存Action在執行過程當中所須要的一些對象,例如 session, application… ActionContext的獲取  是經過它的靜態方法getContext()獲得。Struts2會根據每一次的http請求來建立對應的ActionContext,它是與當前線程綁定的。每一次請求,就是一個線程,對應着一個request,每一次請求,會建立一個Action,每個action對應一個ActionContext.每一次請求也對應着一個valueStack它們都對應着一次請求(一個線程)valueStackActionContext本質上是能夠獲取

5. ValueStack存儲數據

(1) 手動向valueStack存儲數據

     vs.push(String str); vs.set(Object obj  String str);

(2) Struts2框架自動向valueStack中存儲數據

    每次請求,訪問action,這個對象會存儲到valueStack

DefaultActionInvocationinit方法內調用:vs.push(Action action);

ModelDrivernInterceptor調用ModelDriverngetModel()方法;

6. ValueStack獲取數據

(1). Jsp頁面獲取,導入s標籤庫

<s:property  value = 「 「 />

   (2). Action中屬性

調用POgetter方法;

    (3). Model類中(即模型驅動)

   調用getModel()方法;

7. EL表達式從ValueStack中獲取數據

El表達式能夠從valueStack中獲取信息jsp頁面中顯示:如:{$ model.name}org.apache.struts2.dispatcher.StrutsRequestWrapper這個類可使ValueStack使用EL表達式,Struts2框架對request進行了加強,重寫了getAttribute方法,若是在request域中查找不到數據,就會在valueStack中獲取。

8. Ognl表達式中特殊字符

OGNL是一般要結合Struts 2的標誌一塊兒使用。主要是#%$這三個符號的使用#:它是從非root中獲取數據%用於強制是否要解析ognl表達式$主要是從配置文件中來獲取valueStack中數據

11、Interceptor攔截器

1. Interceptor攔截器介紹

Struts2中的interceptor它是基於spring aop思想,而aop思想它本質上是經過動態代理來實現。咱們strtus2的攔截器它主要是攔截Action的操做,在action的執行前或執行後進行一些其它的功能操做。

攔截器鏈(攔截器棧)簡單說,就是能夠將多個攔截器造成一個鏈,在訪問它們時依次訪問。執行圖見上圖;

執行的過程:

當咱們發送請求訪問Action時,會被StrutsPrepareAndExecuteFilter攔截在其doFilter方法內執行了execute.executeAction(request, response, mapping);這個代碼執行後dispatcher.serviceAction(request, response, mapping);serviceAction方法執行在這個方法執行過程當中會建立Action代理對象ActionProxy proxy = getContainer().getInstance(ActionProxyFactory.class).createActionProxy( namespace, name, method, extraContext, true, false);經過proxy去執行了proxy.execute();execute方法內return invocation.invoke();invocation它是ActionInvocation一個對象會去加載咱們的配置文件,將配置文件中全部的interceptor獲得進行遍歷。在struts-default.xml文件中定義了默認加載的攔截器棧 defaultStack在每個攔截器的interceptor方法內,又調用了DefaultActionInvocationinvoke方法,其實就是遞歸調用。

2. 自定義Interceptor

全部的Interceptor都要實現一個接口在配置文件中聲明Interceptor能夠將多個interceptor封裝成一個stack能夠在Action的配置中引入本身的interceptor在使用時name也能夠引入一個interceptor stack注意:當咱們顯示的引入了一個自定義的Interceptor,那麼默認的defaultStack就不會在導入,須要手動導入。

12、Struts2註解開發(現階段主流)

1. xml文件與註解互換

@Namespace來代替<package  namespace=」」>

@ParentPackage來代替<package extends=」」>

@Action來描述關於<action>配置

value屬性<action name=」」>

使用@Actionresults來描述關於結果類型的配置<result>

<result name=」」 type=」」>

@Action(results={@Result(name=」」,type=」」,location=」」)})

2. 其餘註解

@Actions

做用:能夠經過多個映射來訪問同一個action

@Results

相似於全局的結果視圖

@InterceptorRef

它是用於處理攔截器的

相關文章
相關標籤/搜索