JavaWeb-Servlet服務連接器(二)

目錄

Request(獲取請求信息)

1.獲取請求行內容

2.解決亂碼問題

?3.獲取請求頭部分

4.獲取請求體

?5.其他功能


Request(獲取請求信息)

工作流程:

1.通過請求的url的資源路徑,tomcat會生成相應的Servlet實現對象。

2.tomcat服務器會創建request對象和response對象,request對象接收請求消息數據。

3.tomcat將request和response方法傳遞給service方法并且調用service方法

4.程序員可以通過request對象獲取請求的消息數據,并且設置response的響應數據

5.服務器在給瀏覽器響應之前獲取response

1.獲取請求行內容

請求行部分獲取請求行內容的方法示例代碼返回值
請求方法(Method)getMethod()String method = request.getMethod();"GET"
(重點)請求???? ? URI(URL)getRequestURI()String uri = request.getRequestURI();"/index.html"
協議版本(Protocol)getProtocol()String protocol = request.getProtocol();"HTTP/1.1"
查詢字符串(Query String)getQueryString()String queryString = request.getQueryString();null (如果沒有查詢字符串)
(重點)上下文路徑(Context Path)getContextPath()String contextPath = request.getContextPath();"" (如果沒有上下文路徑,則為空字符串)

?案例代碼:

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/requestHang")
public class RequestHang extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        獲取方法String method =req.getMethod();System.out.println("使用的方法是"+method);
//       * 獲取上下文路徑String contextPath = req.getContextPath();System.out.println("請求的上下文路徑是"+contextPath);
//       * 獲取URIString Uri = req.getRequestURI();System.out.println("請求的URI是"+Uri);
//        獲取協議版本String version = req.getProtocol();System.out.println("請求的協議版本是"+version);
//        獲取查詢字符串String string = req.getQueryString();System.out.println("請求附帶的查詢字符串是"+string);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//        獲取方法String method =req.getMethod();System.out.println("使用的方法是"+method);
//       * 獲取上下文路徑String contextPath = req.getContextPath();System.out.println("請求的上下文路徑是"+contextPath);
//       * 獲取URIString Uri = req.getRequestURI();System.out.println("請求的URI是"+Uri);
//        獲取協議版本String version = req.getProtocol();System.out.println("請求的協議版本是"+version);
//        獲取參數String username = req.getParameter("username");System.out.println("Username is "+username);}
}

index.jsp代碼:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>測試發送消息</title></head><body><form action="/com_alphamilk_war_exploded/requestHang" method="get"><input name="username"><input type="submit" value="提交"></form></body>
</html>

通過url訪問結果如下:

?可以看到請求出現了亂碼,下一步就是解決請求亂碼問題.


2.解決亂碼問題

1.控制臺輸出亂碼

如果tomcat的版本是在10以下的,用中文可能會出現亂碼問題,這里用的是9版本,解決方法:

打開tomcat文件夾找到conf配置文件

配置文件在conf下面,將配置中的字符集改成GBK,修改后的配置如下圖:

修改后重新啟動結果如下:

?2.post請求方式中參數中文亂碼

通過將表單提交方式改為post,再在內容輸入中文,通過request方法的getParameter獲取參數username

可以看到輸出的結果是一串亂碼。所以需要進行修補

解決方法:設置流的編碼即可

//        設置流的編碼req.setCharacterEncoding("utf-8");

重啟服務器并再次運行:


?3.獲取請求頭部分

示例:請求頭(Request Header):Accept-Language: en-US,en;q=0.9

請求頭名稱獲取請求頭值的方法示例代碼返回值
Accept-LanguagegetHeader("Accept-Language")String acceptLanguage = request.getHeader("Accept-Language");"en-US,en;q=0.9"
所有請求頭名稱getHeaderNames()Enumeration<String> headerNames = request.getHeaderNames();包含所有請求頭名稱的枚舉

案例代碼:獲取所有請求頭信息與對應的值

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;@WebServlet("/rsHead")
public class RequestHead extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        通過迭代器Enumration遍歷請求頭Enumeration<String> enumeration = req.getHeaderNames();
//        開始遍歷while (enumeration.hasMoreElements()){String name = enumeration.nextElement();
//            找到獲取頭名稱的值String value = req.getHeader(name);System.out.println(name+" == " +value);}}
}

案例代碼2:設置外部跳轉無法訪問,只能通過項目內的頁面訪問資源

通過請求頭referer獲取訪問到當前頁面的來源(如果是直接輸入地址則referer為空)

首先桌面隨便創建一個html文件,然后通過文件的超鏈接實行跳轉到剛才頁面

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>冒牌登陸系統</title></head><body><a href="http://localhost:9998/com_alphamilk_war_exploded/rsHead">訪問嘗試</a></body>
</html>

既然能獲取到外部訪問源地址,那么現在通過限制請求頭的訪問,外部地址的訪問就會輸出非法訪問。

服務器Servlet類代碼:

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/refererTest")
public class rsRefer extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        設置RefererString referer = req.getHeader("referer");
//        防盜鏈機制if (referer != null){if (referer.contains("/com_alphamilk_war_exploded")){System.out.println("正常訪問");}else {System.out.println("非法訪問,請從官網處進行訪問");}}}
}

重啟服務器后,此時再通過隨便創建的html文件修改路徑后訪問得到:


4.獲取請求體

只有post請求方式才有請求體

步驟:

1.獲取流對象 BufferReader

2.從流對象中獲取值 nextline();

常用方法:

方法名作用
getReader()獲取請求的輸入流,并返回一個BufferedReader對象,用于讀取來自客戶端的請求數據。
getInputStream()獲取請求的輸入流,并返回一個ServletInputStream對象,用于直接從客戶端請求中讀取字節數據。

案例代碼:

html代碼:

<html><head><title>測試發送消息</title></head><body><form action="http://localhost:9998/com_alphamilk_war_exploded/body" method="post"><input type="text" name="username" placeholder="用戶名"><br><input type="text" name="password" placeholder="密碼"><br><input type="submit"></form></body>
</html>

Servlet類代碼:

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;@WebServlet("/body")
public class RequestBody extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {BufferedReader reader = req.getReader();String line;while (reader.readLine()!=null){line = reader.readLine();System.out.println(line);}}
}

?通過輸入用戶名與密碼再提交表單

?


?5.其他功能

1.獲取參數通用方式(不管post請求還是get請求都可以用、重點): ????

方法名作用
getParameter(String name)獲取指定名稱的請求參數的值。如果有多個同名參數,只返回第一個參數的值。
getParameterValues(String name)獲取指定名稱的請求參數的所有值。如果參數存在多個值,返回一個包含所有值的字符串數組。
Enumeration<String> getParameterNames()返回一個枚舉對象,包含所有請求參數的名稱。可以使用該枚舉對象遍歷所有請求參數的名稱。
getParameterMap()返回一個Map對象,其中包含所有的請求參數和它們的值。鍵是參數名稱,值是參數的值(以字符串數組形式)。

案例代碼:

?服務器代碼

package com.company;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;@WebServlet("/Demo3")
public class ReqOther extends HttpServlet{HttpServletRequest req;HttpServletResponse resp;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Enumeration<String> enumeration = req.getParameterNames();String names;
//        通過迭代器遍歷輸出所有的參數名與對應的值while (enumeration.hasMoreElements()){names = enumeration.nextElement();System.out.println(names+":"+req.getParameter(names));}}
//    由于是通用方法,所以如果有post請求則更改為Get請求流程@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        注意post方法會出現中文亂碼問題,需要轉為utf-8格式編碼req.setCharacterEncoding("utf-8");this.req = req;this.resp = resp;this.doGet(req, resp);}
}

web代碼更改路徑地址后輸入,并提交

?

?當一個表單中出現多個相同的名字時候就需要用getParameterValues或者getParameterMap存放。

2.請求轉發(服務器內部資源的跳轉方式)

方法名作用
getRequestDispatcher(String path)獲取與給定相對路徑(path)相關聯的 RequestDispatcher 對象,用于在同一個 Web 應用程序內部的不同資源之間進行請求轉發。
forward(ServletRequest request, ServletResponse response)將請求和響應對象轉發給另一個資源(如 Servlet、JSP 頁面),停止當前資源的執行,并將控制權交給目標資源,由目標資源負責生成響應。

案例代碼:

創建一個資源類,一個訪問類,通過訪問類訪問資源類

訪問類:

package com.company;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;//資源跳轉
@WebServlet("/Demo4")
public class rsPatcher extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {try {System.out.println("3s后進行跳轉");
//            3秒后進行跳轉TimeUnit.SECONDS.sleep(3);}catch (Exception e){e.printStackTrace();}//        定義要跳轉的資源類路徑RequestDispatcher requestDispatcher = req.getRequestDispatcher("/Demo5");
//        進行跳轉requestDispatcher.forward(req,resp);}
}

資源類:

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/Demo5")
public class pro extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("我是資源類,我被訪問了");}
}

輸出:

?注意:跳轉只能跳轉到當前項目中的資源,如果把資源改為外部路徑,比如www.baidu.com這樣就無法進行跳轉。并且轉發知識一次的請求

3.共享數據

由于一個類中的數據往往只能該類使用,但是有些資源需要進行多個對象能共享使用,所以引入了共享數據

