【Servlet】(Servlet API HttpServlet 處理請求 HttpServletRequest 打印請求信息 前端給后端傳參)

文章目錄

  • Servlet API
    • HttpServlet
      • 處理請求
    • HttpServletRequest
      • 打印請求信息
      • 前端給后端傳參


Servlet API

Servlet中常用的API

HttpServlet

在這里插入圖片描述
實際開發的時候主要重寫 doXXX 方法, 很少會重寫 init / destory / service

destory 服務器終止的時候會調用.

//下面的注解把當前類和一個HTTP請求的路徑關聯起來
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {@Overridepublic void init() throws ServletException {//重寫init 插入自己"初始化"相關的邏輯System.out.println("init");}@Overridepublic void destroy() {System.out.println("destroy");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//這個只是在服務器的控制臺打印System.out.println("hello world");//要想把hello world返回到客戶端,需要使用下面的代碼//getWriter 會得到一個Writer對象resp.getWriter().write("hello world");}
}

在這里插入圖片描述
上面的destroy能不能被執行到有待商榷,如果是通過Smart Tomcat 的停止按鈕,這個操作本質上是通過Tomcat的8005端口,主動停止,可以觸發destroy.如果是直接殺進程,此時可能就來不及執行destroy就沒了.因此不太推薦使用destroy.

service每次收到http請求就出觸發(路徑匹配)

@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.service(req, resp);}

init / destory / service 這三個方法是HttpServlet中最關鍵的三個方法.

Servlet的聲明周期是怎么回事?

  1. 開始的時候執行init
  2. 每次收到請求執行service
  3. 銷毀之前執行destroy

處理請求

@WebServlet("/method")
public class MethodServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet");resp.getWriter().write("doGet");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost");resp.getWriter().write("doPost");}@Overrideprotected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPut");resp.getWriter().write("doPut");}@Overrideprotected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doDelete");resp.getWriter().write("doDelete");}
}

我們刷新頁面只有doGet請求,想要獲得別的請求可以利用postman這個軟件來實現:

在這里插入圖片描述
也可以通過ajax來構造請求:先在webapp目錄下創建test.html.
在這里插入圖片描述

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><!-- 使用這個頁面來構造ajax請求 --><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>$.ajax({type: 'get',url: 'method',success: function(body, status){console.log(body);}});</script>
</body>
</html>

然后重啟服務器,在網址欄輸入:http://127.0.0.1:8080/hello_servlet/test.html然后刷新在控制臺就能看到doGet請求了.想要獲取別的請求,直接在代碼中改就可以了,需要注意的是我們在編寫Servlet代碼的時候,每次修改代碼,要及得重新啟動服務器.
在這里插入圖片描述

此處寫的路徑是相對路徑,相對路徑的基準目錄是該html所在的路徑.此處寫method就相當于在http://127.0.0.1:8080/hello_servlet的基礎上,再拼上一個method
在這里插入圖片描述

絕對路徑的寫法:

在這里插入圖片描述

HttpServletRequest

這個類表示的是HTTP請求.這個對象是Tomcat自動構造的,Tomcat會實現監聽端口,接受連接,解析請求,構造請求對象等一系列工作.
下面的表格就是一些典型的方法:

方法描述
String getProtocol()返回請求協議的名稱和版本
String getMethod()返回請求的 HTTP 方法的名稱,例如,GET、POST 或 PUT
String getRequestURI()從協議名稱直到 HTTP 請求的第一行的查詢字符串中,返回該請求的 URL 的一部分
String getContextPath()返回指示請求上下文的請求 URI 部分
String getQueryString()返回包含在路徑后的請求 URL 中的查詢字符串
Enumeration getParameterNames()返回一個 String 對象的枚舉,包含在該請求中包含的參數的名稱
String getParameter(Stringname)以字符串形式返回請求參數的值,或者如果參數不存在則返回null
String[] getParameterValues(String name)返回一個字符串對象的數組,包含所有給定的請求參數的值,如果參數不存在則返回 null
Enumeration getHeaderNames()返回一個枚舉,包含在該請求中包含的所有的頭名
String getHeader(String name)以字符串形式返回指定的請求頭的值
String getCharacterEncoding()返回請求主體中使用的字符編碼的名稱
String getContentType()返回請求主體的 MIME 類型,如果不知道類型則返回 null
int getContentLength()以字節為單位返回請求主體的長度,并提供輸入流,或者如果長度未知則返回 -1
InputStream getInputStream()用于讀取請求的 body 內容. 返回一個 InputStream 對象

