Response概述:
response是Servlet.service方法的一個參數,類型為javax.servlet.http.HttpServletResponse。在客戶端發出每個請求時,服務器都會創建一個response對象,並傳入給Servlet.service()方法。response對象是用來對客戶端進行響應的,這說明在service()方法中使response對象可以完成對客戶端的響應工作。
response對象的功能分為以下四種:
- 設置響應頭信息;
- 發送狀態碼;
> sendError(int sc) --> 發送錯誤狀態碼,例如404、500
> sendError(int sc, String msg) --> 也是發送錯誤狀態碼,還可以帶一個錯誤信息!
> setStatus(int sc) --> 發送成功的狀態碼,可以用來發送302

3. 設置響應正文;
4. 重定向;
具體應用:
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");
}
}
訪問:

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"));

