1. 程式人生 > >struts2值的傳遞與接收總結

struts2值的傳遞與接收總結

struts2的傳值與接收(Servlet API解耦的訪問方式)

為了避免與Servlet API耦合在一起,方便Action類做單元測試,
 Struts2對HttpServletRequest、HttpSession和ServletContext進行了封裝,
 構造了三個Map物件來替代這三種物件.

1.ActionContext方式

簡述: ActionContext是Action的上下文,Struts2自動在其中儲存了一些在Action執行過程中所需的物件,比如application,session, request,parameters,等。Struts2會根據每個執行HTTP請求的執行緒來建立對應的ActionContext,即一個執行緒有一個唯一的ActionContext,
使用者可以使用靜態方法ActionContext.getContext()來獲取當前執行緒的ActionContext。
統一共用方法:ActionContext actionContext=ActionContext.getContext();//獲取物件ActionContext (1).獲取application對應的Map,並向其中加一個新增一個屬性: 通過呼叫ActionContext物件getApplication Map<String, Object> applicationMap=actionContext.getApplication(); 新增屬性: applicationMap.put("applicationKey","applicationValue");
//此為Map的鍵值對
在jsp等請求頁面獲取值方法:用EL表示式: ${applicationScope.applicationKey} 或者直接寫 ${applicationKey} 獲取請求頁面的屬性值: Objectobject=applicationMap.get("XX");//xx為請求頁面的屬性 (2).session方式:(與applicationMap方式有異曲同工之妙) 通過呼叫ActionContext物件getSession Map<String, Object> sessionMap=actionContext.getSession();    新增屬性: sessionMap.put("sessionKey", "sessionValue");
(3)request方式: ActionContext中並沒有提供getRequest
需要手工呼叫get()方法,傳入request字串來獲取
Map<String, Object> requestMap=(Map<String, Object>) actionContext.get("request");
requestMap.put("requestKey", "requestValue");
(4)paramters方式: 需要注意的是: A:paramtersMap的只能讀不能寫,如果寫了不會出錯,但也不起作用 B:getParameters的返回值為在map<String,object>,而不是Map<string,String[]> 獲取請求引數: Map<String,Object> parameters=actionContext.getParameters(); Object object=parameters.get("XX");

2.實現AwareAction介面的方式:

簡述: struts2提供了這四個Aware介面用於Action類的實現,從而注入對應的application、request、session,parameter, 不過它們都是Map型別的。這和ActionContext一樣是解耦的,即沒有引入servlet相關的包,是在struts2內部的。 (1)ApplicationAware介面 實現介面方法: private Map<String,Object> application; @Override
public void setApplication(Map<String, Object> application) {
this.application=application;
}
操作: //1.向application中加入一個屬性:applicationKey-applicationValue
application.put("applicationKey", "applicationValue");
//2.從
請求頁面 application中讀取一個屬性date,並列印
請求頁面
application.setAttribute("date", new Date());
Action接受:appliation.get("date"); 對於1的操作的前臺接收資料通過EL表示式可以接收:  ${applicationScope.applicationKey }或者直接的  ${applicationKey}、 (2).SessionAware,RequestAware(與ApplicationAware實現方式雷同) A:SessionAware private Map<String,Object> session;
@Override
public void setSession(Map<String, Object> session) {
this.session=session;
}

B:RequestAware
private Map<String, Object> request;
@Override
public void setRequest(Map<String, Object> request) {
this.request=request;

}

RequestAware和SessionAware的傳值都是用Map中的put方法(參考ApplicationAware) 傳前臺接收值的方式同樣的EL表示式 (3).ParameterAware private Map<String,String[]> parameters;
@Override
public void setParameters(Map<String, String[]> parameters) {
this.parameters=parameters;
}
同樣的需要注意: A: ParameterAware方式只能接受,不能put B:Map型別是 Map<String,String[]> C:接受請求資料: parameters.get("name");//這樣打印出的是:[Ljava.lang.String;@2c0a8c7a 所以得這樣接收請求:(parameters.get("name"))[i] 因為parameters是String[]陣列形式。