中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

網(wǎng)站建設(shè)推廣代運(yùn)營(yíng)運(yùn)營(yíng)培訓(xùn)

網(wǎng)站建設(shè)推廣代運(yùn)營(yíng),運(yùn)營(yíng)培訓(xùn),海南網(wǎng)站建設(shè)介紹,哈爾濱網(wǎng)站制作方案定制文章目錄1,Request和Response的概述2,Request對(duì)象2.1 Request繼承體系2.2 Request獲取請(qǐng)求數(shù)據(jù)2.2.1 獲取請(qǐng)求行數(shù)據(jù)2.2.2 獲取請(qǐng)求頭數(shù)據(jù)2.2.3 獲取請(qǐng)求體數(shù)據(jù)2.2.4 獲取請(qǐng)求參數(shù)的通用方式2.4 請(qǐng)求參數(shù)中文亂碼問(wèn)題2.4.1 POST請(qǐng)求解決方案2.4.2 GET請(qǐng)求…

在這里插入圖片描述

文章目錄

  • 1,Request和Response的概述
    • 2,Request對(duì)象
      • 2.1 Request繼承體系
      • 2.2 Request獲取請(qǐng)求數(shù)據(jù)
        • 2.2.1 獲取請(qǐng)求行數(shù)據(jù)
        • 2.2.2 獲取請(qǐng)求頭數(shù)據(jù)
        • 2.2.3 獲取請(qǐng)求體數(shù)據(jù)
        • 2.2.4 獲取請(qǐng)求參數(shù)的通用方式
      • 2.4 請(qǐng)求參數(shù)中文亂碼問(wèn)題
        • 2.4.1 POST請(qǐng)求解決方案
        • 2.4.2 GET請(qǐng)求解決方案
      • 2.5 Request請(qǐng)求轉(zhuǎn)發(fā)
    • 3,Response對(duì)象
      • 3.1 Response設(shè)置響應(yīng)數(shù)據(jù)功能介紹
      • 3.2 Respones請(qǐng)求重定向
      • 3.3 Response響應(yīng)字符數(shù)據(jù)
    • 最后說(shuō)一句

1,Request和Response的概述

==Request是請(qǐng)求對(duì)象,Response是響應(yīng)對(duì)象。==這兩個(gè)對(duì)象在我們使用Servlet的時(shí)候有看到:在這里插入圖片描述

此時(shí),我們就需要思考一個(gè)問(wèn)題request和response這兩個(gè)參數(shù)的作用是什么?

在這里插入圖片描述
在這里插入圖片描述

  • request:獲取請(qǐng)求數(shù)據(jù)
    • 瀏覽器會(huì)發(fā)送HTTP請(qǐng)求到后臺(tái)服務(wù)器[Tomcat]
    • HTTP的請(qǐng)求中會(huì)包含很多請(qǐng)求數(shù)據(jù)[請(qǐng)求行+請(qǐng)求頭+請(qǐng)求體]
    • 后臺(tái)服務(wù)器[Tomcat]會(huì)對(duì)HTTP請(qǐng)求中的數(shù)據(jù)進(jìn)行解析并把解析結(jié)果存入到一個(gè)對(duì)象中
    • 所存入的對(duì)象即為request對(duì)象,所以我們可以從request對(duì)象中獲取請(qǐng)求的相關(guān)參數(shù)
    • 獲取到數(shù)據(jù)后就可以繼續(xù)后續(xù)的業(yè)務(wù),比如獲取用戶名和密碼就可以實(shí)現(xiàn)登錄操作的相關(guān)業(yè)務(wù)
  • response:設(shè)置響應(yīng)數(shù)據(jù)
    • 業(yè)務(wù)處理完后,后臺(tái)就需要給前端返回業(yè)務(wù)處理的結(jié)果即響應(yīng)數(shù)據(jù)
    • 把響應(yīng)數(shù)據(jù)封裝到response對(duì)象中
    • 后臺(tái)服務(wù)器[Tomcat]會(huì)解析response對(duì)象,按照[響應(yīng)行+響應(yīng)頭+響應(yīng)體]格式拼接結(jié)果
    • 瀏覽器最終解析結(jié)果,把內(nèi)容展示在瀏覽器給用戶瀏覽

我們可以通過(guò)一個(gè)案例來(lái)初步體驗(yàn)下request和response對(duì)象的使用。

@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//使用request對(duì)象 獲取請(qǐng)求數(shù)據(jù)String name = request.getParameter("name");//url?name=zhangsan//使用response對(duì)象 設(shè)置響應(yīng)數(shù)據(jù)response.setHeader("content-type","text/html;charset=utf-8");response.getWriter().write("<h1>"+name+",歡迎您!</h1>");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("Post...");}
}

啟動(dòng)成功后就可以通過(guò)瀏覽器來(lái)訪問(wèn),并且根據(jù)傳入?yún)?shù)的不同就可以在頁(yè)面上展示不同的內(nèi)容:

在這里插入圖片描述

總結(jié)
在這里插入圖片描述

  • request對(duì)象是用來(lái)封裝請(qǐng)求數(shù)據(jù)的對(duì)象
  • response對(duì)象是用來(lái)封裝響應(yīng)數(shù)據(jù)的對(duì)象

目前我們只知道這兩個(gè)對(duì)象是用來(lái)干什么的,那么它們具體是如何實(shí)現(xiàn)的,就需要我們繼續(xù)深入的學(xué)習(xí)。

2,Request對(duì)象

2.1 Request繼承體系

我們先思考一個(gè)問(wèn)題

  • 當(dāng)我們的Servlet類實(shí)現(xiàn)的是Servlet接口的時(shí)候,service方法中的參數(shù)是ServletRequest和ServletResponse
  • 當(dāng)我們的Servlet類繼承的是HttpServlet類的時(shí)候,doGet和doPost方法中的參數(shù)就變成HttpServletRequest和HttpServletReponse

那么,

  • ServletRequest和HttpServletRequest的關(guān)系是什么?
  • request對(duì)象是有誰(shuí)來(lái)創(chuàng)建的?
  • request提供了哪些API,這些API從哪里查?

首先,我們先來(lái)看下Request的繼承體系:

在這里插入圖片描述

從上圖中可以看出,ServletRequest和HttpServletRequest都是Java提供的,所以我們可以打開(kāi)JavaEE提供的API文檔,打開(kāi)后可以看到:

在這里插入圖片描述

所以ServletRequest和HttpServletRequest是繼承關(guān)系,并且兩個(gè)都是接口,接口是無(wú)法創(chuàng)建對(duì)象,這個(gè)時(shí)候就引發(fā)了下面這個(gè)問(wèn)題:

在這里插入圖片描述

這個(gè)時(shí)候,我們就需要用到Request繼承體系中的RequestFacade:

  • 該類實(shí)現(xiàn)了HttpServletRequest接口,也間接實(shí)現(xiàn)了ServletRequest接口。
  • Servlet類中的service方法、doGet方法或者是doPost方法最終都是由Web服務(wù)器[Tomcat]來(lái)調(diào)用的,所以Tomcat提供了方法參數(shù)接口的具體實(shí)現(xiàn)類,并完成了對(duì)象的創(chuàng)建
  • 要想了解RequestFacade中都提供了哪些方法,我們可以直接查看JavaEE的API文檔中關(guān)于ServletRequest和HttpServletRequest的接口文檔,因?yàn)镽equestFacade實(shí)現(xiàn)了其接口就需要重寫(xiě)接口中的方法

對(duì)于上述結(jié)論,要想驗(yàn)證,可以編寫(xiě)一個(gè)Servlet,在方法中把request對(duì)象打印下,就能看到最終的對(duì)象是不是RequestFacade,代碼如下:

@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(request);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

啟動(dòng)服務(wù)器,運(yùn)行訪問(wèn)http://localhost:8080/request-demo/demo2,得到運(yùn)行結(jié)果:

在這里插入圖片描述
在這里插入圖片描述

總結(jié)

  • Request的繼承體系為ServletRequest–>HttpServletRequest–>RequestFacade
  • Tomcat需要解析請(qǐng)求數(shù)據(jù),封裝為request對(duì)象,并且創(chuàng)建request對(duì)象傳遞到service方法
  • 使用request對(duì)象,可以查閱JavaEE API文檔的HttpServletRequest接口中方法說(shuō)明

2.2 Request獲取請(qǐng)求數(shù)據(jù)

HTTP請(qǐng)求數(shù)據(jù)總共分為三部分內(nèi)容,分別是請(qǐng)求行、請(qǐng)求頭、請(qǐng)求體,對(duì)于這三部分內(nèi)容的數(shù)據(jù),分別該如何獲取,首先我們先來(lái)學(xué)習(xí)請(qǐng)求行數(shù)據(jù)如何獲取?
在這里插入圖片描述

2.2.1 獲取請(qǐng)求行數(shù)據(jù)

請(qǐng)求行包含三塊內(nèi)容,分別是請(qǐng)求方式、請(qǐng)求資源路徑HTTP協(xié)議及版本

在這里插入圖片描述

對(duì)于這三部分內(nèi)容,request對(duì)象都提供了對(duì)應(yīng)的API方法來(lái)獲取,具體如下:

  • 獲取請(qǐng)求方式: GET
String getMethod()
  • 獲取虛擬目錄(項(xiàng)目訪問(wèn)路徑): /request-demo
String getContextPath()
  • 獲取URL(統(tǒng)一資源定位符): http://localhost:8080/request-demo/req1
StringBuffer getRequestURL()
  • 獲取URI(統(tǒng)一資源標(biāo)識(shí)符): /request-demo/req1
String getRequestURI()
  • 獲取請(qǐng)求參數(shù)(GET方式): username=zhangsan&password=123
String getQueryString()

介紹完上述方法后,咱們通過(guò)代碼把上述方法都使用下:

/*** request 獲取請(qǐng)求數(shù)據(jù)*/
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// String getMethod():獲取請(qǐng)求方式: GETString method = req.getMethod();System.out.println(method);//GET// String getContextPath():獲取虛擬目錄(項(xiàng)目訪問(wèn)路徑):/request-demoString contextPath = req.getContextPath();System.out.println(contextPath);// StringBuffer getRequestURL(): 獲取URL(統(tǒng)一資源定位符):http://localhost:8080/request-demo/req1StringBuffer url = req.getRequestURL();System.out.println(url.toString());// String getRequestURI():獲取URI(統(tǒng)一資源標(biāo)識(shí)符): /request-demo/req1String uri = req.getRequestURI();System.out.println(uri);// String getQueryString():獲取請(qǐng)求參數(shù)(GET方式): username=zhangsanString queryString = req.getQueryString();System.out.println(queryString);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}

啟動(dòng)服務(wù)器,訪問(wèn)http://localhost:8080/request-demo/req1?username=zhangsan&passwrod=123,獲取的結(jié)果如下:

在這里插入圖片描述

2.2.2 獲取請(qǐng)求頭數(shù)據(jù)

對(duì)于請(qǐng)求頭的數(shù)據(jù),格式為key: value如下:

在這里插入圖片描述
所以根據(jù)請(qǐng)求頭名稱獲取對(duì)應(yīng)值的方法為:

String getHeader(String name)

接下來(lái),在代碼中如果想要獲取客戶端瀏覽器的版本信息,則可以使用

/*** request 獲取請(qǐng)求數(shù)據(jù)*/
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//獲取請(qǐng)求頭: user-agent: 瀏覽器的版本信息String agent = req.getHeader("user-agent");System.out.println(agent);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}

重新啟動(dòng)服務(wù)器后,http://localhost:8080/request-demo/req1?username=zhangsan&passwrod=123,獲取的結(jié)果如下:

在這里插入圖片描述

2.2.3 獲取請(qǐng)求體數(shù)據(jù)

瀏覽器在發(fā)送GET請(qǐng)求的時(shí)候是沒(méi)有請(qǐng)求體的,所以需要把請(qǐng)求方式變更為POST,請(qǐng)求體中的數(shù)據(jù)格式如下:

在這里插入圖片描述

