Response對象
一、Response對象功能
功能:設置響應消息
1. 設置響應行
行格式:HTTP/1.1 200 ok
2. 設置狀態碼:setStatus(int sc)
response.setStatus(302);
3. 設置響應頭:
setHeader(String name, String value)
response.setHeader("location","/Servlet/SetServletDome1");
4.重定向便捷方法
response.sendRedirect("/Servlet/SetServletDome1");
5.request轉發
request.getRequestDispatcher("/SetServletDome1").forward(request,response);
response.setContentType("text/html;charset=utf-8")
response.getWriter().write("request");
6.重定向 與 轉發總結
重定向的特點
:redirect
1. 地址欄發生變化(會變化)
2. 重定向可以訪問其他站點(服務器)的資源
3. 重定向是兩次請求。不能使用request對象來共享數據
轉發的特點
:forward
1. 轉發地址欄路徑不變
2. 轉發只能訪問當前服務器下的資源
3. 轉發是一次請求,可以使用request對象來共享數據
7.相對路徑 與 絕對路徑
路徑寫法:
- 相對路徑:通過相對路徑不可以確定唯一資源
如:./index.html
不以/開頭,以.開頭路徑
規則:找到當前資源和目標資源之間的相對位置關係
./:當前目錄
../:後退一級目錄
- 絕對路徑:通過絕對路徑可以確定唯一資源
如:http://localhost/day15/responseDemo2 /day15/responseDemo2
以/開頭的路徑
規則:判斷定義的路徑是給誰用的?判斷請求將來從哪兒發出 給客戶端瀏覽器使用:需要加虛擬目錄(項目的訪問路徑),給服務器使用:不需要加虛擬目錄
8.虛擬目錄
當虛擬目錄需要改變時,其項目就需要改代碼中的虛擬目錄實在太麻煩所以建議虛擬目錄動態獲取:
request.getContextPath()
//虛擬目錄
String contextPath = request.getContextPath();
//2.重定向
response.sendRedirect(contextPath+"/SetServletDome1");
示例代碼:
package ReSponse;
....
@WebServlet("/SetServletDome")
public class SetServletDome extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.重定向:資源SetServletDome跳轉SetServletDome1的方式
System.out.println("dome.....................");
// 設置狀態碼爲302
response.setStatus(302);
//設置響應頭location
response.setHeader("location","/Servlet/SetServletDome1");
//虛擬目錄
String contextPath = request.getContextPath();
//2.重定向
//response.sendRedirect("/Servlet/SetServletDome1");
response.sendRedirect(contextPath+"/SetServletDome1");
//轉發
request.getRequestDispatcher("/SetServletDome1").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
package ReSponse;
@WebServlet("/SetServletDome1")
public class SetServletDome1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("dome1...................");
//轉發
//頁面編碼
//response.setContentType("text/html;charset=utf-8");
//response.getWriter().write("request");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
二、服務器輸出字符數據到瀏覽器
- 獲取字符輸出流
- 輸出數據
字符輸出流:PrintWriter getWriter()
response.getWriter().write("你好啊");
亂碼問題:
1. PrintWriter pw = response.getWriter();獲取的流的默認編碼是ISO-8859-1
2. 設置該流的默認編碼
3. 告訴瀏覽器響應體使用的編碼
//設置編碼,是在獲取流之前設置
//response.setHeader("content-type","text/html;charset=utf-8");
//設置編碼
//response.setCharacterEncoding("utf-8");
//簡單的形式,設置編碼,是在獲取流之前設置
response.setContentType("text/html;charset=utf-8"); 推薦使用這個
代碼案例:
package ReSponse;
@WebServlet("/SetServletDome2")
public class SetServletDome2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//頁面編碼
response.setContentType("text/html;charset=utf-8");
//設置編碼,是在獲取流之前設置
//response.setHeader("content-type","text/html;charset=utf-8");
//設置編碼
//response.setCharacterEncoding("utf-8");
response.getWriter().write("你好啊");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
三、服務器輸出字節數據到瀏覽器
使用步驟:
- 獲取字符輸出流
- 輸出數據
字節輸出流:ServletOutputStream getOutputStream()
//告訴瀏覽器編碼格式
response.setContentType("text/html;charset=utf-8");
//字節輸出流
ServletOutputStream outputStream = response.getOutputStream();
//輸出數據
outputStream.write("hello".getBytes("utf-8"));
代碼案例:
package ReSponse;
@WebServlet("/SetServletDome3")
public class SetServletDome3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//告訴瀏覽器編碼格式
response.setContentType("text/html;charset=utf-8");
//字節輸出流
ServletOutputStream outputStream = response.getOutputStream();
//輸出數據
outputStream.write("hello".getBytes("utf-8"));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}