日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java-Web Response响应和Request请求

發布時間:2025/3/20 java 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java-Web Response响应和Request请求 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、請求響應流程圖

二、response概述

????????response是Servlet.service方法的一個參數,類型為javax.servlet.http.HttpServletResponse。在客戶端發出每個請求時,服務器都會創建一個response對象,并傳入給Servlet.service()方法。response對象是用來對客戶端進行響應的,這說明在service()方法中使用response對象可以完成對客戶端的響應工作。

response對象的功能分為以下四種:

????????????設置響應頭信息;
????????????發送狀態碼;
????????????設置響應正文;

????????????重定向;

三、response響應正文

????????response是響應對象,向客戶端輸出響應正文(響應體)可以使用response的響應流,repsonse一共提供了兩個響應流對象:

????????????????PrintWriter out = response.getWriter():獲取字符流;
????????????????ServletOutputStream out = response.getOutputStream():獲取字節流;

????????如果響應正文內容為字符,那么使用response.getWriter(),如果響應內容是字節,例如下載時,那么可以使用response.getOutputStream()。

注意,在一個請求中,不能同時使用這兩個流!也就是說,要么你使用repsonse.getWriter(),要么使用response.getOutputStream(),但不能同時使用這兩個流。不然會拋出IllegalStateException異常。

? ? 1.字符響應流

?????????字符編碼

????????????????在使用response.getWriter()時需要注意默認字符編碼為ISO-8859-1,如果希望設置字符流的字符編碼為utf-8,可以使用response.setCharaceterEncoding(“utf-8”)來設置。這樣可以保證輸出給客戶端的字符都是使用UTF-8編碼的!
????????????????但客戶端瀏覽器并不知道響應數據是什么編碼的!如果希望通知客戶端使用UTF-8來解讀響應數據,那么還是使用response.setContentType("text/html;charset=utf-8")方法比較好,因為這個方法不只會調用response.setCharaceterEncoding(“utf-8”),還會設置content-type響應頭,客戶端瀏覽器會使用content-type頭來解讀響應數據。
????????緩沖區
????????????????response.getWriter()是PrintWriter類型,所以它有緩沖區,緩沖區的默認大小為8KB。也就是說,在響應數據沒有輸出8KB之前,數據都是存放在緩沖區中,而不會立刻發送到客戶端。當Servlet執行結束后,服務器才會去刷新流,使緩沖區中的數據發送到客戶端。
如果希望響應數據馬上發送給客戶端:
????????向流中寫入大于8KB的數據;
????????調用response.flushBuffer()方法來手動刷新緩沖區;

四、設置響應頭信息和設置狀態碼

????? ? 1.設置響應頭

????????可以使用response對象的setHeader()方法來設置響應頭!使用該方法設置的響應頭最終會發送給客戶端瀏覽器!

????????response.setHeader(“content-type”, “text/html;charset=utf-8”):設置content-type響應頭,該頭的作用是告訴瀏覽器響應內容為html類型,編碼為utf-8。而且同時會設置response的字符流編碼為utf-8,即response.setCharaceterEncoding(“utf-8”);

????????response.setHeader("Refresh","5; URL=http://www.baidu.com"):5秒后自動跳轉到百度主頁。

????????方法:

setHeader(String name, String value):適用于單值的響應頭,例如:response.setHeader("aaa", "AAA");

????? ? 該方法較為常用,下面的方法一般用不著,了解即可。

addHeader(String name, String value):適用于多值的響應頭
response.addHeader("aaa", "A");

response.addHeader("aaa", "AA");

setIntHeader(String name, int value):適用于單值的int類型的響應頭

addIntHeader(String name, int value):適用于多值的int類型的響應頭

setDateHeader(String name, long value):適用于單值的毫秒類型的響應頭

addDateHeader(String name, long value):適用于多值的毫秒類型的響應頭

????? ? 2.設置狀態碼

??狀態碼:200表示成功、302表示重定向、404表示客戶端錯(訪問的資源不存在)、500表示服務器端錯
   sendError(int sc) --> 發送錯誤狀態碼,例如404、500
   sendError(int sc, String msg) --> 發送錯誤狀態碼,還可以帶一個錯誤信息!
   setStatus(int sc) --> 發送成功的狀態碼,可以用來發送302

五、response重定向

? ? 1.什么是重定向

