一、技術改進
Struts2以webwork爲核心,採用攔截器的機制來處理用戶的請求,使得業務邏輯控制器能夠與ServletAPI完全脫離開。Struts2爲傳統的struts1注入了webwork的先進的設計理念,統一了struts1和webwork兩個框架,所以struts2可以理解爲webwork的更新產品。
Struts2的Action是一個請求對應一個實例(每次請求時都新new(通過攔截器堆棧)出一個對象),沒有線程安全方面的問題。而struts1的Action是單例的,一個Action的實例處理所有的請求。
Struts1中整合了EL,但是El對集合和索引的支持不強,Struts2整合了OGNL(Object Graph Navigation Language).
Struts1使用標準的JSP,struts2使用“ValueStack”技術。
二、 耦合與解耦合
耦合方式:操作Servlet API
HttpSessionsession=ServletActionContext.getRequest().getSession();
解耦合方式:操作Map<String,Object>鍵值對
Map<String,Object>session=ActionContext.getContext().getSession();
API(耦合)中沒有直接獲取session的,只能通過Request,因爲只有發出請求時,服務器纔會給你一個空間存儲數據。
響應(Response)必須用耦合方式獲取。
三、創建Struts2的Action類的四種方法:
1、 extends ActionSupport
public class XXXXAction extends ActionSupport{
PrivateString name;
PublicString getName(){
Returnthis.name;
}
Public voidsetName(String name){
This.name=namel;
}
}
<form actoin=”xxxAction”>
<input type=”text”name=”name”/>
</form>
2、 extends ActionSupport
public class User{
privateString name;
publicString getName(){
returnthis.name;
}
Public voidsetName(String name){
This.name=name;
}
}
public class xxxAction extendsActionSupport{
privateUser user;
publicvoid setUser(User user){
this.user=user;
}
Public User getUser(){
Return this.user;
}
}
<form action=”xxxAction”>
<inputtype=”text” name=”user.name”/>
</form>
${requestScope.user.name}取不到值,因爲user.name中間的點是一個字符,而不是對象運算符,所以,只能用${requestScope[“user.name”]}
3、 extends ActionSupport 並implements ModelDriven<T>,重寫getModel()方法
public class xxxAction extends ActionSupport implementsModelDriven<User>{
privateUser user;
publicvoid setUser(User user){
this.user=user;
}
Public User getUser(){
Return this.user;
}
Public UsergetModel(){
user=new User();
return user;
}
}
<form action=”xxxAction”>
<inputtype=”text” name=”name”/>
</form>
4、 不繼承ActionSupport,也不實現ModelDriven<T>時,XXXAction用法與ActionSupport一樣。
四、 應用流程(架構剖析)
當Web容器收到 請求(HttpServletRequest)它將請求傳遞給一個標準的的過濾鏈包括(ActionContextCleanUp)過濾器,然後經過Other filters(SiteMesh ,etc),接下來需要調用FilterDispatcher核心控制器(在2.3版本後,更改爲StrutsPrepareAndExecuteFilter),然後它調用ActionMapper確定請求哪個Action,ActionMapper返回一個收集Action詳細信息的ActionMaping對象。接下來FilterDispatcher將控制權委派給ActionProxy,ActionProxy調用配置管理器(ConfigurationManager) 從配置文件中讀取配置信息(struts.xml),然後創建ActionInvocation對象,ActionInvocation在調用Action之前會依次的調用所用配置攔截器(Interceptor N) 一旦執行結果返回結果字符串ActionInvocation負責查找結果字符串對應的(Result)然後執行這個Result Result會調用一些模版(JSP)來呈現頁面,之後攔截器(InterceptorN)會在被執行(順序和Action執行之前相反)最後響應(HttpServletResponse)被返回在web.xml中配置的那些過濾器和(核心控制器)(FilterDispatcher)。
五、redirect和redirectAction chain的區別
struts2中關於result的返回類型一般我們是轉發到一個jsp頁面或者是html頁面等,但是 struts2中的result的返回類型還有redirect,redirectAction,chain。對於這三種返回類型之間肯定是有區別的,下 面我們來看看關於redirect redirectAction chain這三種struts2的返回類型之間的區別。當使用type=“redirectAction” 或type=“redirect”提交到一個action並且需要傳遞一個參數時。這裏是有區別的:使用type=“redirectAction”時,結果就只能寫Action的配置名,不能帶有後綴:“.action”
redirect:action處理完後重定向到一個視圖資源(如:jsp頁面),請求參數全部丟失,action處理結果也全部丟失。
redirect-action:action處理完後重定向到一個action,請求參數全部丟失,action處理結果也全部丟失。
chain:action處理完後轉發到一個action,請求參數全部丟失,action處理結果不會丟失。