Struts2學習(三)Web資源獲取
主要介紹獲取Web資源的四種方式
一、使用Struts2Aware攔截器
使用Struts2 Aware攔截器來獲取web資源,首先必須是在Action中進行,然後還得實現ServletRequestAware,ServletResponseAware,ServletContextAware介面來獲取對應的ServletRequest、ServletResponse、ServletContext物件。
package cn.lovepi.chapter03.action; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import org.apache.struts2.util.ServletContextAware; import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Created by icarus on 2016/7/9. * 使用Struts2 aware攔截器獲取web資源 * 首先這是一個action * 然後得實現對應的介面來獲取對應的web類 */ public class FirstAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{ // 設定類中的對應的request和response物件和context物件 private ServletRequest request; private ServletResponse response; private ServletContext context; /** * action執行方法 * @return * @throws Exception */ @Override public String execute() throws Exception { String username=request.getParameter("username"); System.out.println("第一種攔截器獲取資源:"+username); return "success"; } /** * 設定傳遞到action中的ServletRequest * @param httpServletRequest */ @Override public void setServletRequest(HttpServletRequest httpServletRequest) { request=httpServletRequest; } /** * 設定傳遞到action中的ServletResponse * @param httpServletResponse */ @Override public void setServletResponse(HttpServletResponse httpServletResponse) { response=httpServletResponse; } /** * 設定傳遞到action中的ServletContext,即application * @param servletContext */ @Override public void setServletContext(ServletContext servletContext) { context=servletContext; } }
二、使用Struts2RequestAware攔截器
接下來使用RequestAware攔截器來獲取web資源,只要實現RequestAware介面就可以了,然後實現其中的setRequest方法。不同的是,這裡將ServletRequest、ServletResponse、ServletContext物件放置在了一個集合當中,需要使用Struts2當中的key值來獲取對應的物件。
package cn.lovepi.chapter03.action; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.StrutsStatics; import org.apache.struts2.interceptor.RequestAware; import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.util.Map; /** * Created by icarus on 2016/7/9. * 使用RequestAware攔截器獲取web資源 * 需要實現RequestAware介面 */ public class SecondAction extends ActionSupport implements RequestAware{ private ServletResponse response; private ServletRequest request; private ServletContext context; /** * 對應action方法 * @return * @throws Exception */ @Override public String execute() throws Exception { String username=request.getParameter("username"); System.out.println("第二種方法獲取web資源:"+username); return "success"; } /** * 獲取對應的web資源,使用map集合方式 * 即鍵值對獲取 * @param map */ @Override public void setRequest(Map<String, Object> map) { request= (ServletRequest) map.get(StrutsStatics.HTTP_REQUEST); response= (ServletResponse) map.get(StrutsStatics.HTTP_RESPONSE); context= (ServletContext) map.get(StrutsStatics.SERVLET_CONTEXT); } }
三、使用Struts2內建靜態物件ActionContext
這種方式來獲取web資源並不需要實現任何的介面
package cn.lovepi.chapter03.action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.ServletActionContext; import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * Created by icarus on 2016/7/9. * Struts2獲取web資源物件第三種方法 * 使用Struts2內建靜態物件ActionContext * 使用這種方式不需要實現任何的介面 * ----------------------------------- * 注:HttpServlet只是Servlet的子類 */ public class ThirdAction extends ActionSupport{ @Override public String execute() throws Exception { ActionContext ac=ActionContext.getContext(); ServletRequest request= (ServletRequest) ac.get(ServletActionContext.HTTP_REQUEST); ServletContext context= (ServletContext) ac.get(ServletActionContext.SERVLET_CONTEXT); ServletResponse response= (ServletResponse) ac.get(ServletActionContext.HTTP_RESPONSE); String username=request.getParameter("username"); System.out.println("第三種方式:"+username); return "success"; } }
四、使用Struts2內建靜態物件ServletActionContext
這是最簡單最多使用的方法
package cn.lovepi.chapter03.action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
/**
* Created by icarus on 2016/7/9.
* Struts2獲取web資源的第四種方式
* 使用Struts2內建物件ServletActionContext
* 這是四種方法中最好的方式
* 不需要實現任何介面,也可以按照需求獲取所需的物件
*/
public class FourthAction extends ActionSupport{
@Override
public String execute() throws Exception {
ServletRequest request= ServletActionContext.getRequest();
ServletResponse response=ServletActionContext.getResponse();
ServletContext context=ServletActionContext.getServletContext();
String username=request.getParameter("username");
System.out.println("第四種方式:"+username);
return "success";
}
}
總結:
通過四種方法都可以獲取到對應的web資源,但是使用Aware攔截器需要實現對應的接口才可以獲取到對應的資源,而使用RequestAware則只需實現一個介面便可以獲取到所有的web資源物件。對於使用Struts2內建的靜態物件來獲取Web資源來說並不需要實現任何的介面,相比較與前兩種使用攔截器的方式來說,使用內建靜態物件的方式更值得推薦。而在後兩種方式中:使用內建物件ActionContext返回的是一個map集合,得需要使用對應的key來獲取所需的資源物件。而ServletActionContext則可以根據不同的方法直接獲取對應的web資源物件。
雖然使用內建物件ServletActionContext的方式來獲取Web資源是最好的方式,值得推薦。但是,我們也得了解前三種獲取web資源的方式,因為在某些專案中可能會遇到別人使用前三種方式來獲取web資源。但在日常的開發中我們必須得熟練掌握第四種獲取web資源的方式,即ServletActionContext方式。
補充說明:
ServletContext,也就是Application,伺服器物件,只要伺服器不關閉,這個物件就永遠存在。該資訊是儲存與伺服器中的,一般資料我們是嚴禁儲存到application物件中去的,因為這樣很容易導致伺服器記憶體溢位,程式崩潰。
他的實際應用場景是:在駕校考試系統中,使用者只需要註冊就可以免費答題,使用者量龐大。而在頁面中每次只出現一道題,答完之後顯示下一道。假如我們每次的資料處理如下圖所示:
如上圖所示,我們在這裡使用到了Application物件來儲存對應的題目資訊,這樣省去了我們每次都去資料庫中獲取下一道題目的步驟。在這種情況下,系統一啟動就從資料庫中獲取全部的題目資訊儲存到Application物件中去,然後使用者只需訪問ServletContext就好,然後直接在介面中顯示對應的Application中的資料就行。