主頁 > 後端開發 > Servlet p3 HttpServletRequest物件

Servlet p3 HttpServletRequest物件

2023-06-29 08:18:01 後端開發

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>
    

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/556220.html

標籤:其他

上一篇:Golang 簡單的資料對齊可提高程式速度和記憶體使用率

下一篇:返回列表

標籤雲
其他(161792) Python(38259) JavaScript(25515) Java(18273) C(15238) 區塊鏈(8273) C#(7972) AI(7469) 爪哇(7425) MySQL(7271) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4607) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1985) HtmlCss(1976) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Servlet p3 HttpServletRequest物件

    # HttpServletRequest物件 ## 基本介紹 ? **HttpServletRequest物件:**HttpServletRequest 物件專門用于封裝 HTTP 請求訊息,簡稱 request 物件。主要作用是用來接收客戶端發送過來的請求資訊,該物件是由Tomcat封裝好傳遞過來 ......

    uj5u.com 2023-06-29 08:18:01 more
  • Golang 簡單的資料對齊可提高程式速度和記憶體使用率

    ### 序 Golang 中的結構或 struct 是用戶定義的型別,允許將可能不同型別的項分組/組合為單一型別。 可以說是一個不支持繼承但支持組合的輕量級類。 我們使用 Golang 撰寫代碼的時候,你肯定使用過`struct`。 但是,你可能不知道的是,通過簡單地重新排序結構中的欄位,可以極大地 ......

    uj5u.com 2023-06-29 08:16:34 more
  • 一個JVM引數,服務超時率降了四分之三

    先說結論:通過優化Xms,改為和Xmx一致,使系統的超時率降了四分之三 ![image.png](https://img2023.cnblogs.com/blog/2058002/202306/2058002-20230628185820689-1353266318.png) # 1. 背景 一個同 ......

    uj5u.com 2023-06-29 08:16:15 more
  • Cognos教程_編程入門自學教程_菜鳥教程-免費教程分享

    ## 教程簡介 Cognos是在BI核心平臺之上,以服務為導向進行架構的一種資料模型,是唯一可以通過單一產品和在單一可靠架構上提供完整業務智能功能的解決方案。它可以提供無縫密合的報表、分析、記分卡、儀表盤等解決方案,通過提供所有的系統和資料資源,以簡化公司各員工處理資訊的方法。作為一個全面、靈活的產 ......

    uj5u.com 2023-06-29 08:16:03 more
  • [滲透測驗]—6.1 無線網路基礎知識

    在本章節中,我們將學習一些關于無線網路的基礎知識,如WEP、WPA和WPA2等加密技術。我們將盡量講解得詳細、通俗易懂,并提供盡可能多的實體。 ### 6.1 無線網路基礎 無線局域網(WLAN)是一種基于無線電波傳輸的計算機網路,可以實作設備之間的通信和互聯。在家庭、企業和公共場所,無線網路已經成 ......

    uj5u.com 2023-06-29 08:15:54 more
  • LRU 快取淘汰演算法

    > Least Recently Used(LRU) 是快取淘汰一種常用的策略,記憶體滿了則優先洗掉最久沒被使用的資料。 ## LRU 演算法的需求 1. 接收一個引數 `capacity` 作為快取的最大容量 2. 實作一個函式 `put()` 添加資料到快取 3. 實作一個函式 `get()` 查詢 ......

    uj5u.com 2023-06-29 08:15:48 more
  • JDBC p1 JDBC概述

    # JDBC概述 ## 基本介紹 1. JDBC為訪問不同的資料庫提供了統一的介面,為使用者屏蔽了細節問題。 2. Java程式員使用JDBC,可以連接任何提供了JDBC驅動程式的資料庫系統,從而完成對資料庫的各種操作。 3. **JDBC的基本原理:** ![](https://img2023.c ......

    uj5u.com 2023-06-29 08:15:37 more
  • Spring 賭上未來一擊,推出回應式框架 WebFlux,代碼更優雅,性能更強!

    ### Spring-webflux簡介 spring-webflux是spring在5.0版本后提供的一套回應式編程風格的web開發框架,大量測評證明,使用WebFlux開發介面能夠大幅提升介面的吞吐量。 這個框架包含了spring-framework和spring mvc,它可以運行在Netty ......

    uj5u.com 2023-06-29 08:15:27 more
  • 解鎖高質量檔案轉換:通過Java應用程式免費將PDF轉換為XPS

    在當今數字時代,檔案轉換已經成為我們日常生活中不可或缺的一部分。然而,不是所有的檔案格式都是平等無差的,在與他人共享檔案時可能會遇到兼容性問題。這就是我們需要進行檔案格式轉換的原因,而將PDF轉換為XPS是一種受歡迎的轉換選擇。如果你正在尋找一種使用Java將PDF檔案轉換為XPS的方法,不妨試試F... ......

    uj5u.com 2023-06-29 08:15:19 more
  • Conda 命令深入指南

    # Conda 命令深入指南 Conda 是一個功能強大的包管理系統,允許您為不同的專案創建和管理隔離的環境,從而更輕松地處理不同的依賴項集。 ## 安裝 可以按照 Conda 官方網站 (https://conda.io) 上提供的說明下載并安裝 Conda。 安裝后,可以打開終端或命令提示符并開 ......

    uj5u.com 2023-06-29 08:15:14 more