打印請求信息

@WebServlet("/showRequest")
public class ShowRequestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//設置響應的 content-type 告訴瀏覽器 響應的body里的格式是啥樣的resp.setContentType("text/html");//搞個 StringBuilder 把這些api的結果拼起來,統一寫回到響應中StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(req.getProtocol());stringBuilder.append("<br>");stringBuilder.append(req.getMethod());stringBuilder.append("<br>");stringBuilder.append(req.getRequestURI());stringBuilder.append("<br>");stringBuilder.append(req.getContextPath());stringBuilder.append("<br>");stringBuilder.append(req.getQueryString());stringBuilder.append("<br>");//獲取到 header 中所有的鍵值對Enumeration<String> headerNames = req.getHeaderNames();while (headerNames.hasMoreElements()){String headerName = headerNames.nextElement();stringBuilder.append(headerName + ": " + req.getHeader(headerName));stringBuilder.append("<br>");}resp.getWriter().write(stringBuilder.toString());}
}

在瀏覽器通過 URL http://127.0.0.1:8080/hello_servlet/showRequest 訪問, 可以看到:
在這里插入圖片描述

前端給后端傳參

1.通過GET里的query string

在前端給后端傳兩個數字,一個是同學的studentId,一個是classId

@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//預期瀏覽器會發一個形如 /getParameter?studentId=10&classId=20 這樣的請求// 借助req 里的 getParameter方法就能拿到 query string 中的鍵值對內容//getParameter 得到的是 String 類型的結果String studentId = req.getParameter("studentId");String classId = req.getParameter("classId");resp.setContentType("text/html");resp.getWriter().write("studentId = " + studentId + " classId = " + classId);}
}

在這里插入圖片描述
如果key在query string中不存在,此時就返回值就是null

2.通過POST,借助form表單的方式
對于前端是form表單這樣格式的數據(也是鍵值對,和query string的格式一樣,只是這部分內容在body中),后端還是使用getParameter來獲取.

前端代碼:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="postParameter" method="post"><input type="text" name="studentId"><input type="text" name="classId"><input type="submit" value="提交"></form>
</body>
</html>

在這里插入圖片描述

后端代碼:

@WebServlet("/postParameter")
public class PostParameterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String studentId = req.getParameter("studentId");String classId = req.getParameter("classId");resp.setContentType("text/html");resp.getWriter().write("studentId = " + studentId + " classId = " + classId);}
}

在這里插入圖片描述

使用getParameter 既可以獲取到query string 中的鍵值對,也可以獲取到form表單構造的body中的鍵值對.

在這里插入圖片描述

3.POST里的json

json是一種非常主流的數據格式,也是鍵值對結構.
在這里插入圖片描述
我們可以把body按照這個格式來組織.前端可以通過ajax的方式來構造出這個內容,更簡單的方法使用postman直接構造.

在這里插入圖片描述

后端代碼:

@WebServlet("/postParameter2")
public class PostParameter2Servlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//通過這個方法來處理 body 為 json 格式的數據//直接把 req 對象里 body 完整的讀取出來//getInputStream// 在流對象中讀多少字節取決于Content-Lengthint length = req.getContentLength();byte[] buffer = new byte[length];InputStream inputStream = req.getInputStream();inputStream.read(buffer);//把這個字節數組構造成 String 打印出來String body = new String(buffer,0,length,"utf8");System.out.println("body =" + body);resp.getWriter().write(body);}
}

然后在postman那塊點擊Send請求,服務器也相對應打印出了從body中讀出的數據.
在這里插入圖片描述

總結:借助postman構造出post請求,body就是json數據,請求到達Tomcat,Tomcat解析成req對象,再通過req.getInputStream讀取body內容,把讀出的結果構造成響應往回寫,最后postman客戶端收到了對應的結果.

當前通過json傳遞數據,但是服務器這邊只是把整個body讀出來,沒有按照鍵值對的方式來處理,還不能根據key獲取value,為了解決這個問題,我們可以使用jackson第三方庫.

通過maven引入第三方庫:

在這里插入圖片描述

在這里插入圖片描述

將所選的內容粘貼到pom.xml當中:

在這里插入圖片描述

然后上面的后端代碼就需要改變:

class Student{public int studentId;public int classId;
}
@WebServlet("/postParameter2")
public class PostParameter2Servlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Student student = objectMapper.readValue(req.getInputStream(),Student.class);System.out.println(student.studentId + ", " + student.classId);}
}

在這里插入圖片描述

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

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

相關文章

gin的占位符:和通配符*

1、用法 在 Gin 路由中&#xff0c;可以使用一個通配符&#xff08;*&#xff09;或一個占位符&#xff08;:&#xff09;來捕獲 URL 的一部分。 r.GET("/royal/:id", func(c *gin.Context) {id : c.Param("id")//fmt.Println("into :id")c.Str…

成都到長沙自駕游路線推薦-成都至長沙自駕游攻略

請問成都到長沙自駕怎么走&#xff0c;中途在哪里休息比較合適&#xff0c;沿途有哪些景點&#xff1f; 在湖南湘西的吉首落腳是首選 一&#xff0c;成都到吉首 約在800公里。全程高速估計就是 9個小時左右。如果上午出發&#xff0c;差不多可以到吉首吃晚餐&#xff0c;再住酒…

ef core 分頁

在使用 Entity Framework Core&#xff08;EF Core&#xff09;進行分頁查詢時&#xff0c;你可以借助以下方法來實現&#xff1a; 使用 Skip 和 Take 方法&#xff1a;Skip 方法用于跳過指定數量的記錄&#xff0c;而 Take 方法用于選擇指定數量的記錄。結合使用這兩個方法&am…

HBase API

我們之后的實際開發中不可能在服務器那邊直接使用shell命令一直敲的&#xff0c;一般都是通過API進行操作的。 環境準備 新建Maven項目&#xff0c;導入Maven依賴 <dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>…

命令執行漏洞

1、命令執行漏洞 1.1、簡介 Django是用Python開發的一個免費開源的Web結構&#xff0c;幾乎包括了Web使用方方面面&#xff0c;能夠用于快速建立高性能、文雅的網站&#xff0c;Diango提供了許多網站后臺開發常常用到的模塊&#xff0c;使開發者可以專注于業務部分。 1.2、漏…

【Terraform學習】管理顯式依賴關系-depends_on(Terraform配置語言學習)

背景&#xff1a; 關于如何在機器上拉terraform代碼&#xff0c;初始化就不重復了&#xff0c;需要的可以查看前面的文章&#xff1a; 【Terraform學習】Terraform-AWS部署快速入門&#xff08;快速入門&#xff09;_向往風的男子的博客-CSDN博客 管理顯式依賴關系 隱式依賴…

【刪除vlan的方法】

提示錯誤 [SW1]undo vlan 10 Error: The VLAN has a L3 interface. Please delete it first. 解決辦法 undo interface Vlanif10 #刪除vlan 10下的接口 [SW1-GigabitEthernet0/0/1]dis this #刪除下列的IP

接口自動化必備技能——jmeter提取token方式以及設置成全局變量(跨線程組傳token值)方式

前言 今天Darren洋教大家如何使用jmeter中的插件來進行token值的提取與調用&#xff0c;今天Darren洋介紹兩種jmeter提取token值的方式&#xff0c;一種是在當前線程組中直接提取token值&#xff0c;一種是跨線程組的方式進行token值的提取并調用給不同線程組里的HTTP接口使用。…

如何讀取文件夾內的諸多文件,并選擇性的保留部分文件

目錄 問題描述: 問題解決: 問題描述: 當前有一個二級文件夾,第一層是文件夾名稱是“Papers(LNAI14302-14304)",第二級文件夾目錄名稱如下圖藍色部分所示。第三層為存放的文件,如下下圖所示,每一個文件中,均存放三個文件,分別為copyright.pdf, submission.pdf, s…

【PYTHON】WebSocket服務端與客戶端通信實現

目錄 1 簡介 2 WebSocket優點 3 前后端交互的方式 4 心跳機制和重連機制 5 后端代碼 6 測試

