response物件&重定向 詳解
2018年10月26日16:10:47 於易動
客戶端瀏覽器和伺服器:
請求的時候: request物件: HttpServletRequest
響應的時候: response物件: HttpServletResponse
service(HttpServletRequest request, HttpServletResponse response )
這兩個引數物件,經常成對存在
response物件:
1: 生命週期:
誕生: 伺服器端接收到請求的時候,建立。
銷燬: service方法執行完畢,也就是響應結束, 物件銷燬。
生命週期很短暫,唉~
2: 獲得: 直接使用: tomcat伺服器已經建立好。
3: 作用:
a: 設定響應正文:
b: 設定響應頭資訊:
c: 傳送狀態碼:
d: 重定向:
b: 設定響應頭資訊: 告知瀏覽器, 瀏覽器可以根據響應頭資訊進行解析文件:
response.setHeader("headName","headValue"); 預設頭和頭的值 都是String型別。
setDateHeader(java.lang.String name, long date) 頭是String型別。 頭值Date型別。
getHeader(java.lang.String name) 返回的String型別。
getHeaderNames() 獲得所有頭的名稱:
getHeaders(java.lang.String name) 獲得一個頭對應多個值的情況。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 演示response物件的: 設定響應頭資訊:
* response.setHeader();
*/
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setHeader("content-type", "text/html;charset=gbk");
//常見的: 和頁面重新整理相關:
// response.setHeader("refresh", "5");// 設定頁面5S重新整理一次。
// response.setHeader("refresh", "5;http://www.baidu.com");//5S後 重新整理到百度。
//設定頁面的不快取:
response.setHeader("expires", "-1"); //頁面立刻過期:
response.setHeader("pragma", "no-cache");// 這是http1.0不快取:
response.setHeader("cache-control", "no-cache");
}
}
a: 設定響應正文:
方式一: 使用字元流:
response.getWriter(); PrintWriter;
響應的內容:
(1)可以是字串型別。
(2)可以是html標籤。 瀏覽器能夠自動解析。
方式二: 使用位元組流:
response.getOutputStream(); OutputStream:
注意: response物件 使用字元流或者是位元組流,只能選擇其中的一個。 不能同時使用。
如果同時使用,就會觸發一個異常: IllegalStateException
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* response 物件:設定響應正文:
*
* 方式一: 使用字元流:
* 方式二: 使用位元組流:
*/
public class BServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//使用字元的方式: 設定響應內容:
PrintWriter out = response.getWriter();
out.println("俊哥");
out.println("<br/>");
out.println("<font color='red' size='7'>你很帥</font>");
out.close();
//使用位元組流 設定響應體:
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("俊哥 ,你真的很帥~ oh year".getBytes());
outputStream.close();
}
}
c: 設定響應狀態碼, 和其他的API方法:
sendError(int sc) 傳送一個錯誤的狀態碼;
sendError(int sc,String message); 傳送錯誤的狀態碼,並且帶有描述性的資訊。
setStatus(int code); 給客戶端瀏覽器傳送一個狀態碼。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 設定狀態碼 和其他的API方法:
*/
public class CServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//傳送一個錯誤的狀態碼:
// response.sendError(404,"你訪問的資源,存在的,當時不給看");
response.setStatus(500);
}
}
D:重定向: (重點)面試問題
訪問的是bservlet,位址列會發生變化
特點:
(1)兩次請求 兩次響應。
(2)位址列會發生變化。 最終顯示的是重定向後的地址。
(3)重定向是客戶端的行為:
(4)重定向的地址可以是外部的資源。
(5)負責重定向的servlet 不要向客戶端瀏覽器傳送資料, 可能會引發異常。
使用程式碼實現:
實現方式一:
response.setStatus(302);
response.setHeader("location","URL");
負責重定向的servlet:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 負責重定向的servlet:
*/
public class DServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("這是負責重定向的Dservlet。 ");
//完成重定向:
// response.setStatus(302);
// response.setHeader("location", "/javaEE-06/servlet/EServlet");// EServlet: 屬於本系統內資源。
// response.setHeader("location", "http://www.baidu.com");// 定向到站外的資源。
//使用便捷方法:
response.sendRedirect("EServlet"); // / : 相對於主機: http://locahost:8080
// 沒有使用/開頭: 相對於當前檔案的存在位置: 建議使用/開頭。
}
}
被重定向的servlet:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 被重定向過來的servlet。
*/
public class EServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("我是被重定向過來的EServlet");
}
}
方式二: 完成重定向的便捷方式:
response.sendRedirect("location ");
使用 /開頭 : 其中的location是相對路徑,相對於主機。
沒有使用/ 開頭:是相對於當前檔案的位置