Java Web程序設計——請求和響應(一)
思維導圖:
請求和響應的概述
- 請求:在瀏覽器地址欄輸入地址,點擊回車請求服務器,這個過程就是一個請求過程。
- 響應:服務器根據瀏覽器發送請求,返回數據到瀏覽器在網頁上進行顯示,這個過程就稱爲響應。
瀏覽器訪問Servlet的交互過程:
HttpServletResponse對象
- 在HttpServletResponse接口中定義了向客戶端發送響應狀態碼、響應消息頭、響應消息體的方法。它的父接口是ServletResponse,在開發中通常使用HttpServletResponse。
發送狀態碼相關發方法
- setStatus(int status)方法:用於設置HTTP響應消息的狀態碼,並生成響應狀態行。
- sendError(int sc)方法:用於發送表示錯誤的狀態碼。
- sendError(int sc,String sm):第一個參數表示狀態碼,第二個參數是狀態碼的描述。
注:正常情況下,Web服務器會默認產生一個狀態碼爲200的狀態行。302:重定向;404:請求資源找不到;500:服務器代碼出現異常
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 響應行相關的方法
response.sendError(404,"請求資源不存在");
}
發送響應消息頭相關方法
- 設置響應消息頭字段的方法:數據格式:key-value,有的是一個key,一個value,有的是一個key,多個value
- setHeader(String key,String value):一個key,一個value
比如:setHeader(“aa”,“AA”); setHeader(“aa”,“BB”); 最終結果:aa這個頭對應的值就是BB - addHeader(String key,String value):一個key,對應多個value
比如:addHeader(“aa”,“AA”);addHeader(“aa”,“BB”);最終結果:aa這個頭對應的值就是AA和BB
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 響應消息頭相關的方法
// 在用戶名和密碼輸入錯誤的情況下,重新回到登錄頁面讓用戶重新輸入數據
// 1.設置狀態碼
response.setStatus(302);
// 2.設置響應頭,完成重定向到登錄頁面
response.setHeader("Location", "/chapter/login.html");
}
2. 設置響應數據的長度
- setContentLength(int src)
- 設置處理亂碼的方法:
- setCharacterEncoding(String a):參數就一個碼錶格式
比如:“utf-8” - setContentType(String a):參數代表響應數據的類型和碼錶格式
比如:“text/html;charset=utf-8”
發送響應消息頭相關的方法
- getOutputStream():通過respon向瀏覽器返回圖片、視頻等二進制數據的文件,當然也可以向瀏覽器返回文本數據
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 響應體相關的方法
// 字節流對象,向瀏覽器返回數據
ServletOutputStream out = response.getOutputStream();
String value = "web";
out.write(value.getBytes());
}
- getWriter():通常response向瀏覽器返回文本數據,不能向瀏覽器返回圖片、視頻等二進制文件
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 響應體相關的方法
// 字符流向瀏覽器輸出數據
PrintWriter pWriter = response.getWriter();
String value = "web----";
pWriter.write(value);
}
處理字節流的中文亂碼問題
- 字節流向瀏覽器輸出中文,可能會出現亂碼。出現亂碼的原因:服務器端的編碼格式和瀏覽器的編碼格式不一致引起的
package chapter.response;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ChineseServlet
*/
public class ChineseServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.處理字節流的中文亂碼問題
String data = "中國";
ServletOutputStream out = response.getOutputStream();
// 2.處理亂碼:服務器端的編碼和瀏覽器端的編碼保持一致
// 3.讓瀏覽器端的編碼也是utf-8
response.setHeader("Content-Type", "text/html;charset=utf-8");
//response.setContentType("text/html;charset=utf-8");
// 4.讓服務器端的中文編碼格式是utf-8
out.write(data.getBytes("utf-8"));
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
處理字節流的中文亂碼有兩種方式:
response.setHeader("Content-Type", "text/html;charset=utf-8");
response.setContentType("text/html;charset=utf-8");
- 字符流向瀏覽器輸出中文,肯定會亂碼
亂碼形式:??,會出現問號,這個問號就表示中文的編碼格式是採用iso8859-1編碼的,這種編碼格式不支持中文
處理原則:讓瀏覽器和服務器的編碼保持一致
package chapter.response;
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;
/**
* Servlet implementation class ChineseServlet
*/
public class ChineseServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.處理字符流的中文亂碼問題
// 2.處理服務器的編碼,讓這個編碼支持中文
response.setCharacterEncoding("utf-8");
// 3.處理器瀏覽器端的編碼
response.setHeader("Content-Type", "text/html;charset=utf-8");
//response.setContentType("text/html;charset=GB18030");
String data = "中國";
// 4.獲取字符流
PrintWriter pw = response.getWriter();
pw.print(data);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
處理字符流中文亂碼有兩種方式:
response.setCharacterEncoding("utf-8"); response.setHeader("Content-Type", "text/html;charset=utf-8");
response.setContentType("text/html;charset=GB18030");
注:在處理字符流和字節流輸出中文亂碼時,都採用:response.setContentType("text/html;charset=utf-8");
常見的編碼格式:
- GBK GBK18030 GB2312:這些都是支持中文的編碼格式,當然支持其他一些字符
- utf-8:萬能碼錶格式,支持所有的字符
- iso-88589-1:不支持中文
實現網頁定時刷新並跳轉
- 定時跳轉:從一個註冊頁面跳轉到登錄頁面,輸入之前註冊的用戶名和密碼
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.定時跳轉:需要用到Refresh響應頭
response.setHeader("Refresh", "5;URL=/chapter/login.html");
}
- 定時刷新:在當前頁面的地址不發生變化,但是當前頁面自己定時刷新,頁面數據會發生變化
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 定時刷新
response.setHeader("Refresh", "5");
response.getWriter().print(new Date());
}