Request和Response。

複習點:一、重定向問題  二、輸出字符串到瀏覽器。三、文件下載需求:1. 頁面顯示超連接2. 點擊超連接後彈出下載提示框3. 完成圖片文件下載html

Request和Response程序員

Request:web

一、request和response原理:apache

  一、瀏覽器向服務器發送請求,tomcat服務器會根據請求url中的資源路徑建立對應的ServletDemo類的對象。瀏覽器

  二、tomcat會建立request和response對象,並將請求消息數據封裝到request對象緩存

  三、tomcat調用service方法,並傳遞request和response兩個對象做爲參數。tomcat

  四、程序員能夠經過request對象獲取請求消息數據,和經過response對象設置響應消息數據。服務器

  五、服務器從response對象中拿出響應數據並反饋給瀏覽器。工具

二、request對象繼承體系結構:post

  ServletRequest 接口 <---  HttpServletRequest 接口 <--- org.apache.catalina.connector.RequestFacade 類 (tomcat實現的)

三、request功能

  一、獲取請求消息數據。

    一、獲取請求行數據經常使用的方法:

      *獲取虛擬目錄:String getContextPath()

      *獲取請求URI:String getRequestURI(), URL:StringBuffer getRequestURL()

    二、獲取請求頭數據:

      * String getHeader(String name):經過請求頭的名稱獲取其值。

    二、獲取請求體數據:

      * 請求體只有POST請求方式纔有,在請求體中封裝了POST請求的請求參數。

      * 步驟:一、獲取流對象:

            *獲取字符輸入流:BufferedReader getReader()

            * 獲取字節輸入流:ServletInputStream getInputStream()

          二、從流對象中獲取數據。

  二、request其餘功能:

    一、獲取請求參數的通用方式(get/post均可以):

      * String getParameter(String name):根據參數名稱獲取其值。

      * String[ ] getParameterValues(String name):根據參數名稱獲取其值的數據(複選框)

      * Enumeration<String> getParameterName():獲取全部請求參數名稱。

      * Map<String,String[ ] > getParameterMap():獲取全部參數的map集合。

      *中文亂問題:get方式:tomcat8自動解決。post方式:獲取參數前,設置編碼 request.setCharacterEncoding("utf-8");

    二、請求轉發:一種在服務器內部的資源跳轉方式。

      *步驟:一、經過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)

          二、使用RequestDispatcher對象來轉發:forward(ServletRequest request,ServletResponse response)

      *特色:一、瀏覽器地址欄不發生變化就訪問了多個資源。

            二、只能轉發到當前服務器的內部資源。

          三、轉發使用的是一次請求。

    三、共享數據:

      * 域對象:一個有做用範圍的對象,能夠在範圍內共享數據。

      *request 域:表明一次請求的範圍,通常用於請求轉發的多個資源中共享數據。

      * 方法:void setAttribute(String name,Object obj)存儲資源。

           Object getAttribute(String name) :經過鍵獲取值。

          void removeAttribute(String name) 經過鍵 移除鍵值對。

    四、獲取ServletContext:

      *ServletContext getServletContext();

Response:

一、響應消息:

數據格式:

  一、響應行:組成:協議/版本 響應狀態碼 狀態碼描述 HTTP/1.1 200 OK

    * 狀態碼都是三位數的,分類:

      一、1XX:服務器接收了客戶端消息,可是沒接收完成,發送1xx詢問是否還要發送。

      二、2xx:成功。表明:200.

      三、3xx:重定向。表明:302(重定向),A資源沒法解決請求數據的問題,但A知道B能解決,返回302,讓客戶端訪問B。 304(訪問緩存),服務器發現請求的數據在你客戶端有,返回304讓客戶端在本地找。

      四、4xx:客戶端錯誤。表明:404(請求路徑沒有對應資源)405(請求方式沒有對應的doXX方法)

      五、5xx:服務端錯誤。表明:500(服務器內部錯誤)

    * 

  二、響應頭:格式:頭名稱:值

    * 常見的響應頭:一、Content-Type:告訴客戶端本此響應體數據格式和編碼格式。

            二、Content-disposition:告訴客戶端用什麼格式打開響應體數據。

              值:in-line:默認,在當前頁面打開。

                attachment;filename=xxx :以附件形式打開響應體。用來文件下載。

 

  三、響應空行:

  四、響應體:傳輸的數據。

二、Response功能。

一、設置響應消息。

  * 設置響應行:設置狀態碼:setStatus(int sc)

  *設置響應頭:setHeader(String name ,String value)

  *設置響應體:使用輸出流。

    一、獲取輸出流:字符:PrintWriter getWriter() 字節:ServletOuntputStream getOutputStream()

案例:

  一、完成重定向:資源跳轉的方式。response.sendRedirect(跳轉路徑)

   * 轉發的特色:

    一、地址欄路徑不變。二、轉發只能訪問當前服務器下的資源。三、轉發是一次請求,可共享數據。

  *重定向的特色:

    一、地址欄路徑改變。二、能夠訪問其餘服務器的資源。三、重定向是兩次請求,不能共享數據。

  二、路徑的一些問題。

  項目中正確使用相對/絕對路徑,使用虛擬目錄時,建議動態獲取虛擬目錄:request.getContextPath()

  三、服務器輸出字符數據到瀏覽器:

    一、解決亂碼問題:response.setContentType("text/html;charset=utf-8");

    二、獲取字符輸出流 PrintWriter getWriter()。而後使用wite()輸出。

  四、服務器輸出字節數據到瀏覽器:response.getOutputStream()

  五、驗證碼。

ServletContext對象:

一、概念:表明整個web應用,能夠和程序的容器(服務器)來通訊。

二、獲取:  

  * 經過request來獲取  :request.getServletContext()

  * 經過HttpServlet來獲取:this.getServletContext()

三、功能:

  *獲取MIME類型。

    MIME類型:在互聯網通訊過程當中定義的一種文件數據類型。格式:大類型/小類型  text/html

    獲取:String getMimeType(String file) 

  *域對象:共享數據。setAttribute()

  *獲取文件的真實(服務器)路徑 String getRealPath(String path)

案例:文件下載。

文件下載需求: 1. 頁面顯示超連接2. 點擊超連接後彈出下載提示框3. 完成圖片文件下載

@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       String filename=request.getParameter("filename");
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/img/" + filename);
        FileInputStream fis=new FileInputStream(realPath);

        String mimeType = servletContext.getMimeType(filename);
        response.setHeader("content-type",mimeType);
        response.setHeader("content-disposition","attachment;filename="+filename);

        ServletOutputStream sos=response.getOutputStream();
        byte[] buff=new byte[1024];
        int len=0;
        while ((len=fis.read(buff))!=-1){
            sos.write(buff,0,len);
        }
        fis.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request,response);
    }
}

中文文件問題:

解決思路:獲取客戶端使用的瀏覽器版本信息,而後根據不一樣的版本信息設置filename的編碼。

使用工具類方便操做。

相關文章
相關標籤/搜索