Servlet最主要作用就是處理客戶端請求并作出回應,為此,針對每次請求,Web容器在調用service()之前都會創建兩個對象,分別是HttpServletRequest和HttpServletResponse。其中HttpServletRequest封裝HTTP請求消息,HttpServletResponse封裝HTTP響應消息。需要注意的是,Web服務器運行過程中,每個Servlet都會只創建一個實例對象,不過每次請求都會調用Servlet實例的service(ServletRequest req, ServletResponse res)方法,這里HttpServletRequest是ServletRequest的子類,HttpServletResponse是ServletResponse的子類。
HttpServletRequest和HttpServletResponse接口繼承關系圖如下所示:
1、HttpServletResponse
HttpServletResponse接口繼承自ServletResponse接口,由于HTTP響應消息分為狀態行、響應消息體、消息體三部分,因此,在HttpServletResponse接口中定義了向客戶端發送響應狀態碼、響應消息頭、響應消息體的方法。雖然HttpServletResponse接口中的方法較多,但是我們常用的也就是那么幾個,如果用到其他的方法了可以閱讀響應的源碼或者相關資料就行了。
發送狀態碼相關函數
方法 |
說明 |
public void setStatus(int sc) |
設置響應消息狀態碼,Web服務器默認產生一個狀態碼為200的狀態行 |
public void sendError(int sc) |
發送表示錯誤信息的狀態碼,第二個方法還增加了一個用于提示說明的文本信息 |
public void sendError(int sc, String msg) |
發送響應消息頭相關函數
方法 |
說明 |
public void addHeader(String name, String value) |
設置HTTP響應頭字段,name指定字段名稱,value指定字段值。addHeader可以增加同名的響應頭字段,setHeader則會覆蓋同名的頭字段 |
public void setHeader(String name, String value) |
|
public void setContentLength(int len) |
設置響應消息的實體內容的大小,單位為字節,即設置Content-Length字段的值 |
public void setContentType(String type) |
設置Servlet輸出內容的MIME類型,即設置Content-Type字段的值 |
public void setCharacterEncoding(String charset) |
設置輸出內容字符編碼,即設置Content-Type字段的值,注意,該方法優先級比setContentType的高 |
public void sendRedirect(String location) |
Servlet請求重定向 |
發送響應消息體相關函數
方法 |
說明 |
public ServletOutputStream getOutputStream() |
獲取HttpServletResponse的字節輸出流ServletOutputStram類型 |
public PrintWriter getWriter() |
獲取HttpServletResponse的字符輸出流ServletWriter類型 |
中文輸出亂碼問題
計算機中的數據都是以二進制形式存儲的,因此,傳輸文本時,就會發生字符的字節之間的轉換。字符與字節之間的轉換時通過查碼表完成的,字符轉換為字節的過程稱為編碼,字節轉換為字符的過程稱為解碼,如果編碼和解碼使用的碼表不一樣,則會出現亂碼問題。
注意:HttpServletResponse對象的字符輸出流在編碼時,默認采用的是ISO 8859-1編碼,該編碼方式不兼容中文,比如會將"中國"編碼為"63 63"(在ISO 8959-1的碼表中查不到的字符會顯示63)。當瀏覽器對接收到的數據進行解碼時,會默認采用GB2312,將"63"解碼為"?",瀏覽器就將"中國"兩個字符解碼為"??"。
HttpServletResponse程序示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package zzz; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Hello extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // 設置響應消息編碼,注釋后"中國"會顯示"??"亂碼 response.setContentType( "text/html;charset=utf-8" ); PrintWriter out = response.getWriter(); out.println( "hello 中國" ); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { this .doGet(request, response); } } |
有時會遇到定時跳轉頁面的問題,HTTP中Refresh頭字段可以通知瀏覽器在指定的時間內自動刷新并跳轉到其他頁面,網頁定時刷新并跳轉到指定頁面。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package zzz; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Hello extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // 設置響應消息編碼 response.setContentType( "text/html;charset=utf-8" ); response.setHeader( "Refresh" , "2;url=http://www.baidu.com" ); PrintWriter out = response.getWriter(); out.println( "hello 中國,2秒后跳轉到百度..." ); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { this .doGet(request, response); } } |
2、HttpServletRequest
HttpServletRequest接口繼承ServletRequest接口,專門用于封狀HTTP請求消息。由于HTTP請求信息包括請求行、請求頭和請求體三部分,所以HttpServletRequest接口定義了獲取請求行、請求頭和請求體的相關方法。
獲取請求行的相關方法
方法 |
說明 |
public String getMethod() |
獲取HTTP請求方式,POST、GET等 |
public String getRequestURI() |
獲取請求行中資源名稱部分 |
public String getQueryString() |
獲取請求行中的參數部分 |
public String getProtocol() |
獲取請求行中協議名稱和版本,如HTTP 1.1 |
public String getContextPath() |
獲取請求URL中屬于Web應用程序的路徑 |
其實關于請求行的方法從方法名中就可以看出其作用,這里就不一一貼出來了。
獲取請求消息頭的相關方法
方法 |
說明 |
public String getHeader(String name) |
獲取指定字段的值,如果沒有返回null,如果有多個返回第一個值 |
public Enumeration<String> getHeaders(String name) |
返回一個指定字段的Enumeration集合對象 |
public Enumeration<String> getHeaderNames() |
返回一個包含所有字段的Enumeration集合對象 |
public String getContentType() |
獲取Content-Type字段的值 |
打印請求消息頭字段的所有值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package zzz; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Hello extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // 設置響應消息編碼 response.setContentType( "text/html;charset=utf-8" ); PrintWriter out = response.getWriter(); Enumeration< String > names = request.getHeaderNames(); while (names.hasMoreElements()) { String name = names.nextElement(); String value = request.getHeader(name); out.println(name + ": " + value + "</br>" ); } } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { this .doGet(request, response); } } |
獲取請求體的相關方法
方法 |
說明 |
public ServletInputStream getInputStream() |
獲取請求的ServletInputStream對象,如果實體內容為非文本,只能通過getInputStream方法獲取請求體消息體 |
public BufferedReader getReader() |
獲取請求的BufferedReader對象,該對象會將實體內容字節數據轉換為指定字符集編碼的文本字符串 |
獲取請求參數
方法 |
說明 |
public String getParameter(String name) |
獲取指定的參數值,沒有該參數返回null |
public Enumeration<String> getParameterNames() |
返回一個包含所有參數名的Enumeration對象 |
public String[] getParameterValues(String name) |
HTTP請求中可能有多個相同的參數,獲取同一個參數名對應的所有參數值 |
3、RequestDispatcher接口
當一個Web資源受到客戶端請求后,如果希望服務器通知另外一個資源如處理請求,除了使用功能sendRedirect()實現重定向外,還可以通過RequestDispatcher接口的實例對象來實現,在ServletRequest接口中定義了一個獲取RequestDispatcher對象的方法--getRequestDispatcher(String path),它返回某個路徑所指定資源的RequestDispatcher對象,參數path必須以"/"開頭,用于表示當前Web應用的根目錄,也就是path路徑必須是在本Web程序中,否則會出現異常。
RequestDispatcher接口中方法
方法 |
功能 |
public void forward(ServletRequest request, ServletResponse response) |
將一個Servlet傳遞給另外一個Web資源,將請求傳遞給其他資源進行響應 |
public void include(ServletRequest request, ServletResponse response) |
用于將其他資源作為當前響應內容包含進來 |
以上所述是小編給大家介紹的Java Web請求與響應實例詳解的相關內容,希望對大家有所幫助!