Java Web請求與響應實例詳解
Servlet最主要作用就是處理客戶端請求并作出回應,為此,針對每次請求,Web容器在調用service()之前都會創(chuàng)建兩個對象,分別是HttpServletRequest和HttpServletResponse。其中HttpServletRequest封裝HTTP請求消息,HttpServletResponse封裝HTTP響應消息。需要注意的是,Web服務器運行過程中,每個Servlet都會只創(chuàng)建一個實例對象,不過每次請求都會調用Servlet實例的service(ServletRequest req, ServletResponse res)方法,這里HttpServletRequest是ServletRequest的子類,HttpServletResponse是ServletResponse的子類。
HttpServletRequest和HttpServletResponse接口繼承關系圖如下所示:
1、HttpServletResponse
HttpServletResponse接口繼承自ServletResponse接口,由于HTTP響應消息分為狀態(tài)行、響應消息體、消息體三部分,因此,在HttpServletResponse接口中定義了向客戶端發(fā)送響應狀態(tài)碼、響應消息頭、響應消息體的方法。雖然HttpServletResponse接口中的方法較多,但是我們常用的也就是那么幾個,如果用到其他的方法了可以閱讀響應的源碼或者相關資料就行了。
發(fā)送狀態(tài)碼相關函數(shù)
方法
說明
public void setStatus(int sc)
設置響應消息狀態(tài)碼,Web服務器默認產生一個狀態(tài)碼為200的狀態(tài)行
public void sendError(int sc)
發(fā)送表示錯誤信息的狀態(tài)碼,第二個方法還增加了一個用于提示說明的文本信息
public void sendError(int sc, String msg)
發(fā)送響應消息頭相關函數(shù)
方法
說明
public void addHeader(String name, String value)
設置HTTP響應頭字段,name指定字段名稱,value指定字段值。addHeader可以增加同名的響應頭字段,setHeader則會覆蓋同名的頭字段
public void setHeader(String name, String value)
public void setContentLength(int len)
設置響應消息的實體內容的大小,單位為字節(jié),即設置Content-Length字段的值
public void setContentType(String type)
設置Servlet輸出內容的MIME類型,即設置Content-Type字段的值
public void setCharacterEncoding(String charset)
設置輸出內容字符編碼,即設置Content-Type字段的值,注意,該方法優(yōu)先級比setContentType的高
public void sendRedirect(String location)
Servlet請求重定向
發(fā)送響應消息體相關函數(shù)
方法 | 說明 |
public ServletOutputStream getOutputStream() | 獲取HttpServletResponse的字節(jié)輸出流ServletOutputStram類型 |
public PrintWriter getWriter() | 獲取HttpServletResponse的字符輸出流ServletWriter類型 |
中文輸出亂碼問題
計算機中的數(shù)據(jù)都是以二進制形式存儲的,因此,傳輸文本時,就會發(fā)生字符的字節(jié)之間的轉換。字符與字節(jié)之間的轉換時通過查碼表完成的,字符轉換為字節(jié)的過程稱為編碼,字節(jié)轉換為字符的過程稱為解碼,如果編碼和解碼使用的碼表不一樣,則會出現(xiàn)亂碼問題。
注意:HttpServletResponse對象的字符輸出流在編碼時,默認采用的是ISO 8859-1編碼,該編碼方式不兼容中文,比如會將"中國"編碼為"63 63"(在ISO 8959-1的碼表中查不到的字符會顯示63)。當瀏覽器對接收到的數(shù)據(jù)進行解碼時,會默認采用GB2312,將"63"解碼為"?",瀏覽器就將"中國"兩個字符解碼為"??"。
HttpServletResponse程序示例
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頭字段可以通知瀏覽器在指定的時間內自動刷新并跳轉到其他頁面,網(wǎng)頁定時刷新并跳轉到指定頁面。
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() | 獲取請求行中的參數(shù)部分 |
public String getProtocol() | 獲取請求行中協(xié)議名稱和版本,如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字段的值 |
打印請求消息頭字段的所有值
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對象,該對象會將實體內容字節(jié)數(shù)據(jù)轉換為指定字符集編碼的文本字符串
獲取請求參數(shù)
方法 | 說明 |
public String getParameter(String name) | 獲取指定的參數(shù)值,沒有該參數(shù)返回null |
public Enumeration<String> getParameterNames() | 返回一個包含所有參數(shù)名的Enumeration對象 |
public String[] getParameterValues(String name) | HTTP請求中可能有多個相同的參數(shù),獲取同一個參數(shù)名對應的所有參數(shù)值 |
3、RequestDispatcher接口
當一個Web資源受到客戶端請求后,如果希望服務器通知另外一個資源如處理請求,除了使用功能sendRedirect()實現(xiàn)重定向外,還可以通過RequestDispatcher接口的實例對象來實現(xiàn),在ServletRequest接口中定義了一個獲取RequestDispatcher對象的方法--getRequestDispatcher(String path),它返回某個路徑所指定資源的RequestDispatcher對象,參數(shù)path必須以"/"開頭,用于表示當前Web應用的根目錄,也就是path路徑必須是在本W(wǎng)eb程序中,否則會出現(xiàn)異常。
RequestDispatcher接口中方法
方法 | 功能 |
public void forward(ServletRequest request, ServletResponse response) | 將一個Servlet傳遞給另外一個Web資源,將請求傳遞給其他資源進行響應 |
public void include(ServletRequest request, ServletResponse response) | 用于將其他資源作為當前響應內容包含進來 |
以上所述是小編給大家介紹的Java Web請求與響應實例詳解的相關內容,希望對大家有所幫助!
相關文章
基于Java實現(xiàn)多線程下載并允許斷點續(xù)傳
這篇文章主要介紹了基于Java實現(xiàn)多線程下載并允許斷點續(xù)傳,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03詳解Spring Boot中整合Sharding-JDBC讀寫分離示例
這篇文章主要介紹了詳解Spring Boot中整合Sharding-JDBC讀寫分離示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03解決mybatis 數(shù)據(jù)庫date 與 java中Date類型映射問題
這篇文章主要介紹了解決mybatis 數(shù)據(jù)庫date 與 java中Date類型映射問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來吧2020-11-11Idea 2020.2安裝MyBatis Log Plugin 不可用的解決方法
小編在使用時發(fā)現(xiàn)Idea 2020.2 MyBatis Log Plugin 收費了,這個可以替代用,小編特此把解決方案分享到腳本之家平臺供大家參考,感興趣的朋友一起看看吧2020-11-11IntelliJ IDEA中出現(xiàn)"PSI and index do not match"錯誤的解決辦法
今天小編就為大家分享一篇關于IntelliJ IDEA中出現(xiàn)"PSI and index do not match"錯誤的解決辦法,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10