一、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求;前端
二、這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMesh、Plugin);java
三、接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否須要調用某個Action(2.1.3開始核心控制器是StrutsPrepareAndExecuteFilter);apache
四、若是ActionMapper決定須要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;json
五、ActionProxy經過Configuration Manager詢問框架的配置文件,找到須要調用的Action類;瀏覽器
六、ActionProxy建立一個ActionInvocation的實例。安全
七、ActionInvocation實例(它應該對應到具體的Method<不肯定>)使用命名模式(裏面聲明瞭一個接口,接口裏面只有一個方法,使用到命名模式的主方法傳入的「命令」就是這個接口參數,主方法直接調用接口裏面的這個方法就行)來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。服務器
八、一旦Action執行完畢,ActionInvocation負責根據struts、xml中的配置找到對應的返回結果。返回結果一般是(但不老是,也多是另外的一個Action鏈)一個須要被表示的JSP或者FreeMarker的模版。在表示的過程當中可使用Struts2框架中繼承的標籤。在這個過程當中須要涉及到ActionMapper。session
第二個加載的是一批配置文件app
Strtus-plugin.xml 插件的配置聲明框架
當一個請求來時,若是查找不到指定的class及對應的method就會執行ActionSupport類中的execute方法。
能夠直接在strtus.xml文件中定義常量 (推薦)
模型驅動
1.讓Action類要實現一個指定接口ModelDriven
2.實例化模型對象(就是要new出來javaBean)
3.重寫getModel方法將實例化的模型返回。
屬性驅動
直接在action類中提供與請求參數匹配屬性,提供get/set方法
若是從根中獲取數據,不須要添加#號,若是不是從根中獲取,須要#
在struts2框架中咱們使用ognl表達式的做用是從valueStack中獲取數據
想在jsp頁面上使用ognl表達式,就須要結合struts2框架的標籤,<s:property value=」表達式」>來使用
咱們使用valueStack的主要目的是爲我將咱們action中產生的數據攜帶到頁面上,也就是說valueStack它就是一個容器,接口,。咱們主要使用的是它的實現類com.opensymphony.xwork2.ognl.OgnlValueStack,struts2框架將valueStack保存在request中。
當客戶端向咱們發送一個請求,服務器就會創始一個Action來處理請求,struts2中的action是一個多例,每一次請求都會有一個新的action對應。因此它不存在線程安全問題。
request---ActionContext----Action-----ValueStaci它們都對應着一次請求(一個線程).
第一種方式:能夠直接經過request對象來獲取.
第二種方式:使用ActionContext來獲取
ActionContext它是action上下文,strtus2框架它使用actionContext來保存Action在執行過程當中所須要的一些對象,例如 session, application…
ActionContext的獲取 是經過它的靜態方法getContext()獲得。
Struts2會根據每一次的http請求來建立對應的ActionContext,它是與當前線程綁定的。
每一次請求,就是一個線程,對應着一個request,每一次請求,會建立一個Action,每個action對應一個ActionContext.每一次請求也對應着一個valueStack.
request---ActionContext----Action-----ValueStaci它們都對應着一次請求(一個線程).
問題:爲何el表達式能夠從valueStack中獲取數據?
org.apache.struts2.dispatcher.StrutsRequestWrapper
Struts2框架對request進行了加強,重寫了getAttribute方法,若是在request域中查找不到數據,就會在valueStack中獲取。
com.opensymphony.xwork2.interceptor.Interceptor
在配置文件中聲明Interceptor
咱們也能夠將多個interceptor封裝成一個stack
能夠在Action的配置中引入本身的interceptor
注意:當咱們顯示的引入了一個自定義的Interceptor,那麼默認的defaultStack就不會在導入,須要手動導入
表單提交方式method=post
表單中必須有一個<input type=」file」>組件
表單中必須設置enctype=」multipart/form-data」
若是對Date類型進行格式化輸出
關於屬性是否生成在json串中設置
設置如期
過濾屬性
將咱們本身配置文件中的<package extends=」json-default」>
Action的返回視圖<result name=」」 type=」json」>配置了上面兩步,那麼struts2框架就會將valueStack中的棧頂元素轉換成json響應到瀏覽器
在action的配置中引用