Struts2框架基礎概念總結


一、struts2框架

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

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

二、framework(框架)

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

框架的優點:

(1)重用代碼大大增加,軟件生產效率和質量也得到了提高

(2)使用框架開發,它提供統一的標准,大大降低了我們的后期維護。

三、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中定義的過濾器,最終返回給客戶端

四、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中定義的。

五、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屬性作用是用於指定跳轉方式。

六、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 訪問方式,可以使用*通配符來訪問,使用*來簡化操作方案,它對名稱規范必須進行一個統一。

七、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方法將實例化的模型返回。

八、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;

九、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=表達式”>來使用。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             

十、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中數據

十一、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就不會在導入,需要手動導入。

十二、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

它是用於處理攔截器的

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

一、struts2框架

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

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

二、framework(框架)

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

框架的優點:

(1)重用代碼大大增加,軟件生產效率和質量也得到了提高

(2)使用框架開發,它提供統一的標准,大大降低了我們的后期維護。

三、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中定義的過濾器,最終返回給客戶端

四、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中定義的。

五、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屬性作用是用於指定跳轉方式。

六、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 訪問方式,可以使用*通配符來訪問,使用*來簡化操作方案,它對名稱規范必須進行一個統一。

七、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方法將實例化的模型返回。

八、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;

九、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=表達式”>來使用                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

十、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中數據

十一、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就不會在導入,需要手動導入。

十二、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

它是用於處理攔截器的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM