Servlet 的 API

HttpServlet

? ? ? ? init:當 tomcat 收到了 /hello 這樣的路徑是請求后就會調用 HelloServlet,于是就需要對 HelloServlet 進行實例化(只實例一次,后續再有請求也不實例了)。

? ? ? ? destory:如果是通過 smart tomcat 的停止按鈕,這個操作本質上是通過 tomcat 的 8005 端口主動停止,能夠觸發 destory。但如果是直接殺進程,此時很可能來不及執行 destory(這種情況比較常見)。

? ? ? ? service:每次收到請求都會先執行 service,然后再根據請求的類型調用對應的 doxxx。

因此:Servlet 的生命周期就可以理解為:1. 一開始的時候,執行 init;2. 每次收到請求,執行 service;3. 銷毀之前,執行 destory。

處理請求

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("/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");}
}

????????這里默認是 get 請求,為了構造別的方法請求可以使用 postman 來構造,也可以通過 Ajax 寫代碼來進行構造

postman

Ajax

首先得在 webapp 目錄下創建一個 .html 的文件

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body><!-- 使用這個頁面來構造 Ajax 請求 --><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><script>$.ajax({type: 'post',//這是相對路徑的寫法//url: 'method',//這是絕對路徑的寫法url: '/hello_servlet/method',success: function (body, status) {console.log(body);}});</script>
</body>
</html>

HttpServletRequest

????????當 Tomcat 通過 Socket API 讀取 HTTP 請求(字符串), 并且按照 HTTP 協議的格式把字符串解析成 HttpServletRequest 對象.

:因為 query string 是鍵值對形式(form 表單構造的 body 也是),所以就可以通過 getParameter 放法來根據 key 獲取到 value。

獲取 GET 請求中的參數

????????GET 請求中的參數一般都是通過 query string 傳遞給服務器的. 形如:/getParameter?studentId=10&classId=20

????????此時瀏覽器通過 query string 給服務器傳遞了兩個參數, studentId 和 classId, 值分別是 10?和 11,此時在服務器端就可以通過 getParameter 來獲取到參數的值.

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("/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);}
}

????????getParameter 的返回值類型為 String. 必要的時候需要手動把 String 轉成 int 。當沒有 query string的時候, getParameter 獲取的值為 null.

獲取 POST 請求中的參數

????????POST 請求的參數一般通過 body 傳遞給服務器. body 中的數據格式有很多種. 如果是采用 form 表單的形式, 仍然可以通過 getParameter 獲取參數的值(直接可以根據 key 獲取 value)。

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("/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);}
}

創建 testPost.html, 放到 webapp 目錄中:

<form action="postParameter" method="POST"><input type="text" name="userId"><input type="text" name="classId"><input type="submit" value="提交">
</form>

form 表單點擊?提交 一定會發生頁面跳轉的

獲取 POST 請求中的參數(2)

????????如果 POST 請求中的 body 是按照 JSON 的格式來傳遞, 那么獲取參數的代碼就要發生調整。因為通過 json 傳遞數據,服務器這邊默認是把整個 body 都讀過來,即沒有按照鍵值對的方式來處理,也就不能根據 key 獲取 value。

? ? ? ? 因此,要使用第三方庫 “Jackson” 來解析 json 格式。在 maven 倉庫里搜 Jackson,然后選一個版本點進去把 xml 片段粘貼到 pom.xml 的 <dependencies> 中即可。

import com.fasterxml.jackson.databind.ObjectMapper;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;class Student {// 把屬性設為 public 的原因是能讓 外面的Jackson 獲取到這里有什么屬性public int studentId;public int classId;
}@WebServlet("/postParameter2")
public class PostParameter2Servlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 這段注釋的代碼是沒有時候第三方庫 Jackson 的,得到的是沒有被處理過的 json// 通過這個方法來處理 body 為 json 格式的數據.// 直接把 req 對象里 body 完整的讀取出來.// getInputStream// 在流對象中讀多少個字節? 取決于 Content-Length
//        int 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);// 使用 jackson 涉及到的核心對象.ObjectMapper objectMapper = new ObjectMapper();// readValue 就是把一個 json 格式的字符串轉成 Java 對象.// writeValue 把一個 java 對象轉成 json 格式字符串Student student = objectMapper.readValue(req.getInputStream(), Student.class);System.out.println(student.studentId + ", " + student.classId);}
}

HttpServletResponse

? ? ? ??Servlet 中的 doXXX 方法的目的就是根據請求計算得到相應, 然后把響應的數據設置到

HttpServletResponse 對象中. 然后 Tomcat 就會把這個 HttpServletResponse 對象按照 HTTP 協議的格式, 轉成一個字符串, 并通過 Socket 寫回給瀏覽器.

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("/redirect")
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// resp.sendRedirect("https://www.bilibili.com");  // 這是直接構造了重定向響應// 上面的一行代碼也可以分成下面兩行:先設置狀態碼,然后再設置需要跳轉到哪里resp.setStatus(302);resp.setHeader("Location", "https://www.bilibili.com");}
}

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

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