????????當你訪問http://www.sun.com時,會發現瀏覽器的url變成https://www.oracle.com/sun/index.html,這就是重定向。

????????重定向是服務器通知瀏覽器去訪問另一個地址,即再發出另一個請求。


? ? 2.代碼演示:
public class ReLocation extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setHeader("Location", "/4.28/AServlet");response.setStatus(302);}}

? ? 瀏覽器請求訪問該Servlet時,服務器會給瀏覽器發送302狀態碼,瀏覽器會馬上獲取響應頭Location,發出第二個請求,重定向到AServlet中。

? ? 3.便捷的重定向方式

????????????esponse.sendRedirect()方法會設置響應頭為302,以設置Location響應頭。

public class CServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.sendRedirect("http://www.baidu.com");}}

如果要重定向的URL是在同一個服務器內,那么可以使用相對路徑,例如:

????要訪問的路徑為: ?http://localhost:8080/hello/BServlet

????????? ? 代碼:response.sendRedirect("/hello/BServlet");

4.重定向小結

????? ? (1)重定向是兩次請求;

????? ? (2)重定向的URL可以是其他應用,不局限于當前應用;

????? ? (3)重定向的響應頭為302,并且必須要有Location響應頭;

????? ? (4)重定向就不要再使用response.getWriter()或response.getOutputStream()輸出數據,不然可能會出現異常;

六、Request概述

????????request是Servlet.service()方法的一個參數,類型為javax.servlet.http.HttpServletRequest。在客戶端發出每個請求時,服務器都會創建一個request對象,并把請求數據封裝到request中,然后在調用Servlet.service()方法時傳遞給service()方法,這說明在service()方法中可以通過request對象來獲取請求數據。


request的功能可以分為以下幾種:

????????封裝了請求頭數據;

????????封裝了請求正文數據,如果是GET請求,那么就沒有正文;

????????request是一個域對象,可以把它當成Map來添加獲取數據;

????????request提供了請求轉發和請求包含功能。

七、request方法

? ? 1.request獲取請求頭數據

????????????String getHeader(String name):獲取指定名稱的請求頭。

????????????Enumeration getHeaderNames():獲取所有請求頭名稱。

????????????int getIntHeader(String name):獲取值為int類型的請求頭。

????????????Enumeration<String> getHeaders(String name):獲取多值請求頭。

? ? 2.request獲取請求相關的其它方法

????????????int getContentLength():獲取請求體的字節數,GET請求沒有請求體,沒有請求體返回-1;

???????????String getContentType():獲取請求類型,如果請求是GET,那么這個方法返回null;如果是POST請求,那么默認為application/x-www-form-urlencoded,表示請求體內容使用了URL編碼;

????????????String getMethod():返回請求方法,例如:GET

????????????Locale getLocale():返回當前客戶端瀏覽器的Locale。java.util.Locale表示國家和言語,這個東西在國際化中很有用;

????????????String getCharacterEncoding():獲取請求編碼,如果沒有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1編碼;

????????????void setCharacterEncoding(String code):設置請求編碼,只對請求體有效!注意,對于GET而言,沒有請求體!!!所以此方法只能對POST請求中的參數有效!

????????????String getContextPath():返回上下文路徑,例如:/hello

????????????String getQueryString():返回請求URL中的參數,例如:name=zhangSan

????????????String getRequestURI():返回請求URI路徑,例如:/hello/oneServlet

????????????StringBuffer getRequestURL():返回請求URL路徑,例如:http://localhost/hello/oneServlet,即返回除了參數以外的路徑信息;

????????????String getServletPath():返回Servlet路徑,例如:/oneServlet

????????????String getRemoteAddr():返回當前客戶端的IP地址;

????????????String getRemoteHost():返回當前客戶端的主機名,但這個方法的實現還是獲取IP地址;

????????????String getScheme():返回請求協議,例如:http;

????????????String getServerName():返回主機名,例如:localhost

????????????int getServerPort():返回服務器端口號,例如:8080


? ? 3.request獲取請求參數

????????String getParameter(String name):通過指定名稱獲取參數值;

????????String[] getParameterValues(String name):當多個參數名稱相同時,可以使用方法來獲取;

????????Enumeration getParameterNames():獲取所有參數的名字;

????????Map getParameterMap():獲取所有參數封裝到Map中,其中key為參數名,value為參數值,因為一個參數名稱可能有多個值,所以參數值是String[],而不是String。