對(duì)于請(qǐng)求體中的數(shù)據(jù),Request對(duì)象提供了如下兩種方式來(lái)獲取其中的數(shù)據(jù),分別是:

  • 獲取字節(jié)輸入流,如果前端發(fā)送的是字節(jié)數(shù)據(jù),比如傳遞的是文件數(shù)據(jù),則使用該方法
ServletInputStream getInputStream()
該方法可以獲取字節(jié)
  • 獲取字符輸入流,如果前端發(fā)送的是純文本數(shù)據(jù),則使用該方法
BufferedReader getReader()
/*** request 獲取請(qǐng)求數(shù)據(jù)*/
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//獲取post 請(qǐng)求體:請(qǐng)求參數(shù)//1. 獲取字符輸入流BufferedReader br = req.getReader();//2. 讀取數(shù)據(jù)String line = br.readLine();System.out.println(line);}
}

注意

BufferedReader流是通過(guò)request對(duì)象來(lái)獲取的,當(dāng)請(qǐng)求完成后request對(duì)象就會(huì)被銷(xiāo)毀,request對(duì)象被銷(xiāo)毀后,BufferedReader流就會(huì)自動(dòng)關(guān)閉,所以此處就不需要手動(dòng)關(guān)閉流了。

總結(jié)
在這里插入圖片描述

HTTP請(qǐng)求數(shù)據(jù)中包含了請(qǐng)求行請(qǐng)求頭請(qǐng)求體,針對(duì)這三部分內(nèi)容,Request對(duì)象都提供了對(duì)應(yīng)的API方法來(lái)獲取對(duì)應(yīng)的值:

  • 請(qǐng)求行
    • getMethod()獲取請(qǐng)求方式
    • getContextPath()獲取項(xiàng)目訪問(wèn)路徑
    • getRequestURL()獲取請(qǐng)求URL
    • getRequestURI()獲取請(qǐng)求URI
    • getQueryString()獲取GET請(qǐng)求方式的請(qǐng)求參數(shù)
  • 請(qǐng)求頭
    • getHeader(String name)根據(jù)請(qǐng)求頭名稱獲取其對(duì)應(yīng)的值
  • 請(qǐng)求體
    • 注意: 瀏覽器發(fā)送的POST請(qǐng)求才有請(qǐng)求體
    • 如果是純文本數(shù)據(jù):getReader()
    • 如果是字節(jié)數(shù)據(jù)如文件數(shù)據(jù):getInputStream()

2.2.4 獲取請(qǐng)求參數(shù)的通用方式

  • GET方式:
String getQueryString()
  • POST方式:
BufferedReader getReader();

(1)發(fā)送一個(gè)GET請(qǐng)求并攜帶用戶名,后臺(tái)接收后打印到控制臺(tái)

(2)發(fā)送一個(gè)POST請(qǐng)求并攜帶用戶名,后臺(tái)接收后打印到控制臺(tái)

此處大家需要注意的是GET請(qǐng)求和POST請(qǐng)求接收參數(shù)的方式不一樣,具體實(shí)現(xiàn)的代碼如下:

@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String result = req.getQueryString();System.out.println(result);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {BufferedReader br = req.getReader();String result = br.readLine();System.out.println(result);}
}

request對(duì)象已經(jīng)將上述獲取請(qǐng)求參數(shù)的方法進(jìn)行了封裝,在request的方法中都實(shí)現(xiàn)了哪些操作?

(1)根據(jù)不同的請(qǐng)求方式獲取請(qǐng)求參數(shù),獲取的內(nèi)容如下:

在這里插入圖片描述

(2)把獲取到的內(nèi)容進(jìn)行分割,內(nèi)容如下:

在這里插入圖片描述

(3)把分割后端數(shù)據(jù),存入到一個(gè)Map集合中:

在這里插入圖片描述

注意:因?yàn)閰?shù)的值可能是一個(gè),也可能有多個(gè),所以Map的值的類型為String數(shù)組。

基于上述理論,request對(duì)象為我們提供了如下方法:

  • 獲取所有參數(shù)Map集合
Map<String,String[]> getParameterMap()
  • 根據(jù)名稱獲取參數(shù)值(數(shù)組)
