JavaWeb學習總結(六)—HttpServletResponse

Response概述:

  response是Servlet.service方法的一個參數,類型爲javax.servlet.http.HttpServletResponse。在客戶端發出每一個請求時,服務器都會建立一個response對象,並傳入給Servlet.service()方法。response對象是用來對客戶端進行響應的,這說明在service()方法中使response對象能夠完成對客戶端的響應工做。html

response對象的功能分爲如下四種:

  1. 設置響應頭信息;

  2. 發送狀態碼;

    > sendError(int sc) --> 發送錯誤狀態碼,例如40四、500
    > sendError(int sc, String msg) --> 也是發送錯誤狀態碼,還能夠帶一個錯誤信息!
    > setStatus(int sc) --> 發送成功的狀態碼,能夠用來發送302java

     3. 設置響應正文;web

     4. 重定向;apache

具體應用:

1.重定向

複製代碼
package zy.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Aservlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /*
         * 設置location響應頭 ,實現請求重定向
         */
        //response.setHeader("Location","/JavaWeb/Bservlet");
        //設置服務器的響應狀態碼
        //response.setStatus(302);
        
        //快捷的重定向方式
     //response.sendRedirect(""http://www.baidu.com""); response.sendRedirect("/JavaWeb/Bservlet");
     } }
複製代碼

 

抓包能夠看見:數組

 

  服務器返回一個302狀態碼告訴瀏覽器,你要的資源我沒有,可是我經過Location響應頭告訴你哪裏有,而瀏覽器解析響應頭Location後知道要跳轉到/JavaWeb/Bservlet頁面,因此就會自動跳轉到Bservlet。瀏覽器

 

2.設置refresh響應頭,讓瀏覽器定時刷新

複製代碼
package zy.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
 * 設置location響應頭 ,實現請求重定向
 */
public class Cservlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("5s中後將跳轉到百度主頁");
        /*
         * 設置refresh響應頭,讓瀏覽器每隔3秒定時刷新
         * response.setHeader("refresh", "3");
         */
        
        //設置refresh響應頭,讓瀏覽器3秒後跳轉到http://www.baidu.com
        response.setHeader("Refresh","5;URL=http://www.baidu.com");    
        /*
         * 5秒跳轉到Csevlet
        response.setHeader("Refresh","5;URL=/JavaWeb/Cservlet");
        */
    }
}
複製代碼

訪問Cservlet,5秒將會跳轉緩存

 

 

3.禁用瀏覽器緩存

   開發項目的時候瀏覽器的緩存會很討厭,這時咱們能夠禁用它,能夠參考indexjsp.服務器

複製代碼
package zy.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
 * 禁用瀏覽器緩存
 */
public class Dservlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /*
         * 這三個響應頭的設置能夠禁用全部瀏覽器的緩存
         */
        response.setHeader("cache-control","no-cache");
        response.setHeader("pragma","no-cache");
        response.setDateHeader("expires",-1);
        
        response.getWriter().print("hello world");

    }
}
複製代碼

訪問:jsp

 

4.設置頁面緩存

 對於不常常變化的數據,在servlet中能夠爲其設置合理的緩存時間值,以免瀏覽器頻繁向服務器發送請求,提高服務器的性能。例如:工具

複製代碼
package zy.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Eservlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String data = "helloworld";
        /**
         * 設置數據合理的緩存時間值,以免瀏覽器頻繁向服務器發送請求,提高服務器的性能
         * 這裏是將數據的緩存時間設置爲1天
         */
        response.setDateHeader("expires",System.currentTimeMillis() + 24 * 3600 * 1000);
        response.getOutputStream().write(data.getBytes());
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        this.doGet(request, response);
    }

}
複製代碼

訪問頁面,並查看響應頭:

 

有8個小時的時差。

另外也能夠在「C:\Users\zydev\AppData\Local\Microsoft\Windows\Temporary Internet Files」找到該文件,注意要打開隱藏文件夾選項纔看得見。

 

Response的響應正文

response是響應對象,向客戶端輸出響應正文(響應體)可使用response的響應流,repsonse一共提供了兩個響應流對象:

1. PrintWriter out = response.getWriter():獲取字符流;

2. ServletOutputStream out = response.getOutputStream():獲取字節流

OutputStream流是字節流,能夠處理任意類型的數據,而PrintWriter流是字符流,只能處理字符數據,若是用字符流處理字節數據,會致使數據丟失。

 

A. 相應圖片字節流

 

複製代碼
package zy.servlet;

import java.io.FileInputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
/*
 * 演示響應字節數據
 */
public class Fservlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String path = "D:/demo.jpg";
        FileInputStream in = new FileInputStream(path);
        //讀取輸入流的字節到字節數組中,IOUtis是Apache提供的一個工具jar包
        byte[] bytes = IOUtils.toByteArray(in);
        response.getOutputStream().write(bytes);
    }

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

}
複製代碼

訪問結果:

 

B. 下載圖片

複製代碼
package com.web.study;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 文件下載
 */
public class Bresponse extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        downloadFileByOutputStream(response);//下載文件,經過OutputStream流
    }

    /**
     * 下載文件,經過OutputStream流
     * @param response
     * @throws FileNotFoundException
     * @throws IOException
     */
    private void downloadFileByOutputStream(HttpServletResponse response)
            throws FileNotFoundException, IOException {
        //1.獲取要下載的文件的絕對路徑
        String realPath = this.getServletContext().getRealPath("/download/demo.jpg");
        //2.獲取要下載的文件名
        String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
        //3.設置content-disposition響應頭控制瀏覽器如下載的形式打開文件
        response.setHeader("content-disposition", "attachment;filename="+fileName);
        //4.獲取要下載的文件輸入流
        InputStream in = new FileInputStream(realPath);
        int len = 0;
        //5.建立數據緩衝區
        byte[] buffer = new byte[1024];
        //6.經過response對象獲取OutputStream流
        OutputStream out = response.getOutputStream();
        //7.將FileInputStream流寫入到buffer緩衝區
        while ((len = in.read(buffer)) > 0) {
        //8.使用OutputStream將緩衝區的數據輸出到客戶端瀏覽器
            out.write(buffer,0,len);
        }
        in.close();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
複製代碼

訪問:

若是文件名是中文的:設置content-disposition響應頭控制瀏覽器如下載的形式打開文件,中文文件名要使用URLEncoder.encode方法進行編碼,不然會出現文件名亂碼

 response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));
相關文章
相關標籤/搜索