方法名作用
setAttribute(String name, Object value)將一個數據對象(value)與給定的名稱(name)關聯起來,將其存儲在 ServletContext、HttpSession 或 HttpServletRequest 中,以便多個對象之間共享使用。
getAttribute(String name)根據給定的名稱(name),從 ServletContext、HttpSession 或 HttpServletRequest 中獲取與之關聯的數據對象。
removeAttribute(String name)根據給定的名稱(name),從 ServletContext、HttpSession 或 HttpServletRequest 中刪除關聯的數據對象。

案例代碼:

設置一個運輸物資類,一個資源類

運輸物資類:

package com.company;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/Demo6")
public class Demo6 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        設置共享資源,格式為   鍵值->對象req.setAttribute("msg","物資");System.out.println("當前為跳轉類進行運輸:"+req.getAttribute("msg"));RequestDispatcher requestDispatcher  = req.getRequestDispatcher("/Demo7");
//        進行跳轉requestDispatcher.forward(req,resp);}
}

資源類

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/Demo7")
public class Demo7 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("資源類獲取到"+req.getAttribute("msg"));}
}


下一篇JavaWeb-Servlet服務連接器(三)_Alphamilk的博客-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39333.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39333.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39333.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【單片機】DS2431,STM32,EEPROM讀取與寫入

芯片介紹&#xff1a; https://qq742971636.blog.csdn.net/article/details/132164189 接線 串口結果&#xff1a; 部分代碼&#xff1a; #include "sys.h" #include "DS2431.h"unsigned char serialNb[8]; unsigned char write_data[128]; unsigned cha…

STM32入門學習之定時器輸入捕獲

1.定時器的輸入捕獲可以用來測量脈沖寬度或者測量頻率。輸入捕獲的原理圖如下&#xff1a; 假設定時器是向上計數。在圖中&#xff0c;t1~t2之間的便是我們要測量的高電平的時間(脈沖寬度)。首先&#xff0c;設置定時器為上升沿捕獲&#xff0c;如此一來&#xff0c;在t1時刻可…

使用Cinemachine制作固定路徑動畫

固定路徑配置 選擇一個游戲對象添加CinemachineSmoothPath腳本選擇添加腳本的對象。路徑腳本需要是展開狀態&#xff0c;才可以看到路徑添加點&#xff0c;使用移動工具&#xff0c;調節路徑 對象在路徑上移動 移動對象添加CinemachineDollyCart腳本設置移動路徑(帶有Path腳…

AI 繪畫Stable Diffusion 研究(九)sd圖生圖功能詳解-老照片高清修復放大

大家好&#xff0c;我是風雨無阻。 通過前面幾篇文章的介紹&#xff0c;相信各位小伙伴&#xff0c;對 Stable Diffusion 這款強大的AI 繪圖系統有了全新的認知。我們見識到了借助 Stable Diffusion的文生圖功能&#xff0c;利用簡單的幾個單詞&#xff0c;就可以生成完美的圖片…

阿里云OSS對象存儲的核心概念與購買應用

文章目錄 1.OSS對象存儲基本介紹1.1.OSS對象存儲概念1.2.NAS與OSS存儲的不同1.3.OSS的應用場景1.4.OSS術語對應表 2.購買OSS存儲資源包3.KodCloud云盤接入OSS對象存儲3.1.創建Bucket存儲空間3.2.創建子用戶用于管理Bucket3.3.獲取用戶的AccessKey3.3.為用戶設置權限3.4.將Bucke…

MySQL和Redis如何保證數據一致性

MySQL與Redis都是常用的數據存儲和緩存系統。為了提高應用程序的性能和可伸縮性&#xff0c;很多應用程序將MySQL和Redis一起使用&#xff0c;其中MySQL作為主要的持久存儲&#xff0c;而Redis作為主要的緩存。在這種情況下&#xff0c;應用程序需要確保MySQL和Redis中的數據是…

軟件測試常用工具總結(測試管理、單元測試、接口測試、自動化測試、性能測試、負載測試等)

前言 在軟件測試的過程中&#xff0c;多多少少都是會接觸到一些測試工具&#xff0c;作為輔助測試用的&#xff0c;以提高測試工作的效率&#xff0c;使用好了測試工具&#xff0c;能對測試起到一個很好的作用&#xff0c;同時&#xff0c;有些公司&#xff0c;也會要求掌握一…

__ob__: Observer 后綴的數組的取值方式

開發中&#xff0c;經常從接口、父組件中&#xff0c;拿到數組然后給新的數組使用&#xff0c; 但是&#xff0c;有時候會發現帶有 __ob__: Observer 后綴的數組&#xff0c;對這種數組來說&#xff0c;你是無法取到這個數組的值的&#xff0c; 而且&#xff0c;離譜的是consol…

