Request的学习笔记(属Servlet学习课程)
文章目錄
- 獲取請(qǐng)求消息數(shù)據(jù)
- 1.獲取請(qǐng)求行的數(shù)據(jù)
- 2.獲取請(qǐng)求頭的數(shù)據(jù)
- 3.獲取請(qǐng)求體的數(shù)據(jù)
- 4.獲取其它的數(shù)據(jù)
- 4.1.獲取請(qǐng)求參數(shù)的通用方式
- 中文亂碼問(wèn)題
- 4.2.請(qǐng)求轉(zhuǎn)發(fā)
- 4.3.共享數(shù)據(jù)
- 4.4.獲取 ServletContext 對(duì)象
- 繼承與實(shí)現(xiàn)體系
瀏覽器訪問(wèn)服務(wù)器時(shí),會(huì)將用戶提交的參數(shù)數(shù)據(jù)、協(xié)議版本、請(qǐng)求頭信息封裝成請(qǐng)求報(bào)文(即請(qǐng)求數(shù)據(jù)包)發(fā)送給服務(wù)端。
服務(wù)器(例如Tomcat)收到請(qǐng)求報(bào)文會(huì)封裝到 Request 對(duì)象中。程序員可以通過(guò) Request 對(duì)象獲取請(qǐng)求消息數(shù)據(jù)。
獲取請(qǐng)求消息數(shù)據(jù)
1.獲取請(qǐng)求行的數(shù)據(jù)
GET /web-demo-03/demo01?name=zhangsan HTTP/1.1
方法:
1.1.獲取請(qǐng)求方式:GET
String getMethod()
1.2.獲取虛擬目錄:/web-demo-03
String getContextPath()
1.3.獲取Servlet路徑:/demo01
String getServletPath()
1.4.獲取請(qǐng)求URI:/web-demo-03/demo01
URI 統(tǒng)一資源標(biāo)識(shí)符
String getRequestURI()
1.5.獲取GET方式的請(qǐng)求參數(shù):name=zhangsan
String getQueryString()
1.6.獲取請(qǐng)求URL:http://localhost:8080/web-demo-03/demo01
URL 統(tǒng)一資源定位符
String getRequestURL()
1.7.獲取協(xié)議及版本:http/1.1
String getProtocol()
1.8.獲取客戶機(jī)的IP地址
String getRemoteAddr()
2.獲取請(qǐng)求頭的數(shù)據(jù)
請(qǐng)求頭名稱不區(qū)分大小寫。
方法:
String getHeader(String name) 通過(guò)請(qǐng)求頭的名稱獲取請(qǐng)求頭的值
Enumeration<String> getHeaderNames() 獲取所有的請(qǐng)求頭名稱。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")) {// 應(yīng)用內(nèi)正常訪問(wèn)System.out.println("播放電影");} else {// 應(yīng)用外訪問(wèn)System.out.println("想看電影嗎?來(lái)優(yōu)酷吧!");}}} }3.獲取請(qǐng)求體的數(shù)據(jù)
只有 post 請(qǐng)求方式才有請(qǐng)求體,在請(qǐng)求體中封裝了 post 請(qǐng)求的請(qǐng)求參數(shù)。
步驟:
3.1.獲取流對(duì)象
BufferedReader getReader():獲取字符輸入流,只能操作字符數(shù)據(jù)
ServletInputStream getInputStream():獲取字節(jié)輸入流,可以操作所有類型的數(shù)據(jù)(主要用于文件上傳、視頻上傳等場(chǎng)景)
3.2.從流對(duì)象中取數(shù)據(jù)
示例代碼:
package priv.lwx.javaex.web_demo_03.web.servlet.request;/*** 獲取請(qǐng)求體的數(shù)據(jù)** @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 {// 獲取請(qǐng)求消息體的數(shù)據(jù)// 1.獲取字符流BufferedReader reader = request.getReader();// 2.讀取數(shù)據(jù)String line = null;while ((line = reader.readLine()) != null) {System.out.println(line);}} }4.獲取其它的數(shù)據(jù)
4.1.獲取請(qǐng)求參數(shù)的通用方式
不論 get 還是 post 方式,都可以使用下面的方法獲取請(qǐng)求參數(shù)。
方法:
String getParameter(String name):根據(jù)參數(shù)名稱獲取參數(shù)的值。要注意的問(wèn)題: 如果 name 與實(shí)際的請(qǐng)求參數(shù)名不一致,則返回 null。
如果前端頁(yè)面并沒(méi)有輸入?yún)?shù)值,則返回空字符串 ""。
String[] getParameterValues(String name):根據(jù)參數(shù)名稱獲取參數(shù)值的數(shù)組。例如:hobby=ds&hobby=ps
Enumeration<String> getParameterNames():獲取所有請(qǐng)求參數(shù)的名稱
Map<String,String[]> getParameterMap():獲取所有請(qǐng)求參數(shù)的 Map 集合。
中文亂碼問(wèn)題
tomcat 8 已經(jīng)將 get 請(qǐng)求方式的中文亂碼問(wèn)題解決了,但是 post 請(qǐng)求方式會(huì)出現(xiàn)中文亂碼問(wèn)題。
解決辦法:
獲取參數(shù)前,設(shè)置解碼的字符編碼為 utf-8,代碼如下:
這個(gè)字符編碼要和前端頁(yè)面的字符編碼保持一致。
4.2.請(qǐng)求轉(zhuǎn)發(fā)
請(qǐng)求轉(zhuǎn)發(fā):一種在服務(wù)器內(nèi)部的資源跳轉(zhuǎn)方式
步驟:
4.2.1.通過(guò) request 對(duì)象獲取請(qǐng)求轉(zhuǎn)發(fā)器對(duì)象:RequestDispatcher getRequestDispatcher(String path),path 是轉(zhuǎn)發(fā)目標(biāo)的資源路徑
4.2.2.使用 RequestDispatcher 對(duì)象來(lái)進(jìn)行轉(zhuǎn)發(fā):requestDispatcher.forward(ServletRequest request, ServletResponse response)
特點(diǎn):
4.2.3.瀏覽器地址欄的訪問(wèn)路徑?jīng)]有變化
4.2.4.只能轉(zhuǎn)發(fā)到當(dāng)前服務(wù)器內(nèi)部的資源
4.2.5.轉(zhuǎn)發(fā)只是一次請(qǐng)求
4.3.共享數(shù)據(jù)
域?qū)ο?#xff1a;一個(gè)有作用范圍的對(duì)象,可以在范圍內(nèi)共享數(shù)據(jù)
Request 域?qū)ο?#xff1a;代表一次請(qǐng)求的范圍,一般用于請(qǐng)求轉(zhuǎn)發(fā)的多個(gè)資源中共享數(shù)據(jù)
方法:
void setAttribute(String name,Object obj):存儲(chǔ)數(shù)據(jù)
Object getAttribute(String name):獲取數(shù)據(jù);通過(guò)屬性名獲取屬性值
void removeAttribute(String name):刪除數(shù)據(jù);通過(guò)屬性名刪除對(duì)應(yīng)的數(shù)據(jù);通過(guò)鍵移除對(duì)應(yīng)的鍵值對(duì)
4.4.獲取 ServletContext 對(duì)象
ServletContext getServletContext()
繼承與實(shí)現(xiàn)體系
HttpServletRequest 接口繼承自 ServletRequest 接口
org.apache.catalina.connector.RequestFacade(tomcat 實(shí)現(xiàn)的類型),實(shí)現(xiàn) HttpServletRequest 接口
總結(jié)
以上是生活随笔為你收集整理的Request的学习笔记(属Servlet学习课程)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ddos攻击目标有哪些(ddos攻击目标
- 下一篇: MySQL数据库创建用户root@%