????????代碼演示:

<a href="/4.28/WServlet?city=taiyuan&color=yellow">get提交方式超鏈接</a><form action="/4.28/WServlet" method="post">用戶名:<input type="text" name="user"/><br/>密碼:<input type="password" name="password"/><br/>愛好:<input type="checkbox" name="hobby" value="basketball"/>籃球<input type="checkbox" name="hobby" value="soccer"/>足球<input type="checkbox" name="hobby" value="IT"/>敲代碼<br/><input type="submit" value="提交"/></form>
package cn.yfy_2;import java.io.IOException; import java.util.Arrays; import java.util.Map; import java.util.Set;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class WServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// getParameter獲取get方法提交的city和color的參數值String city = request.getParameter("city");String color = request.getParameter("color");System.out.println(city + "---" + color);// getParameterMap()獲取提交的所有參數,得到Map集合Map<String, String[]> map = request.getParameterMap();// 遍歷Map集合Set<String> set = map.keySet();for (String string : set) {String[] values = map.get(string);System.out.println(string + ":::" + Arrays.toString(values));}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// getParameter獲取post方法提交的user和password的參數值String name = request.getParameter("user");String password = request.getParameter("password");// getParameterValues獲取post方法提交的hobby值String[] hobby = request.getParameterValues("hobby");System.out.println(name + "---" + password + "---"+ Arrays.toString(hobby));// getParameterMap()獲取提交的所有參數,得到Map集合Map<String, String[]> map = request.getParameterMap();// 遍歷Map集合Set<String> set = map.keySet();for (String string : set) {String[] values = map.get(string);System.out.println(string + ":::" + Arrays.toString(values));}}}

????????打印結果:

//點擊超鏈接后的輸出結果 taiyuan---yellow color:::[yellow] city:::[taiyuan]//表單提交后的輸出結果 hello---123456---[basketball, IT] hobby:::[basketball, IT] user:::[hello] password:::[123456]

八、request請求轉發和請求包含

????????RequestDispatcher rd = request.getRequestDispatcher("/MyServlet"); ?
使用request獲取RequestDispatcher對象,方法的參數是被轉發或包含的Servlet的Servlet路徑
    請求轉發:rd.forward(request,response); ?留頭不留體(常用)
    請求包含:rd.include(request,response);? ? 留頭也留體

? ? 1.請求轉發和請求包含的區別

????????(1)如果在AServlet中請求轉發到BServlet,那么在AServlet中就不允許再輸出響應體,即不能再使用response.getWriter()和response.getOutputStream()向客戶端輸出,這一工作應該由BServlet來完成;如果是使用請求包含,那么沒有這個限制;

????????(2)請求轉發雖然不能輸出相應體,但可以設置響應頭;

????????(3)請求包含大多是應用在JSP頁面中,完成多頁面的合并;

????????(4)請求請求大多是應用在Servlet中,轉發目標大多是JSP頁面;


? ? 2.請求轉發與重定向的比較

????????(1)請求轉發是一個請求,而重定向是兩個請求;

????????(2)請求轉發后瀏覽器地址欄不會有變化,而重定向會有變化,因為重定向是兩個請求;

????????(3)請求轉發的目標只能是本應用中的資源,重定向的目標可以是其他應用;

????????(4)請求轉發對AServlet和BServlet的請求方法是相同的,即要么都是GET,要么都是POST,因為請求轉發是一個請求;

????????(5)重定向的第二個請求一定是GET;

? ? 3.request域

????????????void setAttribute(String name, Object value);

????????????Object getAttribute(String name);

????????????void removeAttribute(String name);

????????同一請求范圍內使用request.setAttribute()、request.getAttribute()來傳值!前一個Servlet調用setAttribute()保存值,后一個Servlet調用getAttribute()獲取值。

? ? 4.代碼演示
public class EServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 設置響應頭response.setHeader("AAA", "aaa");// 設置request屬性域request.setAttribute("name", "zhangsan");// 請求轉發到RServletrequest.getRequestDispatcher("/RServlet").forward(request, response);} } public class RServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 獲取request域中的name參數值String name = (String) request.getAttribute("name");// 打印到瀏覽器response.getWriter().write(name);} }

總結

以上是生活随笔為你收集整理的Java-Web Response响应和Request请求的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。