目錄
1.HttpServletResponse 類的作用
HttpServletResponse 類和 HttpServletRequest 類一樣。每次請求進來,Tomcat 服務器都會創建一個 Response 對象傳遞給 Servlet 程序去使用。HttpServletRequest 表示請求過來的信息,HttpServletResponse 表示所有響應的信息,我們如果需要設置返回給客戶端的信息,都可以通過 HttpServletResponse 對象來進行設置
2.兩個輸出流的說明。
字節流 getOutputStream(); 常用於下載(傳遞二進制數據)
字符流 getWriter(); 常用於回傳字符串(常用)
兩個流同時只能使用一個,使用了字節流,就不能再使用字符流,反之亦然,否則就會報錯。
錯誤代碼示例:
public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter();
resp.getOutputStream();
}
}
結果截圖:
3.如何往客戶端回傳數據
代碼示例:
往客戶端回傳字符串數據
public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write("response's content!!!");
}
}
結果截圖:
4.響應的亂碼解決
服務器默認字符集爲 ISO-8859-1 ,所以回傳中文會出亂碼,解決方法如下:
解決響應中文亂碼方案一(不推薦使用):
// 設置服務器字符集爲 UTF-8
resp.setCharacterEncoding("UTF-8");
// 通過響應頭,設置瀏覽器也使用 UTF-8 字符集
resp.setHeader("Content-Type", "text/html; charset=UTF-8");
解決響應中文亂碼方案二(推薦):
// 它會同時設置服務器和客戶端都使用 UTF-8 字符集,還設置了響應頭
// 此方法一定要在獲取流對象之前調用纔有效
resp.setContentType("text/html; charset=UTF-8");
5.請求重定向
請求重定向,是指客戶端給服務器發請求,然後服務器告訴客戶端說。我給你一些地址。你去新地址訪問。叫請求重定向(因爲之前的地址可能已經被廢棄)。
代碼示例:
web.xml
<servlet>
<servlet-name>Response1</servlet-name>
<servlet-class>com.study.servlet.Response1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Response1</servlet-name>
<url-pattern>/response1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Response2</servlet-name>
<servlet-class>com.study.servlet.Response2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Response2</servlet-name>
<url-pattern>/response2</url-pattern>
</servlet-mapping>
Response1.java
第一種方案:
public class Response1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("-------Response1------");
//設置響應狀態碼 302 表示重定向
resp.setStatus(302);
//設置響應頭,說明新地址
resp.setHeader("Location","http://localhost:8080/07_Servlet/response2");
}
}
第二種方案(推薦使用)
public class Response1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("-------Response1------");
resp.sendRedirect("http://localhost:8080/07_Servlet/response2");
}
}
Response2.java
public class Response2 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("response2's result!");
}
}
結果截圖: