HttpServletResponse


layout: post
title: HttpServletResponse
subtitle: 用法
date: 2018-04-16
author: ZL
header-img: img/20180416.jpg
catalog: true
tags:
- Response
- web文件下載


HttpServletResponse

所有的doget和dopost方法都會(huì)有request和response參數(shù)。

response和request

流程

瀏覽器的請(qǐng)求進(jìn)過(guò)tomcat內(nèi)部處理,被封裝成一個(gè)request參數(shù),放到了doget和dopost里面。
而response需要用戶在doget或者dopost的代碼里面為response添加內(nèi)容,然后tomcat內(nèi)部將這些內(nèi)容封裝好返回給瀏覽器。

原理性內(nèi)容不看也罷

image

因?yàn)閞esponse代表響應(yīng),所以我們可以通過(guò)該對(duì)象分別設(shè)置Http響應(yīng)的響應(yīng)行,響 應(yīng)頭和響應(yīng)體

response的一些API

  • 設(shè)置響應(yīng)行的狀態(tài)碼
    setStatus(int sc)

  • 通過(guò)response設(shè)置響應(yīng)頭
    addHeader(String name, String value)
    addIntHeader(String name, int value)
    addDateHeader(String name, long date)
    setHeader(String name, String value)
    setDateHeader(String name, long date)
    setIntHeader(String name, int value)
    add表示添加,而set表示設(shè)置

    這個(gè)頭的條目除了它自帶的比如Content-Length,自己也可以隨便加比如addHeader(“name”, “zhangsan”),addHeader(“age”, “12”)等等
    add表示添加,比如addHeader(“name”, “zhangsan”),addHeader(“name”, “l(fā)isi”),這樣得到的response里面的name既有zhangsan也有l(wèi)isi。而set表示修改,會(huì)把之前的內(nèi)容覆蓋而不是共存。

  • 設(shè)置響應(yīng)體
    getWriter、getOutputStream()

    這兩個(gè)方法不能同時(shí)調(diào)用,否則會(huì)報(bào)錯(cuò)

  • 設(shè)置本地response編碼
    response.setCharacterEncoding("UTF-8");

  • 告訴瀏覽器使用何種編碼解析
    //通過(guò)一個(gè)頭 Content-Type 告知客戶端使用何種碼表
    response.setHeader("Content-Type", "text/html;charset=UTF-8");

  • 上面兩句代碼的結(jié)合(既設(shè)置response的編碼格式,又可以告知瀏覽器解析格式,所以通常不用上面兩句代碼,而是用這一句)
    response.setContentType("text/html;charset=UTF-8");

  • 重定向

    • 方式一:

      //告知客戶端去重定向到servlet2
          //1、設(shè)置狀態(tài)碼302
          response.setStatus(302);
          //2、設(shè)置響應(yīng)頭Location
          response.setHeader("Location", "/WEB14/servlet2");
      
    • 方式二:

      //封裝成一個(gè)重定向的方法sendRedirect(url)
      response.sendRedirect("/WEB14/servlet2");
      
  • 定時(shí)刷新(延時(shí)重定向)
    //設(shè)置定時(shí)刷新的頭(5秒后跳轉(zhuǎn)百度)
    response.setHeader("refresh", "5;url=http://www.baidu.com");

下載文件的例子

  1. 下載名稱沒(méi)有中文的文件

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            //獲得要下載的文件的名稱
            String filename = request.getParameter("filename");//a.flv
    
            //要下載的這個(gè)文件的類型-----客戶端通過(guò)文件的MIME類型去區(qū)分類型
            response.setContentType(this.getServletContext().getMimeType(filename));
            //告訴客戶端該文件不是直接解析 而是以附件形式打開(kāi)(下載)
            response.setHeader("Content-Disposition", "attachment;filename="+filename);
    
            //獲取文件的絕對(duì)路徑
            String path = this.getServletContext().getRealPath("download/"+filename);
            //獲得該文件的輸入流
            InputStream in = new FileInputStream(path);
            //獲得輸出流---通過(guò)response獲得的輸出流 用于向客戶端寫(xiě)內(nèi)容
            ServletOutputStream out = response.getOutputStream();
            //文件拷貝的模板代碼
            int len = 0;
            byte[] buffer = new byte[1024];
            while((len=in.read(buffer))>0){
                out.write(buffer, 0, len);
            }
    
            in.close();
            //out.close();
    
        }
    
  2. 下載包含中文名稱的文件

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    
      //*******文件名稱是中文的下載*******
    
    
      //獲得要下載的文件的名稱
      String filename = request.getParameter("filename");//????.jpg
      //解決獲得中文參數(shù)的亂碼
      filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");//美女.jpg
    
      
      //獲得請(qǐng)求頭中的User-Agent
      String agent = request.getHeader("User-Agent");
      //根據(jù)不同瀏覽器進(jìn)行不同的編碼
      String filenameEncoder = "";
      if (agent.contains("MSIE")) {
        // IE瀏覽器
        filenameEncoder = URLEncoder.encode(filename, "utf-8");
        filenameEncoder = filenameEncoder.replace("+", " ");
      } else if (agent.contains("Firefox")) {
        // 火狐瀏覽器
        BASE64Encoder base64Encoder = new BASE64Encoder();
        filenameEncoder = "=?utf-8?B?"
            + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
      } else {
        // 其它瀏覽器
        filenameEncoder = URLEncoder.encode(filename, "utf-8");             
      }
    
    
    
      //要下載的這個(gè)文件的類型-----客戶端通過(guò)文件的MIME類型去區(qū)分類型
      response.setContentType(this.getServletContext().getMimeType(filename));
      //告訴客戶端該文件不是直接解析 而是以附件形式打開(kāi)(下載)----filename="+filename 客戶端默認(rèn)對(duì)名字進(jìn)行解碼
      response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);
    
      //獲取文件的絕對(duì)路徑
      String path = this.getServletContext().getRealPath("download/"+filename);
      //獲得該文件的輸入流
      InputStream in = new FileInputStream(path);
      //獲得輸出流---通過(guò)response獲得的輸出流 用于向客戶端寫(xiě)內(nèi)容
      ServletOutputStream out = response.getOutputStream();
      //文件拷貝的模板代碼
      int len = 0;
      byte[] buffer = new byte[1024];
      while((len=in.read(buffer))>0){
        out.write(buffer, 0, len);
      }
    
      in.close();
      //out.close();
    
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容