1. 程式人生 > >Struts2學習(三)Web資源獲取

Struts2學習(三)Web資源獲取

主要介紹獲取Web資源的四種方式

一、使用Struts2Aware攔截器

使用Struts2 Aware攔截器來獲取web資源,首先必須是在Action中進行,然後還得實現ServletRequestAware,ServletResponseAware,ServletContextAware介面來獲取對應的ServletRequestServletResponseServletContext物件。

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方法。不同的是,這裡將ServletRequestServletResponseServletContext物件放置在了一個集合當中,需要使用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中的資料就行。