相關文章

實驗六 Java流式編程與網絡程序設計 頭歌

實驗六 Java流式編程與網絡程序設計 頭歌 制作不易&#xff01;點個關注&#xff01;給大家帶來更多價值&#xff01; 第1關 字節輸入/輸出流實現數據的保存和讀取 package step1;import java.io.*; import java.util.*;public class SortArray {public static void main(St…

洗地機品牌哪個牌子好?實力派洗地機品牌TOP10榜單

洗地機依靠其洗、拖、吸、烘為一體的功能&#xff0c;能高效的完成地面清潔的工作&#xff0c;深受大家的喜愛。但是洗地機的型號越來越多&#xff0c;功能也越來越多&#xff0c;對于不想花大價錢&#xff0c;又想要高性價比的精致人群來說實在不友好&#xff0c;所以筆者今天…

C++ 中重寫重載和隱藏的區別

重寫&#xff08;override&#xff09;、重載&#xff08;overload&#xff09;和隱藏&#xff08;overwrite&#xff09;在C中是3個完全不同的概念。我們這里對其進行詳細的說明 1、重寫&#xff08;override&#xff09;是指派生類覆蓋了基類的虛函數&#xff0c;這里的覆蓋必…

如何寫好科研論文(討論)

討論1. 如何去選取第一批要閱讀的論文&#xff1f; 當我選擇第一批要閱讀的論文時&#xff0c;我會遵循以下幾個步驟&#xff0c;以確保所選的論文對我的研究最有幫助&#xff1a; 研究問題的相關性&#xff1a; 明確我的研究問題或主題&#xff1a;首先&#xff0c;我會確保自…

實例展示vue單元測試及難題解惑

通過生動詳實的例子帶你排遍vue單元測試過程中的所有疑惑與難題。 技術棧&#xff1a;jest、vue-test-utils。 共四個部分&#xff1a;運行時、Mock、Stub、Configuring和CLI。 運行時 在跑測試用例時&#xff0c;大家的第一個絆腳石肯定是各種undifned報錯。 解決這些報錯…

【HarmonyOS4學習筆記】《HarmonyOS4+NEXT星河版入門到企業級實戰教程》課程學習筆記(九)

課程地址&#xff1a; 黑馬程序員HarmonyOS4NEXT星河版入門到企業級實戰教程&#xff0c;一套精通鴻蒙應用開發 &#xff08;本篇筆記對應課程第 16 節&#xff09; P16《15.ArkUI-狀態管理-任務統計案例》 1、實現任務進度卡片 怎么讓進度條和進度展示文本堆疊展示&#xff1…

./scripts/Makefile.clean 文件分析

文章目錄 目標 $(subdir-ymn)目標__clean $(clean-dirs): ??? make -f ./scripts/Makefile.clean obj$(patsubst _clean_%,%,$) $(clean-dirs)$(patsubst _clean_%,%,$)_clean_api _clean_cmd _clean_common _clean_disk _clean_drivers _clean_drivers/ddr/altera _clean_d…

react中的useEffect()的使用

useEffect()是react中的hook函數&#xff0c;作用是用于創建由渲染本身引起的操作&#xff0c;而不是事件的觸發&#xff0c;比如Ajax請求&#xff0c;DOM的更改 首先useEffect()是個函數&#xff0c;接受兩個參數&#xff0c;第一個參數是一個方法&#xff0c;第二個參數是數…

數據結構--樹與二叉樹--編程求以孩子兄弟表示法存儲的森林的葉結點個數

數據結構–樹與二叉樹–編程求以孩子兄弟表示法存儲的森林的葉結點個數 題目 編程求以孩子兄弟表示法存儲的森林的葉結點個數 ps&#xff1a;題目來源2025王道數據結構 思路 樹上的操作大多數是通過遞歸進行的 我們可以從根節點開始遞歸 如果結點 N 沒有孩子指針&#xff…

【Entity Framework】如何理解EF中的級聯刪除

