在上一次筆記中我記錄了,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,這樣更專業。