Servlet p3 HttpServletRequest對象

来源:https://www.cnblogs.com/zh-Note/archive/2023/06/28/17512696.html
-Advertisement-
Play Games

# HttpServletRequest對象 ## 基本介紹 ​ **HttpServletRequest對象:**HttpServletRequest 對象專門用於封裝 HTTP 請求消息,簡稱 request 對象。主要作用是用來接收客戶端發送過來的請求信息,該對象是由Tomcat封裝好傳遞過來 ...


HttpServletRequest對象

基本介紹

HttpServletRequest對象:HttpServletRequest 對象專門用於封裝 HTTP 請求消息,簡稱 request 對象。主要作用是用來接收客戶端發送過來的請求信息,該對象是由Tomcat封裝好傳遞過來。

​ HttpServletRequest介面是ServletRequest的子介面。HTTP 請求消息分為請求行、請求消息頭和請求消息體三部分,所以 HttpServletRequest 介面中定義了獲取請求行、請求頭和請求消息體的相關方法。

在HttpServletRequest對象在Service方法中由容器傳入過來,無需自己創建。

接收請求

常用方法

返回值類型 方法聲明 描述
StringBuffer getRequestURL() 返回客服端發出請求時的完整URL
String getRequestURI() 該方法用於獲取請求行中的資源名稱部分,即位於 URL 的主機和埠之後,參數部分之(URL 中“?”以前)的部分。
String getQueryString() 該方法用於獲取請求行中的參數部分,也就是 URL 中“?”以後的所有內容。
String getMethod() 該方法用於獲取 HTTP 請求方式(如 GET、POST 等)。
String getProtocol() 返回HTTP版本號。
String getContextPath() 返回當前 Servlet 所在的應用的名字(上下文)。對於預設(ROOT)上下文中的 Servlet,此方法返回空字元串""。

代碼演示:

package com.xxxx.servlet;

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("/s01")
public class servlet01 extends HttpServlet  {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*常用方法*/
        //輸入的地址:http://localhost:8080/ser02/s01
        //獲取請求時的完整路徑(從http開始,到 "?" 前面結束)
        String url = req.getRequestURL() + "";
        System.out.println("請求時的完整路徑:" + url);//請求時的完整路徑:http://localhost:8080/ser02/s01
        //獲取請求時的部分路徑(從項目的站點名開始,到 "?" 前面結束)
        String uri = req.getRequestURI();
        System.out.println("請求時的部分路徑:" + uri);//請求時的部分路徑:/ser02/s01
        //獲取請求時的參數字元串(從 "?" 後面開始,到最後的字元串)
        String queryString = req.getQueryString();
        System.out.println("請求時的參數字元串(從 \"?\" 後面開始,到最後的字元串):" + queryString);//請求時的參數字元串(從 "?" 後面開始,到最後的字元串):null
        //獲取請求方式(GET和POST)
        String method = req.getMethod();
        System.out.println("獲取請求方式(GET和POST):" + method);//獲取請求方式(GET和POST):GET
        //獲取當前的協議版本
        String protocol = req.getProtocol();
        System.out.println("當前的協議版本:" + protocol);//當前的協議版本:HTTP/1.1
        //獲取項目的站點名(項目的對外訪問路徑)
        String contextPath = req.getContextPath();//上下文路徑
        System.out.println("項目的站點名(項目的對外訪問路徑):" + contextPath);//項目的站點名(項目的對外訪問路徑):/ser02
    }
}

獲取請求參數

返回值類型 方法聲明 描述
String getParameter(String name) 以字元串形式返回指定的請求參數的值,或者如果參數不存在則返回 null。
String[] getParameterValues(String name) 返回一個字元串對象的數組,包含所有指定的請求參數的值,如果參數不存在則返回 null。

代碼演示:

