要深入理解一門開發技術,我覺得要從哲學的角度去體會它:是什麼?爲什麼?怎麼用?
1.Strtus2是什麼?
Struts2是一個基於MVC設計模式的Web應用框架,它本質上相當於一個servlet,在MVC設計模式中,Struts2作爲控制器(Controller)來建立模型與視圖的數據交互。Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合併的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts
1的體系結構差別巨大。Struts 2以WebWork爲核心,採用攔截器的機制來處理用戶的請求,這樣的設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,所以Struts 2可以理解爲WebWork的更新產品。雖然從Struts 1到Struts 2有着太大的變化,但是相對於WebWork,Struts 2的變化很小。
2.爲什麼(Struts的原理)?
一個請求在Struts2框架中的處理大概分爲以下幾個步驟(可查看源碼:https://github.com/apache/struts):
1 客戶端初始化一個指向Servlet容器(例如Tomcat)的請求
2 這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的集成很有幫助, 例如:SiteMesh Plugin)
3 接着FilterDispatcher(現已過時)被調用,FilterDispatcher詢問ActionMapper來決定這個請是否需要調用某個Action
4 如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy
5 ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類
6 ActionProxy創建一個ActionInvocation的實例。
7 ActionInvocation實例使用命名模式來調用,在調用Action的過程前後,涉及到相關攔截器(Intercepter)的調用。
8 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標籤。在這個過程中需要涉及到ActionMapper
3.怎麼用(配置Struts2de 步驟)
> 1)配置web.xml
2)配置struts.xml文件
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="action.HelloAction" >
<result name="input">hello.jsp</result> (返回字符串爲input,就跳轉到hello.jsp頁面)
<result name="success">hello.jsp</result>
</action>
<action name="houseAction" class="action.HouseAction">
<result name="success">page/list.htm</result>
</action>
</package></span>
注意:配置文件裏的“action name” 要與form表單裏的“action name”保持一致,並且提交方式一定要設置爲post,method="post"
3)創建Action類(相當於一個Servlet) ,一共有三種方式
1.實現Action接口,重寫execute()方法
2.繼承ActionSupport類,重寫execute()方法(推薦使用)
3.寫一個普通的,不帶參數的execute()方法,例如
4)Action 接受參數的方法
1> 在 Action 中定義屬性:
private String name;
並添加 setter/getter 方法 在頁面中使用 <input type="" name="name" />
2> javaBean 方式定義 JavaBean :
1)創建User實體類User: name, password
2)在 Action 中定義屬性:private User user;並添加 setter/getter 方法,
3)在頁面中使用:<input type="' name="user.name" />
5)在只寫一個Action,內部有N個方法的前提下,如何調用Action方法呢?
1> 在配置中指定方法名:<action name="userAction" class="action.UserAction" method="login">(推薦使用)
2> 動態方法調用:
配置:<action name="userAction" class="action.UserAction">
調用時,地址:userAction!add
3> 通配符方式
配置:<action name="*_Action_*" class="action.{1}Action" method="{2}">
調用時:地址:House_Action_add 將會由 HouseAction 中的 add() 處理。
***2,3的缺點,配置不清晰,另外,result 需要單獨配置