一、struts2的工作原理 上圖為struts整體結構。 1.客戶端初始化一個指向servlet的請求; 2.請求通過一系列過濾器(其中的ActionContextCleanUp為可選過濾器,對struts與其他框架集成有幫助),到達StrutsPrepareAndExecuteFilter過濾器 ...
一、struts2的工作原理
上圖為struts整體結構。
1.客戶端初始化一個指向servlet的請求;
2.請求通過一系列過濾器(其中的ActionContextCleanUp為可選過濾器,對struts與其他框架集成有幫助),到達StrutsPrepareAndExecuteFilter過濾器;
3.StrutsPrepareAndExecuteFilter詢問ActionMapper是否調用某個action;
4.AcitonMapper決定調用某個action,Filter將請求的處理交給ActionProxy;
5.ActionProxy通過Configuration Manager詢問框架的配置文件找到需要的Action類;
6.ActionProxy創建一個ActionInvocation實例;
7.ActionInvocation實例使用命名模式來調用,在調用Action的前後,涉及到相關攔截器(Intercepter)的調用;
8.一旦Action調用完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果,返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標簽。在這個過程中需要涉及到ActionMapper
struts與mvc模型
控制:XML文件Struts-config.xml,與之相關聯的是Controller,它可以稱作為Struts神經中樞。
視圖:主要由JSP生成頁面完成視圖,Struts提供豐富的JSP 標簽庫: Html,Bean,Logic,Template等,這有利於分開在Struts中,承擔MVC中Controller角色的是一個Servlet,叫ActionServlet。ActionServlet是一個通用的控制組件。這個控制組件提供了處理所有發送到Struts的HTTP請求的入口點。它截取和分發這些請求到相應的動作類(這些動作類都是Action類的子類)。另外控制組件也負責用相應的請求參數填充 Action From(通常稱之為FromBean),並傳給動作類(通常稱之為ActionBean)。動作類實現核心商業邏輯,它可以訪問java bean 或調用EJB。最後動作類把控制權傳給後續的JSP 文件,後者生成視圖。所有這些控制邏輯利用Struts-config.xml文件來配置。表現邏輯和程式邏輯。
模型:模型以一個或多個java bean的形式存在。這些bean分為三類:Action Form、Action、JavaBean or EJB。Action Form通常稱之為FormBean,封裝了來自於Client的用戶請求信息,如表單信息。Action通常稱之為ActionBean,獲取從ActionSevlet傳來的FormBean,取出FormBean中的相關信息,並做出相關的處理,一般是調用Java Bean或EJB等。
流程:在Struts中,用戶的請求一般以*.do作為請求服務名,所有的*.do請求均被指向ActionSevlet,ActionSevlet根據Struts-config.xml中的配置信息,將用戶請求封裝成一個指定名稱的FormBean,並將此FormBean傳至指定名稱的ActionBean,由ActionBean完成相應的業務操作,如文件操作,資料庫操作等。每一個*.do均有對應的FormBean名稱和ActionBean名稱,這些在Struts-config.xml中配置。
核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts-config.xml。
二、struts2的實現流程
1.包含jar包到項目lib目錄
2.配置web項目的web.xml文件,添加struts2濾器:
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepaerAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3.創建action類,繼承ActionSupport類:
public class HelloWorldAction extends ActionSupport{
//預設執行execute()方法
public String execute(){}
4.創建struts2的核心配置文件struts.xml並配置action:
<struts>
<include file="struts-users.xml"></include> //通過include標簽實現多個配置文件的組件式包含。
<package name="default" namespace="/" extends="struts-default"> //配置文件中可有多個package,但名稱必須唯一。
<intercepters> //定義攔截器。。。
<intercepter name="timer" class="com.kay.Timer"></intercepter>
</intercpters>
<global-results> //全局結果集
<result name="input">/error.jsp</result>
</global-results>
<action name="helloworld" class="com.action.HelloWorldAction"> //每個包可以定義多個action,name為其訪問路徑,有命名空間需添加命名空間首碼
<result>/result.jsp</result> //結果集,無name與type為預設結果
</action>
<param name="url">http://www.sina.com</param> //參數
</package>
<constant name="struts.i18n.reload" value="true"></constant> //常量值,參考struts.propertise
</struts>
補充:調用動態方法:
第一種-同一action下的不同方法可通過配置同一package下的不同action標簽實現,指向同一class,通過method屬性區別(name不能相同)。
第二種-通過通配符實現:
<action name="helloworld_*" name="{1}" class....>
<result name = "add">/{1}.jsp</result> //通過...helloworld_add.action實現
或:<action name="*_*" name="{2}" class="com.action.{1}Action">
<resutl name="add">/{2}.jsp</result> //通過HelloWorld_add.action實現
5.接收參數
-使用Action的屬性接收參數:
直接在繼承ActionSupport的Action中添加參數同名欄位,並添加getter和setter,可通過欄位直接調用參數;簡單,但參數數量多時不宜使用;
-使用DomainModel接收:
創建對象類封裝參數,通過action中添加對象欄位實現調用,參數傳遞頁面須將參數名稱改為對象.參數(user.password)以傳遞到指定對象。
-使用ModelDriven接收:
為Action添加ModelDriven介面,同時將封裝參數的對象類,併在Action類中添加getModel方法(返回對象user);調用時須先對對象類進行實例化 (DomainModel不需要實例化),同時參數傳遞頁面的參數名稱不需添加對象首碼。
當參數為複雜對象時,第三種方法可直接通過數組的下標,對象的“."欄位調用進行傳遞。。。