String[] getParameterValues(String name)
  • 根據(jù)名稱獲取參數(shù)值(單個(gè)值)
String getParameter(String name)

2.4 請(qǐng)求參數(shù)中文亂碼問(wèn)題

2.4.1 POST請(qǐng)求解決方案

  • 分析出現(xiàn)中文亂碼的原因:
    • POST的請(qǐng)求參數(shù)是通過(guò)request的getReader()來(lái)獲取流中的數(shù)據(jù)
    • TOMCAT在獲取流的時(shí)候采用的編碼是ISO-8859-1
    • ISO-8859-1編碼是不支持中文的,所以會(huì)出現(xiàn)亂碼
  • 解決方案:
    • 頁(yè)面設(shè)置的編碼格式為UTF-8
    • 把TOMCAT在獲取流數(shù)據(jù)之前的編碼設(shè)置為UTF-8
    • 通過(guò)request.setCharacterEncoding(“UTF-8”)設(shè)置編碼,UTF-8也可以寫(xiě)成小寫(xiě)

修改后的代碼為:

/*** 中文亂碼問(wèn)題解決方案*/
@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 解決亂碼: POST getReader()//設(shè)置字符輸入流的編碼,設(shè)置的字符集要和頁(yè)面保持一致request.setCharacterEncoding("UTF-8");//2. 獲取usernameString username = request.getParameter("username");System.out.println(username);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

2.4.2 GET請(qǐng)求解決方案

  • GET請(qǐng)求獲取請(qǐng)求參數(shù)的方式是request.getQueryString()
  • POST請(qǐng)求獲取請(qǐng)求參數(shù)的方式是request.getReader()
  • request.setCharacterEncoding(“utf-8”)是設(shè)置request處理流的編碼
  • getQueryString方法并沒(méi)有通過(guò)流的方式獲取數(shù)據(jù)

所以GET請(qǐng)求不能用設(shè)置編碼的方式來(lái)解決中文亂碼問(wèn)題,那問(wèn)題又來(lái)了,如何解決GET請(qǐng)求的中文亂碼呢?

  1. 首先我們需要先分析下GET請(qǐng)求出現(xiàn)亂碼的原因:

在這里插入圖片描述

(1)瀏覽器通過(guò)HTTP協(xié)議發(fā)送請(qǐng)求和數(shù)據(jù)給后臺(tái)服務(wù)器(Tomcat)

(2)瀏覽器在發(fā)送HTTP的過(guò)程中會(huì)對(duì)中文數(shù)據(jù)進(jìn)行URL編碼

(3)在進(jìn)行URL編碼的時(shí)候會(huì)采用頁(yè)面<meta>標(biāo)簽指定的UTF-8的方式進(jìn)行編碼,張三編碼后的結(jié)果為%E5%BC%A0%E4%B8%89

(4)后臺(tái)服務(wù)器(Tomcat)接收到%E5%BC%A0%E4%B8%89后會(huì)默認(rèn)按照ISO-8859-1進(jìn)行URL解碼

(5)由于前后編碼與解碼采用的格式不一樣,就會(huì)導(dǎo)致后臺(tái)獲取到的數(shù)據(jù)為亂碼。

什么是URL編碼,什么又是URL解碼呢?

編碼:

java.net.URLEncoder.encode("需要被編碼的內(nèi)容","字符集(UTF-8)")

解碼:

java.net.URLDecoder.decode("需要被解碼的內(nèi)容","字符集(UTF-8)")

接下來(lái)咱們對(duì)張三來(lái)進(jìn)行編碼和解碼

public class URLDemo {public static void main(String[] args) throws UnsupportedEncodingException {String username = "張三";//1. URL編碼String encode = URLEncoder.encode(username, "utf-8");System.out.println(encode); //打印:%E5%BC%A0%E4%B8%89//2. URL解碼//String decode = URLDecoder.decode(encode, "utf-8");//打印:張三String decode = URLDecoder.decode(encode, "ISO-8859-1");//打印:`?? ?? `System.out.println(decode);}
}

到這,我們就可以分析出GET請(qǐng)求中文參數(shù)出現(xiàn)亂碼的原因了,

