尚硅谷公開課--struts2--3--struts2中獲取web資源的幾種方式

在struts2中,能夠在JavaBean類中寫公用的返回值爲String類型的方法來響應頁面上的請求,也能夠在此方法中獲取web資源,如:request,application,session,parameters等。 java

1、與Servlet API 解耦的方式

經過ActionContext獲取

步驟: web

1.獲取ActionContext對象

經過ActionContext.getContext()獲取一個ActionContext的實例 apache

2.獲取web資源對應胡Map

此Map類型爲Map<String,Object>。獲取方法: session

application
ActionContext.getApplication()
session
ActionContext.getSession()
parameters
ActionContext.getParameters()
request [特殊]
ActionContext.get("request")

能夠看到除request外,獲取方法都是get...,而對於request,struts2沒有提供對應的get方法,因此使用的是get("request")。緣由以下: app

在視頻裏有對struts2源碼的解釋,大體意思是: this

使用getSession()方法,實際上調用的是Object ActionContext.get(String key),這個key是ActionContext定義好的一個字符串,例如對於session,其值爲: spa

public static final String SESSION = "com.opensymphony.xwork2.ActionContext.session" code

可是對於request,則沒有定義對應的字符串,因此也就沒有提供相應的get方法。獲取session等web資源其實就是獲取ActionContext中對應的Map對象,因此能夠使用Object ActionContextget(String key)方法來獲取request對應的Map對象。也就是說獲取request和獲取session等web資源對應的Map對象,本質上是同樣的。 視頻

這只是我能理解的部分,至於更深層次的struts2源碼機制,雖然源碼就在那裏,可是目前我還看不懂,就先理解到這種程度吧。 對象


3.使用獲取到的Map對象的get()和put()方法獲取或設置屬性值

可是此操做對於parameters資源來講,獲取的是一個String []類型,因此若是有名字相同的parameters,要取得特定的parameters,還須要提供一個下標值,如:


Map<String,Object> parametersMap = actionContext.getParameters();
System.out.println("patameters:"+((String[])parametersMap.get("name"))[0]);


經過實現Aware接口獲取web資源

1.Action類實現session,request,application,parameters對應的Aware接口


public class TestAware implements ApplicationAware,SessionAware,ParameterAware,RequestAware

2.添加session等對應的Map屬性

【其中parameters對應的是:Map<String , String[]>類型,這點要比ActionContext好一點】



private Map<String, Object> application;
private Map<String, Object> request;
private Map<String, String[]> parameters;
private Map<String, Object> session;

3.在各個接口對應的未實現方法中設置相應的屬性的值



public void setApplication(Map<String, Object> application) {
		this.application = application;
	}

	public void setRequest(Map<String, Object> request) {
		this.request = request;
	}

	public void setParameters(Map<String, String[]> parameters) {
		this.parameters = parameters;
	}

	public void setSession(Map<String, Object> session) {
		this.session = session;
	}




4.在execute方法中調用每一個Map的put()和get()方法


public String execute(){
		
		//1.application
		//設置一個屬性
		application.put("applicationKey", "applicationValue");
		//獲取一個屬性
		System.out.println(application.get("date"));
		
		//2.session
		session.put("sessionKey", "sessinoValue");
		
		//3.request
		request.put("requestKey", "requestValue");
		
		//4.parameters
		System.out.println(((String [])parameters.get("name"))[0]);
		
		
		
		return "success";
	}


關於ActionContext和Aware接口的選擇:

若一個 Action 類中有多個 action 方法, 且多個方法都須要使用域對象的 Map 或 parameters, 則建議使用Aware 接口的方式



2、與Servlet API 耦合的方式

使用ServletActionContext


package com.laolang.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

public class TestServletActionContextAction {

	public String execute(){
		
		//經過 ServletActionContext獲取web資源
		HttpServletRequest request = ServletActionContext.getRequest();
//		HttpServletResponse response = ServletActionContext.getResponse();
//		HttpSession session = request.getSession();
		
		//向request中添加一個屬性
		request.setAttribute("ServletActionContext", "ServletActionContext");
		
		return "success";
	}
}



實現ServletXXXAware接口

如RequestAware,ServletResponseAware, ServletContextAware等接口


package com.laolang.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;

public class TestServletAwareAction implements ServletRequestAware,
		ServletResponseAware, ServletContextAware {
	
	public String execute(){
		return "success";
	}

	public void setServletContext(ServletContext context) {
		System.out.println(context);
	}

	public void setServletResponse(HttpServletResponse response) {
		System.out.println(response);
	}

	public void setServletRequest(HttpServletRequest request) {
		System.out.println(request);
	}

}
相關文章
相關標籤/搜索