【Entity Framework】如何理解EF中的級聯刪除 文章目錄 【Entity Framework】如何理解EF中的級聯刪除一、概述二、發生級聯行為時2.1/刪除主體/父實體2.2/斷開關系 三、發生級聯行為的位置3.1/級聯刪除被跟蹤實體3.2/數據庫中的級聯刪除 四、級聯NULL 一、概述 Entity Framewo…

vue3 路由跳轉 攜帶參數

實現功能&#xff1a;頁面A 跳轉到 頁面B&#xff0c;攜帶參數 路由router.ts import { createRouter, createWebHistory } from "vue-router";const routes: RouteRecordRaw[] [{path: "/demo/a",name: "aa",component: () > import(&quo…

x264 碼率控制原理:x264_ratecontrol_start 函數

x264_ratecontrol_start 函數 函數原理 函數功能:編碼一幀之前,為當前幀選擇一個量化 QP,屬于幀級別碼率控制;這對于控制視頻質量和文件大小至關重要。通過調整QP,編碼器可以在保持視頻質量的同時,盡可能減小輸出文件的大小。函數參數:x264_t *h: 編碼器上下文結構體指…

十七、個人信息出境標準合同的具體內容有哪些?

根據《標準合同辦法》第六條&#xff0c;標準合同應當嚴格按照網信辦制定版本訂立&#xff0c;個人信息處理者可以與境外接收方約定其他條款&#xff0c;但不得與標準合同相沖突。 根據《標準合同辦法》附件&#xff0c;目前版本的標準合同內容主要包括&#xff1a; 1. 個人信…

Flutter 中的 TextButton 小部件:全面指南

Flutter 中的 TextButton 小部件&#xff1a;全面指南 在Flutter的世界里&#xff0c;TextButton是一個基礎的小部件&#xff0c;用于創建只包含文本的按鈕。它通常用于對話框、表單以及需要強調主要操作的界面。本文將為您提供一個全面的指南&#xff0c;幫助您了解如何使用T…

地信遙感測繪電子書

《地理信息系統概論》&#xff0c;黃杏元&#xff0c;馬勁松編著&#xff0c;第三版&#xff0c;高等教育出版社&#xff0c;2008年 《地理信息系統》&#xff08;第二版&#xff09;湯國安&#xff0c;趙牡丹&#xff0c;楊昕等編&#xff0c;高等教育出版社&#xff0c;2010…

【stm32/CubeMX、HAL庫】嵌入式實驗五:定時器(2)|PWM輸出

參考&#xff1a; 【【正點原子】手把手教你學STM32CubeIDE開發】 https://www.bilibili.com/video/BV1Wp42127Cx/?p13&share_sourcecopy_web&vd_source9332b8fc5ea8d349a54c3989f6189fd3 《嵌入式系統基礎與實踐》劉黎明等編著&#xff0c;第九章定時器&#xff0c…

8操作系統定義、分類及功能+設備管理+作業管理 軟設刷題 軟考+

操作系統定義、分類及功能設備管理作業管理 知識點1-55-1010-1515-2020-2525-3030-35 刷題操作系統定義、分類及功能1-55-1010-15作業管理1-5設備管理1-55-10 知識點 1-5 1 嵌入式操作系統的特點&#xff1a; 1.微型化&#xff0c;從性能和成本角度考慮&#xff0c;希望占用的…

145.棧和隊列:刪除字符串中的所有相鄰重復項(力扣)

題目描述 代碼解決 class Solution { public:string removeDuplicates(string s) {// 定義一個棧來存儲字符stack<char> st;// 遍歷字符串中的每一個字符for(int i 0; i < s.size(); i){// 如果棧為空或棧頂字符與當前字符不相同&#xff0c;則將當前字符入棧if(st.e…

Jenkins的Pipeline流水線

目錄 前言 流水線概念 什么是流水線 Jenkins流水線 pipeline node stage step 創建一個簡單的流水線 創建Pipeline項目 選擇模板 測試 前言 提到 CI 工具&#xff0c;首先想到的就是“CI 界”的大佬——Jenkjns,雖然在云原生爆發的年代,蹦出來了很多云原生的 CI 工具…

Hive的窗口函數

定義&#xff1a; 聚合函數是針對定義的行集(組)執行聚集,每組只返回一個值.如sum()、avg()、max() 窗口函數也是針對定義的行集(組)執行聚集,可為每組返回多個值.如既要顯示聚集前的數據,又要顯示聚集后的數據.步驟&#xff1a; 1.將記錄分割成多個分區. 2.在各個分區上調用窗…