  • 瀏覽器把中文參數(shù)按照UTF-8進(jìn)行URL編碼
  • Tomcat對(duì)獲取到的內(nèi)容進(jìn)行了ISO-8859-1的URL解碼
  • 在控制臺(tái)就會(huì)出現(xiàn)類上?? ??‰的亂碼,最后一位是個(gè)空格

具體的實(shí)現(xiàn)步驟為:

1.按照ISO-8859-1編碼獲取亂碼?? ??‰對(duì)應(yīng)的字節(jié)數(shù)組

2.按照UTF-8編碼獲取字節(jié)數(shù)組對(duì)應(yīng)的字符串

實(shí)現(xiàn)代碼如下:

public class URLDemo {public static void main(String[] args) throws UnsupportedEncodingException {String username = "張三";//1. URL編碼String encode = URLEncoder.encode(username, "utf-8");System.out.println(encode);//2. URL解碼String decode = URLDecoder.decode(encode, "ISO-8859-1");System.out.println(decode); //此處打印的是對(duì)應(yīng)的亂碼數(shù)據(jù)//3. 轉(zhuǎn)換為字節(jié)數(shù)據(jù),編碼byte[] bytes = decode.getBytes("ISO-8859-1");for (byte b : bytes) {System.out.print(b + " ");}//此處打印的是:-27 -68 -96 -28 -72 -119//4. 將字節(jié)數(shù)組轉(zhuǎn)為字符串,解碼String s = new String(bytes, "utf-8");System.out.println(s); //此處打印的是張三}
}

另外需要說(shuō)明一點(diǎn)的是Tomcat8.0之后,已將GET請(qǐng)求亂碼問(wèn)題解決,設(shè)置默認(rèn)的解碼方式為UTF-8

總結(jié)
在這里插入圖片描述

  1. 中文亂碼解決方案
  • POST請(qǐng)求和GET請(qǐng)求的參數(shù)中如果有中文,后臺(tái)接收數(shù)據(jù)就會(huì)出現(xiàn)中文亂碼問(wèn)題

    GET請(qǐng)求在Tomcat8.0以后的版本就不會(huì)出現(xiàn)了

  • POST請(qǐng)求解決方案是:設(shè)置輸入流的編碼

    request.setCharacterEncoding("UTF-8");
    注意:設(shè)置的字符集要和頁(yè)面保持一致
    
  1. URL編碼實(shí)現(xiàn)方式:
  • 編碼:

    URLEncoder.encode(str,"UTF-8");
    
  • 解碼:

    URLDecoder.decode(s,"ISO-8859-1");
    

2.5 Request請(qǐng)求轉(zhuǎn)發(fā)

  1. 請(qǐng)求轉(zhuǎn)發(fā)(forward):一種在服務(wù)器內(nèi)部的資源跳轉(zhuǎn)方式。

在這里插入圖片描述

(1)瀏覽器發(fā)送請(qǐng)求給服務(wù)器,服務(wù)器中對(duì)應(yīng)的資源A接收到請(qǐng)求

(2)資源A處理完請(qǐng)求后將請(qǐng)求發(fā)給資源B

(3)資源B處理完后將結(jié)果響應(yīng)給瀏覽器

(4)請(qǐng)求從資源A到資源B的過(guò)程就叫請(qǐng)求轉(zhuǎn)發(fā)

  1. 請(qǐng)求轉(zhuǎn)發(fā)的實(shí)現(xiàn)方式:
req.getRequestDispatcher("資源B路徑").forward(req,resp);

3,Response對(duì)象

前面講解完Request對(duì)象,接下來(lái)我們回到剛開(kāi)始的那張圖:

在這里插入圖片描述

  • Request:使用request對(duì)象來(lái)獲取請(qǐng)求數(shù)據(jù)
  • Response:使用response對(duì)象來(lái)設(shè)置響應(yīng)數(shù)據(jù)

Reponse的繼承體系和Request的繼承體系也非常相似:

在這里插入圖片描述

3.1 Response設(shè)置響應(yīng)數(shù)據(jù)功能介紹

HTTP響應(yīng)數(shù)據(jù)總共分為三部分內(nèi)容,分別是響應(yīng)行、響應(yīng)頭、響應(yīng)體,對(duì)于這三部分內(nèi)容的數(shù)據(jù),respone對(duì)象都提供了哪些方法來(lái)進(jìn)行設(shè)置?

