Struts2是一個基於MVC設計模式的Web應用框架,它本質上至關於一個servlet,在MVC設計模式中,Struts2做爲控制器(Controller)來創建模型與視圖的數據交互。Struts2在Struts1融合webwork。前端
ONGL表達式:就是對象圖形化導航語言,在前端頁面中,訪問action的屬性、方法;相似於認爲就是對JSP的封裝,是編程更加方便。(如下詳解)java
一個基本概念上的結構,用於去解決或者處理複雜的問題,框架是在特定的領域內解決問題。web
框架的優勢:spring
(1)重用代碼大大增長,軟件生產效率和質量也獲得了提升apache
(2)使用框架開發,它提供統一的標準,大大下降了咱們的後期維護。編程
工做流程:
(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中定義的過濾器,最終返回給客戶端。設計模式
(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中定義的。
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類至關於javaWeb階段下的Servlet類,作着調用service層的關係,實現頁面的 跳轉,完成業務邏輯操做。
(1) 建立一個POJO類;(hibernate自動會封裝成PO類)
(2) 建立一個類實現一個Action接口;
(3) 建立一個類繼承ActionSupport類。
(1) 直接經過<action>標籤來配置,經過method來指定訪問的方法,若是method沒有,默認訪問的是execute方法;
(2) 簡化的 action 訪問方式,可使用*通配符來訪問,使用*來簡化操做方案,它對名稱規範必須進行一個統一。
直接在 action 類中提供與請求參數匹配屬性,提供get/set方法在, action 類中創始一個javaBean,對其提供get/set,在請求時頁面上要進行修改,例如 user.username user.password ,要使用ognl表達式
以上兩種方式的優缺點:
第一種比較簡單,在實際操做咱們須要將action的屬性在賦值給模型(javaBean)去操做;
第二種:不須要在直接將值給javaBean過程,由於直接將數據封裝到javaBean中。它要求在頁面上必須使用ognl表達式,就存在頁面不通用問題。
(1)讓 Action 類要實現一個指定接口 ModelDriven;
(2)實例化模型對象(就是要new出來javaBean);
(3)重寫getModel方法將實例化的模型返回。
獲取request: ServletActionContext.getRequest();
獲取response: ServletActionContext.getResponse();
獲取servletContext: ServletActionContext.getServletContext();
Struts2框架在運行時,請求會被StrutsPrepareAndExecuteFilter攔截,會根據請求,去strtus.xml文件中查找到匹配的action,在action執行前,會走一些interceptor默認執行的攔截器是struts-default.xml文件中定義的,在默認執行的攔截器中有一個。
ServletRequestAware, 實現這個接口能夠獲取HttpServletRequest;
ServletResponseAware ,實現這個接口能夠獲取HttpServletResponse;
ServletContextAware 實現這個接口能夠獲取ServletContext;
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的主要目的是爲action中產生的數據攜帶到頁面上,也就是說valueStack它就是一個容器,在Struts2框架中將valueStack設計成一個接口,當客戶端向咱們發送一個請求,服務器就會創始一個Action來處理請求,struts2中的action是一個多例,每一次請求都會有一個新的action對應。因此它不存在線程安全問題,一個valueStack對應一個action,valueStack貫穿整個action的生命週期,struts2框架將valueStack保存在request中。
valueStack主要有兩部分組成:
CompoundRoot:它就是一個ArrayList它主要存儲的是action的相關數據;
Map<String,Object> context:就是一個Map,Context中主要存儲了一些引用,這個引用主要是關於web開發中相關信息;
pameters :請求參數;
request:請求對象中全部屬性;
session:會話對象中全部屬性;
application:application對象中的全部發展;
在struts2框架中咱們經過ognl表達式來獲取valueStack中數據,沒有使用#就會從CompoundRoot中獲取數據,若是使用#來獲取,這時就會從context中來獲取。
(1) 經過request對象來獲取;
ValueStack vs = (ValueStack)ServletActionContext.getRequest()
.getAttribute(ServletActionContext.STURTS_VALUESTACK_KEY);
(2) 經過ActionContext來獲取
ValueStack vs = ActionContext.getServletContext()getValueStack();
ActionContext它是action上下文,Strtus2框架它使用ActionContext來保存Action在執行過程當中所須要的一些對象,例如 session, application… ActionContext的獲取 是經過它的靜態方法getContext()獲得。Struts2會根據每一次的http請求來建立對應的ActionContext,它是與當前線程綁定的。每一次請求,就是一個線程,對應着一個request,每一次請求,會建立一個Action,每個action對應一個ActionContext.每一次請求也對應着一個valueStack。它們都對應着一次請求(一個線程),valueStack與ActionContext本質上是能夠獲取。
(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()方法;
(1). Jsp頁面獲取,導入s標籤庫
<s:property value = 「 「 />
(2). 在Action中屬性
調用PO類getter方法;
(3). 在Model類中(即模型驅動)
調用getModel()方法;
El表達式能夠從valueStack中獲取信息,在jsp頁面中顯示:如:{$ model.name},org.apache.struts2.dispatcher.StrutsRequestWrapper這個類可使ValueStack使用EL表達式,Struts2框架對request進行了加強,重寫了getAttribute方法,若是在request域中查找不到數據,就會在valueStack中獲取。
OGNL是一般要結合Struts 2的標誌一塊兒使用。主要是#、%和$這三個符號的使用,#號:它是從非root中獲取數據,%號用於強制是否要解析ognl表達式,$號主要是從配置文件中來獲取valueStack中數據。
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方法,其實就是遞歸調用。
全部的Interceptor都要實現一個接口,在配置文件中聲明Interceptor,能夠將多個interceptor封裝成一個stack,能夠在Action的配置中引入本身的interceptor,在使用時name也能夠引入一個interceptor stack。注意:當咱們顯示的引入了一個自定義的Interceptor,那麼默認的defaultStack就不會在導入,須要手動導入。
@Namespace來代替<package namespace=」」>
@ParentPackage來代替<package extends=」」>
@Action來描述關於<action>配置
value屬性<action name=」」>
使用@Action的results來描述關於結果類型的配置<result>
<result name=」」 type=」」>
@Action(results={@Result(name=」」,type=」」,location=」」)})
@Actions
做用:能夠經過多個映射來訪問同一個action;
@Results
相似於全局的結果視圖;
@InterceptorRef
它是用於處理攔截器的;
Struts2是一個基於MVC設計模式的Web應用框架,它本質上至關於一個servlet,在MVC設計模式中,Struts2做爲控制器(Controller)來創建模型與視圖的數據交互。Struts2在Struts1融合webwork。
ONGL表達式:就是對象圖形化導航語言,在前端頁面中,訪問action的屬性、方法;相似於認爲就是對JSP的封裝,是編程更加方便。(如下詳解)
一個基本概念上的結構,用於去解決或者處理複雜的問題,框架是在特定的領域內解決問題。
框架的優勢:
(1)重用代碼大大增長,軟件生產效率和質量也獲得了提升
(2)使用框架開發,它提供統一的標準,大大下降了咱們的後期維護。
工做流程:
(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中定義的過濾器,最終返回給客戶端。
(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
第一步:
在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中定義的。
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類至關於javaWeb階段下的Servlet類,作着調用service層的關係,實現頁面的 跳轉,完成業務邏輯操做。
(1) 建立一個POJO類;(hibernate自動會封裝成PO類)
(2) 建立一個類實現一個Action接口;
(3) 建立一個類繼承ActionSupport類。
(1) 直接經過<action>標籤來配置,經過method來指定訪問的方法,若是method沒有,默認訪問的是execute方法;
(2) 簡化的 action 訪問方式,可使用*通配符來訪問,使用*來簡化操做方案,它對名稱規範必須進行一個統一。
直接在 action 類中提供與請求參數匹配屬性,提供get/set方法
在 action 類中創始一個javaBean,對其提供get/set,在請求時頁面上要進行修改,
例如 user.username user.password ,要使用ognl表達式
以上兩種方式的優缺點:
第一種比較簡單,在實際操做咱們須要將action的屬性在賦值給模型(javaBean)
去操做;
第二種:不須要在直接將值給javaBean過程,由於直接將數據封裝到javaBean
中。它要求在頁面上必須使用ognl表達式,就存在頁面不通用問題。
(1)讓 Action 類要實現一個指定接口 ModelDriven;
(2)實例化模型對象(就是要new出來javaBean);
(3)重寫getModel方法將實例化的模型返回。
獲取request: ServletActionContext.getRequest();
獲取response: ServletActionContext.getResponse();
獲取servletContext: ServletActionContext.getServletContext();
Struts2框架在運行時,請求會被StrutsPrepareAndExecuteFilter攔截,會根據請求,去strtus.xml文件中查找到匹配的action,在action執行前,會走一些interceptor默認執行的攔截器是struts-default.xml文件中定義的,在默認執行的攔截器中有一個。
ServletRequestAware, 實現這個接口能夠獲取HttpServletRequest;
ServletResponseAware ,實現這個接口能夠獲取HttpServletResponse;
ServletContextAware 實現這個接口能夠獲取ServletContext;
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的主要目的是爲action中產生的數據攜帶到頁面上,也就是說valueStack它就是一個容器,在Struts2框架中將valueStack設計成一個接口,當客戶端向咱們發送一個請求,服務器就會創始一個Action來處理請求,struts2中的action是一個多例,每一次請求都會有一個新的action對應。因此它不存在線程安全問題,一個valueStack對應一個action,valueStack貫穿整個action的生命週期,struts2框架將valueStack保存在request中。
valueStack主要有兩部分組成:
CompoundRoot:它就是一個ArrayList它主要存儲的是action的相關數據;
Map<String,Object> context:就是一個Map,Context中主要存儲了一些引用,這個引用主要是關於web開發中相關信息;
pameters :請求參數;
request:請求對象中全部屬性;
session:會話對象中全部屬性;
application:application對象中的全部發展;
在struts2框架中咱們經過ognl表達式來獲取valueStack中數據,沒有使用#就會從CompoundRoot中獲取數據,若是使用#來獲取,這時就會從context中來獲取。
(1) 經過request對象來獲取;
ValueStack vs = (ValueStack)ServletActionContext.getRequest()
.getAttribute(ServletActionContext.STURTS_VALUESTACK_KEY);
(2) 經過ActionContext來獲取
ValueStack vs = ActionContext.getServletContext()getValueStack();
ActionContext它是action上下文,Strtus2框架它使用ActionContext來保存Action在執行過程當中所須要的一些對象,例如 session, application… ActionContext的獲取 是經過它的靜態方法getContext()獲得。Struts2會根據每一次的http請求來建立對應的ActionContext,它是與當前線程綁定的。每一次請求,就是一個線程,對應着一個request,每一次請求,會建立一個Action,每個action對應一個ActionContext.每一次請求也對應着一個valueStack。它們都對應着一次請求(一個線程),valueStack與ActionContext本質上是能夠獲取。
(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()方法;
(1). Jsp頁面獲取,導入s標籤庫
<s:property value = 「 「 />
(2). 在Action中屬性
調用PO類getter方法;
(3). 在Model類中(即模型驅動)
調用getModel()方法;
El表達式能夠從valueStack中獲取信息,在jsp頁面中顯示:如:{$ model.name},org.apache.struts2.dispatcher.StrutsRequestWrapper這個類可使ValueStack使用EL表達式,Struts2框架對request進行了加強,重寫了getAttribute方法,若是在request域中查找不到數據,就會在valueStack中獲取。
OGNL是一般要結合Struts 2的標誌一塊兒使用。主要是#、%和$這三個符號的使用,#號:它是從非root中獲取數據,%號用於強制是否要解析ognl表達式,$號主要是從配置文件中來獲取valueStack中數據。
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方法,其實就是遞歸調用。
全部的Interceptor都要實現一個接口,在配置文件中聲明Interceptor,能夠將多個interceptor封裝成一個stack,能夠在Action的配置中引入本身的interceptor,在使用時name也能夠引入一個interceptor stack。注意:當咱們顯示的引入了一個自定義的Interceptor,那麼默認的defaultStack就不會在導入,須要手動導入。
@Namespace來代替<package namespace=」」>
@ParentPackage來代替<package extends=」」>
@Action來描述關於<action>配置
value屬性<action name=」」>
使用@Action的results來描述關於結果類型的配置<result>
<result name=」」 type=」」>
@Action(results={@Result(name=」」,type=」」,location=」」)})
@Actions
做用:能夠經過多個映射來訪問同一個action;
@Results
相似於全局的結果視圖;
@InterceptorRef
它是用於處理攔截器的;