package com.xxxx.servlet;

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("/s01")
public class servlet01 extends HttpServlet  {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*獲取請求參數*/
        //輸入的地址:http://localhost:8080/ser02/s01?uname=abc&upwd=123&hobby=sing&hobby=dance&hobby=rap
        // 獲取指定名稱的參數值(重點!!!)
        String uname = req.getParameter("uname");
        String upwd = req.getParameter("upwd");
        System.out.println("uname:" + uname + "upwd:" + upwd);//uname:abcupwd:123
        //獲取指定名稱參數的所有參數值(通常用於覆選框)

        String[] hobbies = req.getParameterValues("hobby");
        //判斷數組是否為空
        if (hobbies != null && hobbies.length > 0){
            for (String hobby : hobbies) {
                System.out.println("愛好:" + hobby);
            }
        }
        /*
        愛好:sing
        愛好:dance
        愛好:rap
         */
    }
}

請求亂碼問題

  • 基本介紹

    由於現在的request屬於接收客戶端的參數,所以必然有其預設的語言編碼,主要是由於在解析過程中預設使用的編碼方式為ISO-8859-1(此編碼不支持中文),所以解析時一定會出現亂碼。要想解決這種亂碼問題,需要設置request中的編碼方式,告訴伺服器以何種方式來解析數據。或者在接收到亂碼數據以後,再通過相應的編碼格式還原。

  • 實現方式

    • 方式一:
      request.setcharacterEncoding("UTF-8");
      這種方式只針對POST有效(必須在接收所有的數據之前設定)
    • 方式二:
      new string(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
      藉助了String對象的方法,該種方式對任何請求有效,是通用的。

Tomcat8起,以後的GET方式請求是不會出現亂碼的。

請求轉發

  • 基本介紹

    請求轉發,是一種伺服器行為,當客戶端請求達到後,伺服器進行轉發,此時會將請求對象進行保存,地址欄中的URL地址不會改變,得到響應後,伺服器端再將響應發送個客服端,從始至終只有一個請求發出

  • 特點

    1. 伺服器行為
    2. 地址欄不發生改變
    3. 從始至終只有一個請求發出
    4. request數據可以共用
  • 實現方式

    req.getRequestDispatcher(url).forward(request, response);

  • 代碼演示:

    package com.xxxx.servlet;
    
    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;
    
    /**
     * @author: 86199
     * @date: 2023/6/16 9:00
     * Description: 請求轉發,可以讓請求從服務端跳轉到客戶端(或則跳轉到指定Servlet)
     *
     * 特點:
     *  1. 服務端行為
     *  2. 地址欄不發生改變
     *  3. 從始至終都只有一個請求,s03的請求
     *  4. req數據可以共用
     */
    @WebServlet("/s03")
    public class Servlet03 extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //接收客戶端請求的參數
            String uname = req.getParameter("uname");
            System.out.println("Servlet03 uname = " + uname);
    
            //請求轉發跳轉到Servlet04(另一個Servlet對象)
    //        req.getRequestDispatcher("s04").forward(req, resp);
    
            //請求轉發跳轉到jsp頁面
            req.getRequestDispatcher("login.jsp").forward(req, resp);
    
            //請求轉發跳轉到html頁面
            req.getRequestDispatcher("login.html").forward(req, resp);
        }
    }
    
    