重磅發布!曙光存儲“3+N”,綠色存力新選擇

8月9-10日&#xff0c;2023年數據中心市場年會在京舉辦。會上&#xff0c;中科曙光存儲產品事業部總監石靜發表《綠色存力 打通綠色數據中心最后一站》主題演講。“在今天&#xff0c;數據中心正在成為‘高能耗’產業&#xff0c;綠色節能從可選項走向必選項。曙光存儲跨越綠色…

管理 IBM Spectrum LSF

管理 IBM Spectrum LSF 了解如何管理 IBM Spectrum LSF 集群&#xff0c;控制守護程序&#xff0c;更改集群配置以及使用主機和隊列。 管理 LSF 作業和作業調度策略。 查看作業信息和控制作業。 了解如何配置資源并將其分配給 LSF 作業。 了解如何在 LSF 集群中提交&#xff0…

開發測試框架一 - 創建springboot工程及基礎操作

一、創建及運行方式 1. 從官網導入&#xff1a; 注意&#xff1a;由于我的java版本是1.8&#xff1b;所以選中了spring2.7.14&#xff1b;如果你的java版本是9及以上&#xff0c;選中spring3相關的同時Java 版本也要對應起來 2. 創建第一個get請求 創建Controller package及…

mysql滑動窗口案例

獲取學科最高分 SELECT DISTINCT name,subject,MAX(score) OVER (PARTITION by subject) as 此學科最高分數 from scores;獲取學科的報名人數 select DISTINCT subject,count(name) over (partition by subject) as 報名此學科的人數 from scores; 求學科總分 SELECT DISTI…

JavaScript高級:常見設計模式

設計模式是在軟件開發中重復出現的問題的解決方案&#xff0c;它們是經過驗證的、被廣泛接受的最佳實踐。設計模式可以讓我們避免重復造輪子&#xff0c;提高代碼質量和可維護性。在本文中&#xff0c;我們將介紹幾種常見的設計模式&#xff0c;以及它們的實現和應用。 1. 單例…

Conda(Python管理工具)

1.簡介 Conda是一個開源的包管理器和環境管理器&#xff0c;主要用于管理Python&#xff0c;但也可以用于其他語言。它主要用于安裝、管理和更新軟件包及其依賴項&#xff0c;以及創建、保存、加載和切換不同的開發環境。Conda可以在Windows、MacOS和Linux系統上使用&#xff…

Spring Boot + Vue3前后端分離實戰wiki知識庫系統十二--用戶管理單點登錄開發一...

目標&#xff1a; 在上一次https://www.cnblogs.com/webor2006/p/17533745.html我們已經完成了文檔管理的功能模塊開發&#xff0c;接下來則開啟新模塊的學習---用戶登錄&#xff0c;這塊還是有不少知識點值得學習的&#xff0c;先來看一下整體的效果&#xff0c;關于效果官網有…

2023全國大學生數學建模競賽C提思路模型代碼

目錄 1.C題思路模型&#xff1a;比賽開始后&#xff0c;第一時間更新&#xff0c;獲取見文末名片 2.比賽時間&#xff1a;2023年9月7日18點到2023年9月10日20點 3 全國大學生數學建模競賽常見數模問題 3.1 分類問題 3.2 優化問題 詳細思路見此名片&#xff0c;開賽第一時間…

YOLOv8目標檢測算法

YOLOv8目標檢測算法相較于前幾代YOLO系列算法具有如下的幾點優勢&#xff1a; 更友好的安裝/運行方式速度更快、準確率更高新的backbone&#xff0c;將YOLOv5中的C3更換為C2FYOLO系列第一次嘗試使用anchor-free新的損失函數 YOLOv8簡介 YOLOv8 是 Ultralytics 公司繼 YOLOv5…

FiboSearch Pro – Ajax Search for WooCommerce 商城AJAX實時搜索插件

FiboSearch Pro是最受歡迎的WooCommerce 產品搜索插件。它為您的用戶提供精心設計的高級 AJAX 搜索欄&#xff0c;并提供實時搜索建議。默認情況下&#xff0c;WooCommerce 提供非常簡單的搜索解決方案&#xff0c;沒有實時產品搜索&#xff0c;甚至沒有 SKU 搜索。FiboSearch&…