【深度學習--RNN 循環神經網絡--附LSTM情感文本分類】

deep learning 系列 --RNN 循環神經網絡 什么是序列模型 包括了RNN LSTM GRU等網絡模型&#xff0c;主要用途是自然語言處理、語音識別等方面&#xff0c;比如生成樂曲&#xff0c;音頻轉換為文字&#xff0c;文本情感分類&#xff0c;機器翻譯等等 標準模型的缺陷 以往的標…

flutter 常見的狀態管理器

flutter 常見的狀態管理器 前言一、Provider二、Bloc三、Redux四、GetX總結 前言 當我們構建復雜的移動應用時&#xff0c;有效的狀態管理是至關重要的&#xff0c;因為應用的不同部分可能需要共享數據、相應用戶交互并保持一致的狀態。Flutter 中有多種狀態管理解決方案&#…

0143 串

目錄 4.串 4.1串的定義和實現 4.2串的模式匹配 部分習題 4.串 4.1串的定義和實現 4.2串的模式匹配 部分習題 1.設有兩個串S1和S2&#xff0c;求S2在S1中首次出現的位置的運算稱為&#xff08;&#xff09; A.求字串 B.判斷是否相等 C.模式匹配 D.連…

Vue2(組件開發)

目錄 前言一&#xff0c;組件的使用二&#xff0c;插槽slot三&#xff0c;refs和parent四&#xff0c;父子組件間的通信4.1&#xff0c;父傳子 &#xff1a;父傳子的時候&#xff0c;通過屬性傳遞4.2&#xff0c;父組件監聽自定義事件 五&#xff0c;非父子組件的通信六&#x…

麥肯錫發布《2023年度科技報告》!

在經歷了 2022 年技術投資和人才的動蕩之后&#xff0c;2023 年上半年&#xff0c;人們對技術促進商業和社會進步的潛力重新燃起了熱情。生成式人工智能&#xff08;Generative AI&#xff09;在這一復興過程中功不可沒&#xff0c;但它只是眾多進步中的一個&#xff0c;可以推…

總說綠幕直播摳像摳不干凈?很有可能是你不知道這個神器!

在綠幕直播的時候&#xff0c;你是不是座位、綠幕、燈光都擺對了&#xff0c;但主播輪廓仍然有綠邊和虛化的情況發生&#xff1f;這種很大可能就是你使用的直播摳像軟件有問題。今天小編把市面上的常見直播軟件來和vLive虛擬直播的摳像做一個對比&#xff0c;讓你直觀感受下他們…

機器學習筆記 - 基于PyTorch + 類似ResNet的單目標檢測

一、獲取并了解數據 我們將處理年齡相關性黃斑變性 (AMD) 患者的眼部圖像。 數據集下載地址,從下面的地址中,找到iChallenge-AMD,然后下載。 Baidu Research Open-Access Dataset - DownloadDownload Baidu Research Open-Access Datasethttps://ai.baidu.com/bro…

Docker入門使用

用一個hello world的小例子來入門docker 在 Docker 容器中部署 Python Flask 的簡單 Hello World 項目&#xff0c;需要遵循以下流程&#xff1a; 編寫應用程序 首先&#xff0c;在本地計算機上編寫一個簡單的 PythonFlask 應用程序&#xff0c;例如&#xff1a; # hello.…

基于ACF,AMDF算法的語音編碼matlab仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 5.算法完整程序工程 1.算法運行效果圖預覽 2.算法運行軟件版本 matlab2022a 3.部分核心程序 .......................................................................... plotFlag …

函數遞歸專題(案例超詳解一篇講通透)

函數遞歸 前言1.遞歸案例:案例一&#xff1a;取球問題案例二&#xff1a;求斐波那契額數列案例三&#xff1a;函數實現n的k次方案例四&#xff1a;輸入一個非負整數&#xff0c;返回組成它的數字之和案例五&#xff1a;元素逆置案例六&#xff1a;實現strlen案例七&#xff1a;…

服務器遭受攻擊之后的常見思路

哈嘍大家好&#xff0c;我是咸魚 不知道大家有沒有看過這么一部電影&#xff1a; 這部電影講述了男主是一個電腦極客&#xff0c;在計算機方面有著不可思議的天賦&#xff0c;男主所在的黑客組織憑借著超高的黑客技術去入侵各種國家機構的系統&#xff0c;并引起了德國秘密警察…

Mac如何打開隱藏文件中Redis的配置文件redis.conf

Redis下載(通過??博客下載的Redis默認路徑為&#xff1a;/usr/local/etc) Redis下載 1.打開終端進入/usr文件夾 cd /usr 2.打開/local/文件夾 open local 3.找到redis.conf并打開,即可修改配置信息