request作用域

  • 基本介紹

    通過該對象可以在請求中傳遞數據,作用範圍:在一次請求中有效,即伺服器跳轉有效。

  • 實現方式

    //設置域對象內容
    request.setAttribute(String name, Object o);
    //獲取域對象內容
    request.getAttribute(String name);
    //刪除域對象內容
    request.removeAttribute(String name);
    

    request 域對象中的數據在一次請求中有效,經過請求轉發,request域中的數據依然存在,即在請求轉發的過程中可以通過 request 來傳輸/共用數據。

  • 代碼演示

    package com.xxxx.servlet;
    
    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;
    import java.util.ArrayList;
    
    @WebServlet("/s05")
    public class Servlet05 extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("Servlet05...");
    
            //設置域對象內容
            req.setAttribute("name", "admin");
            req.setAttribute("age", 18);
            ArrayList<String> list = new ArrayList<>();
            list.add("aaa");
            list.add("bbb");
            req.setAttribute("list", list);
    
            //請求轉發
    //        req.getRequestDispatcher("s06").forward(req, resp);//共用一個req對象,這裡只能有一個請求轉發
    
            //請求轉發跳轉到jsp,並通過域對象傳遞數據
            req.getRequestDispatcher("index.jsp").forward(req, resp);
    
        }
    }
    
    

    index.jsp文件代碼:

    <%@ page import="java.util.List" %><%--
      Created by IntelliJ IDEA.
      User: 86199
      Date: 2023/6/12
      Time: 11:28
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
        <h2>index頁面</h2>
        <%-- 如果要在jsp中寫Java代碼,需要寫在腳本段中--%>
        <%
          //獲取域對象內容
          String name = (String) request.getAttribute("name");
          System.out.println("name = " + name);
          Integer age = (Integer) request.getAttribute("age");
          System.out.println("age = " + age);
          List<String> list = (List<String>) request.getAttribute("list");
          System.out.println("list = " + list);
        %>
      </body>
    </html>
    

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [回到目錄](https://www.cnblogs.com/lori/p/3896484.html) # 概述 委派模式(Delegate Pattern)又叫作委托模式,是一種面向對象的設計模式,允許對象組合實現與繼承相同的代碼重用。它的基本作用就是負責任務的調用和分配,是一種特殊的靜態代理模式 ...
  • [回到目錄](https://www.cnblogs.com/lori/p/3896484.html) # 責任鏈模式 它是一種設計模塊,主要將操作流程與具體操作解耦,讓每個操作都可以設置自己的操作流程,這對於工作流應用是一個不錯的選擇! 下麵是官方標準的定義:責任鏈模式是一種設計模式。在責任鏈模式 ...
  • 在筆者上一篇文章`《驅動開發:內核取應用層模塊基地址》`中簡單為大家介紹瞭如何通過遍歷`PLIST_ENTRY32`鏈表的方式獲取到`32位`應用程式中特定模塊的基地址,由於是入門系列所以並沒有封裝實現太過於通用的獲取函數,本章將繼續延申這個話題,並依次實現通用版`GetUserModuleBase... ...
  • 水滿則溢,月盈則虧,任何事物都不可能無限制的發展,我們的系統服務能力也一樣。 當隨著流量的不斷增長,達到或超過服務本身的可承載範圍,系統服務的自我保護機制的建立就顯得很重要了。 本文希望可以用最通俗的解釋和貼切的實例來帶大家瞭解什麼是限流、降級和熔斷。 ...
  • ## 前言 函數是C語言中的基本構建塊之一,它允許我們將代碼組織成可重用、模塊化的單元。 本文將逐步介紹C語言函數的基礎概念、參數傳遞、返回值、遞歸以及內聯函數和匿名函數。 ## 一、人物簡介 - 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。 ![](https://img2023 ...
  • 某日二師兄參加XXX科技公司的C++工程師開發崗位第27面: > 面試官:知道`std::unordered_set/std::unordered_map`嗎? > > 二師兄:知道。兩者都是C++11引入的新容器,和`std::set`和`std::map`功能類似,`key`唯一,`unorde ...
  • 在用 Flask 寫一個項目,後臺管理用的插件暫時是 flask-admin。想實現的效果:在後臺管理頁面中,把提交到後端的圖片不保存在 static 文件夾下麵,而是通過後端代碼把這個文件對象上傳到 AWS 的 S3中存儲。 通過flask-admin 上傳到後端的文件對象的類型是: ```pyt ...
  • 在新創建的子進程中,會把父進程的所有信息複製一份,它們之間的數據互不影響。 ### 1.使用os.fork()創建 該方式只能用於Unix/Linux操作系統中,在windows不能用。 ```python import os # 註意,fork函數,只在Unix/Linux/Mac上運行,wind ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...