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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Request的学习笔记(属Servlet学习课程)

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Request的学习笔记(属Servlet学习课程) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 獲取請求消息數據
    • 1.獲取請求行的數據
    • 2.獲取請求頭的數據
    • 3.獲取請求體的數據
    • 4.獲取其它的數據
      • 4.1.獲取請求參數的通用方式
        • 中文亂碼問題
      • 4.2.請求轉發
      • 4.3.共享數據
      • 4.4.獲取 ServletContext 對象
  • 繼承與實現體系

瀏覽器訪問服務器時,會將用戶提交的參數數據、協議版本、請求頭信息封裝成請求報文(即請求數據包)發送給服務端。
服務器(例如Tomcat)收到請求報文會封裝到 Request 對象中。程序員可以通過 Request 對象獲取請求消息數據。

獲取請求消息數據

1.獲取請求行的數據

GET /web-demo-03/demo01?name=zhangsan HTTP/1.1

方法:
1.1.獲取請求方式:GET
String getMethod()

1.2.獲取虛擬目錄:/web-demo-03
String getContextPath()

1.3.獲取Servlet路徑:/demo01
String getServletPath()

1.4.獲取請求URI:/web-demo-03/demo01
URI 統一資源標識符
String getRequestURI()

1.5.獲取GET方式的請求參數:name=zhangsan
String getQueryString()

1.6.獲取請求URL:http://localhost:8080/web-demo-03/demo01
URL 統一資源定位符
String getRequestURL()

1.7.獲取協議及版本:http/1.1
String getProtocol()

1.8.獲取客戶機的IP地址
String getRemoteAddr()

2.獲取請求頭的數據

請求頭名稱不區分大小寫。

方法:
String getHeader(String name) 通過請求頭的名稱獲取請求頭的值
Enumeration<String> getHeaderNames() 獲取所有的請求頭名稱。Enumeration 類似迭代器

示例代碼:

package priv.lwx.javaex.web_demo_03.web.servlet;/*** 獲取referer,防止盜鏈** @author liaowenxiong* @date 2021/12/29 11:21*/import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;@WebServlet(value = "/demo06") public class ServletDemo06 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 獲取refererString referer = request.getHeader("referer");System.out.println(referer);// 防止盜鏈if (referer != null) {if (referer.contains("/web-demo-03")) {// 應用內正常訪問System.out.println("播放電影");} else {// 應用外訪問System.out.println("想看電影嗎?來優酷吧!");}}} }

3.獲取請求體的數據

只有 post 請求方式才有請求體,在請求體中封裝了 post 請求的請求參數。

步驟:
3.1.獲取流對象
BufferedReader getReader():獲取字符輸入流,只能操作字符數據
ServletInputStream getInputStream():獲取字節輸入流,可以操作所有類型的數據(主要用于文件上傳、視頻上傳等場景)

3.2.從流對象中取數據

示例代碼:

package priv.lwx.javaex.web_demo_03.web.servlet.request;/*** 獲取請求體的數據** @author liaowenxiong* @date 2021/12/29 11:21*/import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException;@WebServlet(value = "/request-demo05") public class RequestDemo05 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 獲取請求消息體的數據// 1.獲取字符流BufferedReader reader = request.getReader();// 2.讀取數據String line = null;while ((line = reader.readLine()) != null) {System.out.println(line);}} }

4.獲取其它的數據

4.1.獲取請求參數的通用方式

不論 get 還是 post 方式,都可以使用下面的方法獲取請求參數。

方法:
String getParameter(String name):根據參數名稱獲取參數的值。要注意的問題: 如果 name 與實際的請求參數名不一致,則返回 null。
如果前端頁面并沒有輸入參數值,則返回空字符串 ""。

String[] getParameterValues(String name):根據參數名稱獲取參數值的數組。例如:hobby=ds&hobby=ps
Enumeration<String> getParameterNames():獲取所有請求參數的名稱

Enumeration<String> parameterNames = req.getParameterNames(); // 迭代遍歷Enumeration對象 while (parameterNames.hasMoreElements()) {String s = parameterNames.nextElement();System.out.println(s); }

Map<String,String[]> getParameterMap():獲取所有請求參數的 Map 集合。

中文亂碼問題

tomcat 8 已經將 get 請求方式的中文亂碼問題解決了,但是 post 請求方式會出現中文亂碼問題。

解決辦法:
獲取參數前,設置解碼的字符編碼為 utf-8,代碼如下:

request.setCharacterEncoding("utf-8");

這個字符編碼要和前端頁面的字符編碼保持一致。

4.2.請求轉發

請求轉發:一種在服務器內部的資源跳轉方式

步驟:
4.2.1.通過 request 對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path),path 是轉發目標的資源路徑

4.2.2.使用 RequestDispatcher 對象來進行轉發:requestDispatcher.forward(ServletRequest request, ServletResponse response)

特點:
4.2.3.瀏覽器地址欄的訪問路徑沒有變化
4.2.4.只能轉發到當前服務器內部的資源
4.2.5.轉發只是一次請求

4.3.共享數據

域對象:一個有作用范圍的對象,可以在范圍內共享數據
Request 域對象:代表一次請求的范圍,一般用于請求轉發的多個資源中共享數據

方法:
void setAttribute(String name,Object obj):存儲數據
Object getAttribute(String name):獲取數據;通過屬性名獲取屬性值
void removeAttribute(String name):刪除數據;通過屬性名刪除對應的數據;通過鍵移除對應的鍵值對

4.4.獲取 ServletContext 對象

ServletContext getServletContext()

繼承與實現體系

HttpServletRequest 接口繼承自 ServletRequest 接口

org.apache.catalina.connector.RequestFacade(tomcat 實現的類型),實現 HttpServletRequest 接口

總結

以上是生活随笔為你收集整理的Request的学习笔记(属Servlet学习课程)的全部內容,希望文章能夠幫你解決所遇到的問題。

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