struts2學習(11)——action訪問ServletAPI

在上一次筆記中我記錄了,action來獲取前臺頁面發送過來的params。

有兩種方法 ,第一種是在action中定義所有我們需要使用到的屬性,給它們增加get/set方法,當請求到達的時候,struts2的攔截器就會自動將這個屬性的value賦到param上。

第二種方法是使用複合式的方式。例如我們的前臺經常會傳來用戶的信息,那麼我們就可以先定義一個類——user,將所有的user屬性添加ok後,在action中定義user,添加get/set方法,前臺使用user.name的方式來傳遞。


今天我要記錄的是:action中我們來訪問servletAPI,所有用過jsp,servlet的人肯定對application,session,request,response,cookie,pageContex,servletContext等非常熟悉,那麼在action中我們怎麼才能訪問這些ServletAPI呢?

struts2爲我們提供一個ActionContext類,因爲struts2爲了避免與servlet的耦合,所以它認爲直接調用servletAPI是一種不安全的方法,提供ActionContext類,我們通過這個類就可以訪問servletAPI了。

public class ServletapiAction {
	public String execute(){
		ActionContext act = ActionContext.getContext();
		Map<String, Object> application = act.getApplication();
		Map<String, Object> session = act.getSession();
		act.put("request", "request");
		application.put("application", "application");
		session.put("session", "session");
		
		return "success";
	}
}
從這裏我們可以看到ActionContext的getContext是爲了獲取系統的ActionContext實例

之後我們使用getApplication,getSession ,  方法來獲取application和session,當然細心的看我們發現方法的返回值並不是HttpServletContext等,而是一個Map,所以理所當然getAttribute和setAttribute方法變成了get和put方法。


當我們直接用act的get和put方法時,就相當於調用request的方法。


success頁面我們就可以:

<body>
	application:${applicationScope.application }<br/>
	session:${sessionScope.session }<br/>
	request:${requestScope.request }
</body>

獲取值。


從這裏其實我們可以看出一些端倪,這裏的返回值是一個Map類型,他並不是request等,所以request的一些方法,他是無法使用的,那麼是否有辦法真正的使用到ServletAPI呢,當然。

struts爲我們準備了ServletActionContext類,通過這個類我們就可以得到真正的HttpServletRequest。

public String otherFunction(){
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpSession session = request.getSession();
		HttpServletResponse response = ServletActionContext.getResponse();
		ServletContext application = ServletActionContext.getServletContext();
		
		return "success";
	}
之後就和我們的servlet中的用法相同了。
當然還有其他的辦法,當時上面這種事使用最多的,所以其他就暫時記錄了。


當然我們這裏要注意,爲什麼struts既要支持ActionContext類又要支持ServletActionContext類,一個ServletActionContext不就搞定了嗎?

其實不然,上面也說了避免耦合。當我們只是爲了在servlet的這幾個範圍中放入我們要放入的值時,建議使用ActionContext,這樣更專業。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章