  1. 響應(yīng)行

在這里插入圖片描述

對(duì)于響應(yīng)頭,比較常用的就是設(shè)置響應(yīng)狀態(tài)碼:

void setStatus(int sc);
  1. 響應(yīng)頭

在這里插入圖片描述

設(shè)置響應(yīng)頭鍵值對(duì):

void setHeader(String name,String value);
  1. 響應(yīng)體

在這里插入圖片描述

對(duì)于響應(yīng)體,是通過(guò)字符、字節(jié)輸出流的方式往瀏覽器寫(xiě),

獲取字符輸出流:

PrintWriter getWriter();

獲取字節(jié)輸出流

ServletOutputStream getOutputStream();

介紹完這些方法后,后面我們會(huì)通過(guò)案例把這些方法都用一用,首先先來(lái)完成下重定向的功能開(kāi)發(fā)。

3.2 Respones請(qǐng)求重定向

  1. Response重定向(redirect):一種資源跳轉(zhuǎn)方式。

在這里插入圖片描述

(1)瀏覽器發(fā)送請(qǐng)求給服務(wù)器,服務(wù)器中對(duì)應(yīng)的資源A接收到請(qǐng)求

(2)資源A現(xiàn)在無(wú)法處理該請(qǐng)求,就會(huì)給瀏覽器響應(yīng)一個(gè)302的狀態(tài)碼+location的一個(gè)訪問(wèn)資源B的路徑

(3)瀏覽器接收到響應(yīng)狀態(tài)碼為302就會(huì)重新發(fā)送請(qǐng)求到location對(duì)應(yīng)的訪問(wèn)地址去訪問(wèn)資源B

(4)資源B接收到請(qǐng)求后進(jìn)行處理并最終給瀏覽器響應(yīng)結(jié)果,這整個(gè)過(guò)程就叫重定向

  1. 重定向的實(shí)現(xiàn)方式:
resp.setStatus(302);
resp.setHeader("location","資源B的訪問(wèn)路徑");
  1. 重定向的特點(diǎn)
  • 瀏覽器地址欄路徑發(fā)送變化

    當(dāng)進(jìn)行重定向訪問(wèn)的時(shí)候,由于是由瀏覽器發(fā)送的兩次請(qǐng)求,所以地址會(huì)發(fā)生變化

    在這里插入圖片描述

  • 可以重定向到任何位置的資源(服務(wù)內(nèi)容、外部均可)

    因?yàn)榈谝淮雾憫?yīng)結(jié)果中包含了瀏覽器下次要跳轉(zhuǎn)的路徑,所以這個(gè)路徑是可以任意位置資源。

  • 兩次請(qǐng)求,不能在多個(gè)資源使用request共享數(shù)據(jù)

    因?yàn)闉g覽器發(fā)送了兩次請(qǐng)求,是兩個(gè)不同的request對(duì)象,就無(wú)法通過(guò)request對(duì)象進(jìn)行共享數(shù)據(jù)

介紹完請(qǐng)求重定向請(qǐng)求轉(zhuǎn)發(fā)以后,接下來(lái)需要把這兩個(gè)放在一塊對(duì)比下:

在這里插入圖片描述

以后到底用哪個(gè),還是需要根據(jù)具體的業(yè)務(wù)來(lái)決定。

3.3 Response響應(yīng)字符數(shù)據(jù)

要想將字符數(shù)據(jù)寫(xiě)回到瀏覽器,我們需要兩個(gè)步驟:

  • 通過(guò)Response對(duì)象獲取字符輸出流: PrintWriter writer = resp.getWriter();

  • 通過(guò)字符輸出流寫(xiě)數(shù)據(jù): writer.write(“aaa”);

接下來(lái),我們實(shí)現(xiàn)通過(guò)些案例把響應(yīng)字符數(shù)據(jù)給實(shí)際應(yīng)用下:

返回一個(gè)簡(jiǎn)單的字符串aaa

