一、struts2框架
Struts2是一個基於MVC設計模式的Web應用框架,它本質上相當於一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與視圖的數據交互。Struts2在Struts1融合webwork。
ONGL表達式:就是對象圖形化導航語言,在前端頁面中,訪問action的屬性、方法;類似於認為就是對JSP的封裝,是編程更加方便。(以下詳解)
二、framework(框架)
一個基本概念上的結構,用於去解決或者處理復雜的問題,框架是在特定的領域內解決問題。
框架的優點:
(1)重用代碼大大增加,軟件生產效率和質量也得到了提高
(2)使用框架開發,它提供統一的標准,大大降低了我們的后期維護。
三、Struts2框架運作
工作流程:
(1)客戶端瀏覽器發送HTTP請求到Web應用
(2)Web容器將請求傳遞到標准ActionContextCleanUp過濾器以消除屬性,而不讓后續過濾器清楚,以延長Action中屬性(包括自定義屬性)的生命周期。
(3)再經過如stimesh等其他過濾器后,請求傳遞給StrutsPrepareAndExecuteFilter核心控制器
(4)StrutsPrepareAndExecuteFilter調用ActionMapper(Action映射器)確定調用哪個Action,再將控制權轉移給ActionProxy代理
(5)ActionProxy代理調用配置管理器ConfigurationManager從配置文件struts.xml中讀取配置信息,然后創建ActionInvocation對象
(6)ActionInvocation在調用攔截器鏈中的攔截器后再調用Action,根據Action返回的結果字符串查找對應的Result
(7)Result調用視圖模板,再以相反的順序執行攔截器鏈,返回HTTP響應
(8)HTTP響應以相反的順序返回給核心控制器StrutsPrepareAndExecuteFilter以及其他web.xml中定義的過濾器,最終返回給客戶端。
四、Struts2執行流程
- Struts2源碼導入(Struts2官網下載地址:https://struts.apache.org/)
(1) struts2核心部分源代碼org.apache.struts2xx : src\core\src\main\java
(2) struts2的xwork核心部分源代碼 :src\xwork-core\src\main\java\com\opensymphony\xwork2
(3)struts2的插件的源代碼: src\plugins
2.關於struts.xml的中文亂碼
第一步:
在eclipse的window下首選面中查找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叫做前端控制器(核心控制器),只有配置了這個filter,Struts2框架才能使 用,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-default,struts-default包是 在struts-default.xml文件中聲明的。
abstruct屬性它代表當前包是一個抽象的,主要是用於被繼承。
(2) action配置(對應相應的以action結尾的類,一個package可以有多個action)
name屬性作用:主要是與package的namespace聯合使用來確定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表達式
OGNL是Object-Graph Navigation Language(對象圖導航語言)的縮寫,它是一種功能強大的表達式語言,通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。
Struts2框架內置了OGNL,OGNL本身也是一個項目,它是可以單獨使用。
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對應一個action,valueStack貫穿整個action的生命周期,struts2框架將valueStack保存在request中。
2. valueStack內部結構
valueStack主要有兩部分組成:
CompoundRoot:它就是一個ArrayList它主要存儲的是action的相關數據;
Map<String,Object> context:就是一個Map,Context中主要存儲了一些引用,這個引用主要是關於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。它們都對應着一次請求(一個線程),valueStack與ActionContext本質上是可以獲取。
5. ValueStack的存儲數據
(1) 手動向valueStack存儲數據;
vs.push(String str); 和 vs.set(Object obj String str);
(2) Struts2框架自動向valueStack中存儲數據;
每次請求,訪問action,這個對象會存儲到valueStack中。
在DefaultActionInvocation的init方法內,調用:vs.push(Action action);
在ModelDrivernInterceptor中,調用ModelDrivern的getModel()方法;
6. ValueStack的獲取數據
(1). Jsp頁面獲取,導入s標簽庫
<s:property value = “ “ />
(2). 在Action中屬性
調用PO類getter方法;
(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方法內,又調用了DefaultActionInvocation的invoke方法,其實就是遞歸調用。
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=””>
使用@Action的results來描述關於結果類型的配置<result>
<result name=”” type=””>
@Action(results={@Result(name=””,type=””,location=””)})
2. 其他注解
@Actions
作用:可以通過多個映射來訪問同一個action;
@Results
類似於全局的結果視圖;
@InterceptorRef
它是用於處理攔截器的;
一、struts2框架
Struts2是一個基於MVC設計模式的Web應用框架,它本質上相當於一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與視圖的數據交互。Struts2在Struts1融合webwork。
ONGL表達式:就是對象圖形化導航語言,在前端頁面中,訪問action的屬性、方法;類似於認為就是對JSP的封裝,是編程更加方便。(以下詳解)
二、framework(框架)
一個基本概念上的結構,用於去解決或者處理復雜的問題,框架是在特定的領域內解決問題。
框架的優點:
(1)重用代碼大大增加,軟件生產效率和質量也得到了提高
(2)使用框架開發,它提供統一的標准,大大降低了我們的后期維護。
三、Struts2框架運作
工作流程:
(1)客戶端瀏覽器發送HTTP請求到Web應用
(2)Web容器將請求傳遞到標准ActionContextCleanUp過濾器以消除屬性,而不讓后續過濾器清楚,以延長Action中屬性(包括自定義屬性)的生命周期。
(3)再經過如stimesh等其他過濾器后,請求傳遞給StrutsPrepareAndExecuteFilter核心控制器
(4)StrutsPrepareAndExecuteFilter調用ActionMapper(Action映射器)確定調用哪個Action,再將控制權轉移給ActionProxy代理
(5)ActionProxy代理調用配置管理器ConfigurationManager從配置文件struts.xml中讀取配置信息,然后創建ActionInvocation對象
(6)ActionInvocation在調用攔截器鏈中的攔截器后再調用Action,根據Action返回的結果字符串查找對應的Result
(7)Result調用視圖模板,再以相反的順序執行攔截器鏈,返回HTTP響應
(8)HTTP響應以相反的順序返回給核心控制器StrutsPrepareAndExecuteFilter以及其他web.xml中定義的過濾器,最終返回給客戶端。
四、Struts2執行流程
- Struts2源碼導入(Struts2官網下載地址:https://struts.apache.org/)
(1) struts2核心部分源代碼org.apache.struts2xx : src\core\src\main\java
(2) struts2的xwork核心部分源代碼 :
src\xwork-core\src\main\java\com\opensymphony\xwork2
(3)struts2的插件的源代碼: src\plugins
- 關於struts.xml的中文亂碼
第一步:
在eclipse的window下首選面中查找xml catalog
第二步:
Location:配置本地的dtd文件路徑
key type:選擇URI
Key: http://struts.apache.org/dtds/struts-2.3.dtd
注意版本要對應,如果你可以上網,那么會自動緩存dtd,具有提示功能。
- 執行流程介紹
1.當通過瀏覽器發送一個請求
2.會被StrutsPrepareAndExecuteFilter攔截
3.會調用struts2框架默認的攔截器(interceptor)完成部分功能
4.在執行Action中操作
5.根據Action中方法的執行結果來選擇來跳轉頁面Resutl視圖一般管StrutsPrepareAndExecuteFilter叫做前端控制器(核心控制器),只有配置了這個filter,Struts2框架才能使用,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-default,struts-default包是 在struts-default.xml文件中聲明的。
abstruct屬性它代表當前包是一個抽象的,主要是用於被繼承。
(2) action配置(對應相應的以action結尾的類,一個package可以有多個action)
name屬性作用:主要是與package的namespace聯合使用來確定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表達式
OGNL是Object-Graph Navigation Language(對象圖導航語言)的縮寫,它是一種功能強大的表達式語言,通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。
Struts2框架內置了OGNL,OGNL本身也是一個項目,它是可以單獨使用。
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對應一個action,valueStack貫穿整個action的生命周期,struts2框架將valueStack保存在request中。
2. valueStack內部結構
valueStack主要有兩部分組成:
CompoundRoot:它就是一個ArrayList它主要存儲的是action的相關數據;
Map<String,Object> context:就是一個Map,Context中主要存儲了一些引用,這個引用主要是關於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。它們都對應着一次請求(一個線程),valueStack與ActionContext本質上是可以獲取。
5. ValueStack的存儲數據
(1) 手動向valueStack存儲數據;
vs.push(String str); 和 vs.set(Object obj String str);
(2) Struts2框架自動向valueStack中存儲數據;
每次請求,訪問action,這個對象會存儲到valueStack中。
在DefaultActionInvocation的init方法內,調用:vs.push(Action action);
在ModelDrivernInterceptor中,調用ModelDrivern的getModel()方法;
6. ValueStack的獲取數據
(1). Jsp頁面獲取,導入s標簽庫
<s:property value = “ “ />
(2). 在Action中屬性
調用PO類getter方法;
(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方法內,又調用了DefaultActionInvocation的invoke方法,其實就是遞歸調用。
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=””>
使用@Action的results來描述關於結果類型的配置<result>
<result name=”” type=””>
@Action(results={@Result(name=””,type=””,location=””)})
2. 其他注解
@Actions
作用:可以通過多個映射來訪問同一個action;
@Results
類似於全局的結果視圖;
@InterceptorRef
它是用於處理攔截器的;