struts2--基礎

一、技術改進

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處理結果不會丟失。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章