/*** 響應(yīng)字符數(shù)據(jù):設(shè)置字符數(shù)據(jù)的響應(yīng)體*/
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");//1. 獲取字符輸出流PrintWriter writer = response.getWriter();writer.write("aaa");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

最后說(shuō)一句

感謝大家的閱讀,文章通過(guò)網(wǎng)絡(luò)資源與自己的學(xué)習(xí)過(guò)程整理出來(lái),希望能幫助到大家。

才疏學(xué)淺,難免會(huì)有紕漏,如果你發(fā)現(xiàn)了錯(cuò)誤的地方,可以提出來(lái),我會(huì)對(duì)其加以修改。

在這里插入圖片描述

http://www.risenshineclean.com/news/5611.html

相關(guān)文章:

  • 快手秒刷自助網(wǎng)站seo推廣哪家好
  • 桂林山水網(wǎng)頁(yè)制作seo服務(wù)套餐
  • c 多語(yǔ)言網(wǎng)站怎么做中國(guó)進(jìn)入全國(guó)緊急狀態(tài)
  • 順德做營(yíng)銷(xiāo)網(wǎng)站公司百度關(guān)鍵詞排行榜
  • 長(zhǎng)沙網(wǎng)站建設(shè)工作室打開(kāi)官方網(wǎng)站
  • 公眾號(hào)做淘寶客接入手機(jī)網(wǎng)站深圳網(wǎng)絡(luò)推廣最新招聘
  • 中國(guó)網(wǎng)站排名站長(zhǎng)之家玄幻小說(shuō)排行榜百度風(fēng)云榜
  • 設(shè)備租賃網(wǎng)站建設(shè)搜索優(yōu)化引擎
  • 黃巖路橋網(wǎng)站設(shè)計(jì)google搜索中文入口
  • 免費(fèi)b站軟件推廣網(wǎng)站廣州優(yōu)化防控措施
  • 設(shè)計(jì)出色的網(wǎng)站杭州百家號(hào)優(yōu)化
  • 網(wǎng)站建設(shè)策目標(biāo)安卓?jī)?yōu)化大師全部版本
  • 如何選擇網(wǎng)站公司網(wǎng)絡(luò)銷(xiāo)售平臺(tái)有哪些
  • 重慶市建筑工程造價(jià)信息網(wǎng)優(yōu)化師是干嘛的
  • 紹興以往網(wǎng)站招工做宣傳推廣的形式有哪些
  • 外貿(mào)做獨(dú)立網(wǎng)站怎么樣蘇州seo網(wǎng)站優(yōu)化軟件
  • 制作視頻的軟件手機(jī)seo平臺(tái)是什么意思
  • 站長(zhǎng)網(wǎng)站統(tǒng)計(jì)市場(chǎng)營(yíng)銷(xiāo)實(shí)際案例
  • wordpress 注冊(cè)鏈接搜索引擎優(yōu)化的主要手段
  • 動(dòng)態(tài)網(wǎng)站開(kāi)發(fā)語(yǔ)言企業(yè)網(wǎng)站設(shè)計(jì)規(guī)范
  • 網(wǎng)站推廣規(guī)劃百度問(wèn)答入口
  • 網(wǎng)站流量怎么做的南京網(wǎng)站設(shè)計(jì)
  • 開(kāi)發(fā)利用水資源安徽seo優(yōu)化
  • 網(wǎng)站分為四個(gè)步驟開(kāi)發(fā)建設(shè)百度推廣費(fèi)用
  • 鄭州網(wǎng)站建設(shè)哪家公司便宜網(wǎng)絡(luò)營(yíng)銷(xiāo)運(yùn)營(yíng)推廣
  • 做趣味圖形的網(wǎng)站seo引擎搜索
  • 網(wǎng)站改版提示無(wú)需改版怎么推廣app讓人去下載
  • php怎么做網(wǎng)頁(yè)免費(fèi)seo工具
  • 手機(jī)端網(wǎng)站怎么做的今日重大國(guó)際新聞軍事
  • 如何做不同域名跳轉(zhuǎn)同一個(gè)網(wǎng)站軟文推廣例子