Java Web-Request與Response

在 Java Web 開發中,Request?和?Response?是兩個非常重要的對象,用于在客戶端和服務器之間進行請求和響應的處理,以下是詳細介紹:

Request(請求對象)

Request繼承體系

在 Java Web 開發中,通常涉及到的?request?對象主要是指?HttpServletRequest繼承體系如下:

頂層接口:java.util.EventListener

雖然它不是直接與?HttpServletRequest?功能相關的父類,但從 Java 事件監聽體系角度來說,它是很多相關類間接實現的接口。EventListener?是所有事件監聽器接口必須實現的標記接口,不過在?HttpServletRequest?的直接繼承體系中并不直接體現它的影響。

直接相關繼承體系

  1. javax.servlet.ServletRequest?接口
    • 這是一個核心的基礎接口,定義了所有 Servlet 請求對象必須實現的基本方法。這些方法提供了獲取請求參數、屬性、請求輸入流等通用功能,使得 Servlet 能夠處理客戶端的請求數據。例如,getParameter(String name)?方法用于獲取請求中的參數值。
  2. javax.servlet.http.HttpServletRequest?接口
    • 繼承自?ServletRequest?接口,專門針對 HTTP 請求進行擴展。由于 HTTP 協議是 Web 應用中最常用的協議,HttpServletRequest?接口添加了許多與 HTTP 協議相關的方法。比如,getMethod()?可以獲取 HTTP 請求的方法(如 GET、POST 等);getHeader(String name)?用于獲取 HTTP 請求頭信息。
  3. 具體實現類
    • 在不同的 Servlet 容器(如 Tomcat、Jetty 等)中,會有具體的?HttpServletRequest?實現類。以 Tomcat 為例,它的實現類是?org.apache.catalina.connector.RequestFacade。這些實現類會實現?HttpServletRequest?接口定義的所有方法,完成具體的請求處理邏輯。當客戶端發起請求時,Servlet 容器會創建該實現類的對象,并將其作為參數傳遞給 Servlet 的處理方法(如?doGetdoPost),讓開發者可以通過這個對象來處理請求。

需要注意的是,從 Servlet 4.0 開始,包名從?javax.servlet?變更為?jakarta.servlet,所以對應的接口變為?jakarta.servlet.ServletRequest?和?jakarta.servlet.http.HttpServletRequest,但繼承體系的邏輯結構保持不變。

  • 概念Request?對象封裝了客戶端發送給服務器的請求信息,包括請求頭、請求參數、請求方法等。在 Servlet 開發中,常見的實現類是?HttpServletRequest它提供了一系列方法來獲取請求相關的數據。
  • 主要方法及作用
    • 獲取請求參數
      • getParameter(String name):根據參數名獲取單個參數值,如?String username = request.getParameter("username");,常用于獲取表單提交的單個數據。
      • getParameterValues(String name):獲取指定參數名的所有值(適用于復選框等會提交多個值的情況),返回一個字符串數組。
      • getParameterMap():獲取所有請求參數,返回一個?Map<String, String[]>,其中鍵是參數名,值是參數值數組。
    • 獲取請求頭信息getHeader(String name)?用于根據頭名稱獲取請求頭的值,例如?String userAgent = request.getHeader("User - Agent");?可獲取客戶端瀏覽器信息。
    • 獲取請求方法getMethod()?方法返回客戶端發送請求的 HTTP 方法,如 "GET"、"POST" 等。
    • 解決亂碼問題:對于 POST 請求,可通過?setCharacterEncoding("UTF - 8");?設置字符編碼來解決參數亂碼問題。對于 GET 請求,有時需要額外的編碼轉換操作。
    • 請求轉發getRequestDispatcher(String path).forward(request, response);?可實現請求轉發,將當前請求轉發到另一個資源(Servlet、JSP 等),轉發過程在服務器端完成,客戶端地址欄不變。
    • package com.itheima.web;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.BufferedReader;
      import java.io.IOException;import static javax.servlet.http.HttpUtils.getRequestURL;@WebServlet("/req1")
      public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//String getMethod()  獲取請求方式:GETString method = req.getMethod();System.out.println("method:" + method);//GET//String getContextPath():獲取虛擬目錄(項目訪問路徑):/webDemoString contextPath = req.getContextPath();System.out.println(contextPath);//StringBuffer getRequestURL(): 獲取URL(統一資源定位符):http://localhost:8080/webDemo/req1StringBuffer requestURL = req.getRequestURL();System.out.println(requestURL.toString());//String getReQuestURI():獲取URI(統一資源標識符):/webDemo/req1String requestURI = req.getRequestURI();System.out.println(requestURI);//String getQueryString():獲取請求參數(GET方式):username=zhangsanString queryString = req.getQueryString();System.out.println(queryString);//-----------//獲取請求頭:user-agent:瀏覽器的版本信息String agent = req.getHeader("user-agent");System.out.println(agent);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取Post請求信息用的是IO流,最后打印信息BufferedReader reader = req.getReader();String line = reader.readLine();System.out.println(line);}}
      

Response(響應對象)

  • 概念Response?對象用于封裝服務器對客戶端請求的響應信息,服務器通過它向客戶端發送響應狀態碼、響應頭和響應體等內容。在 Servlet 開發中,常見的實現類是?HttpServletResponse
  • 主要方法及作用
    • 設置響應狀態碼setStatus(int sc)?用于設置 HTTP 響應狀態碼,如?response.setStatus(200);?表示請求成功,response.setStatus(404);?表示資源未找到。
    • 設置響應頭setHeader(String name, String value)?用于設置響應頭字段,如?response.setHeader("Content - Type", "text/html;charset=UTF - 8");?設置響應內容類型和字符編碼;response.setHeader("Location", "new - url");?配合 302 狀態碼用于重定向。
    • 重定向sendRedirect(String location)?方法可實現重定向功能,它會設置狀態碼為 302,并設置?Location?響應頭,讓客戶端重新請求指定的 URL,客戶端地址欄會改變。
    • 獲取輸出流
      • getWriter():獲取字符輸出流?PrintWriter,用于向客戶端輸出文本數據,如 HTML、JSON 等。
      • getOutputStream():獲取字節輸出流?ServletOutputStream,用于輸出二進制數據,如圖片、文件等。但要注意,getWriter()?和?getOutputStream()?不能同時使用。

?如何使用Request和Response對象

在 Java Web 開發中,HttpServletRequest?和?HttpServletResponse?對象是處理客戶端請求和發送服務器響應的核心工具。以下詳細介紹它們的常見使用場景和示例代碼:

1. 獲取請求參數

使用?HttpServletRequest?對象可以方便地獲取客戶端請求中攜帶的參數。

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("/paramDemo")
public class ParamDemoServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 獲取單個參數String username = request.getParameter("username");// 獲取多個參數(如復選框)String[] hobbies = request.getParameterValues("hobby");response.setContentType("text/html;charset=UTF-8");response.getWriter().println("用戶名: " + username);if (hobbies != null) {response.getWriter().println("愛好: ");for (String hobby : hobbies) {response.getWriter().println(hobby);}}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 解決POST請求中文亂碼問題request.setCharacterEncoding("UTF-8");doGet(request, response);}
}

2. 獲取請求頭信息

可以使用?HttpServletRequest?對象獲取客戶端請求頭中的各種信息。

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("/headerDemo")
public class HeaderDemoServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 獲取指定請求頭String userAgent = request.getHeader("User-Agent");response.setContentType("text/html;charset=UTF-8");response.getWriter().println("User-Agent: " + userAgent);}
}

3. 請求轉發

請求轉發是服務器內部的一種資源跳轉方式,使用?RequestDispatcher?實現。

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("/forwardDemo")
public class ForwardDemoServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 設置請求屬性request.setAttribute("message", "這是轉發傳遞的消息");// 獲取RequestDispatcher對象request.getRequestDispatcher("/targetServlet").forward(request, response);}
}@WebServlet("/targetServlet")
public class TargetServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 獲取請求屬性String message = (String) request.getAttribute("message");response.setContentType("text/html;charset=UTF-8");response.getWriter().println("接收到的消息: " + message);}
}

4. 重定向

重定向會讓客戶端重新向新的 URL 發送請求,使用?HttpServletResponse?的?sendRedirect?方法。

package com.itheima.web;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("/resp1")
public class ResponseDemo1 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("resp1...");// 重定向//第一種方法//1. 設置響應狀態碼 302resp.setStatus (302);//2. 設置響應頭 Locationresp.setHeader ("Location","/webDemo/resp2");
//第二種方法// 簡化方式完成重定向resp.sendRedirect ("/webDemo/resp2");}
}

5. 設置響應頭和響應體

使用?HttpServletResponse?對象可以設置響應頭信息和向客戶端輸出響應體內容。

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("/responseDemo")
public class ResponseDemoServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 設置響應頭response.setContentType("text/html;charset=UTF-8");response.setHeader("Cache-Control", "no-cache");// 獲取字符輸出流,輸出響應體response.getWriter().println("<html><body>");response.getWriter().println("<h1>這是一個響應示例</h1>");response.getWriter().println("</body></html>");}
}

Response響應字節數據

發送字節數據

當需要發送二進制數據,如圖片、音頻、視頻等時,使用?ServletOutputStream?來發送字節數據。以下是一個簡單的示例,展示如何從服務器讀取圖片文件并將其作為字節數據發送給客戶端:

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.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;@WebServlet("/sendByteData")
public class SendByteDataServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 設置響應內容類型為圖片類型response.setContentType("image/jpeg");// 獲取要發送的圖片文件的輸入流InputStream inputStream = new FileInputStream("path/to/your/image.jpg");// 獲取響應的輸出流OutputStream outputStream = response.getOutputStream();// 定義緩沖區byte[] buffer = new byte[1024];int bytesRead;// 從輸入流讀取數據并寫入輸出流while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}// 關閉輸入流inputStream.close();}
}

代碼解釋

  1. 設置響應內容類型:通過?response.setContentType("image/jpeg")?設置響應內容類型為 JPEG 圖片類型,讓客戶端知道接收到的是圖片數據。
  2. 獲取輸入流和輸出流:使用?FileInputStream?打開要發送的圖片文件,獲取文件的輸入流;通過?response.getOutputStream()?獲取響應的輸出流,用于將數據發送給客戶端。
  3. 數據傳輸:使用一個緩沖區?byte[] buffer?從輸入流讀取數據,并將其寫入輸出流,直到文件讀取完畢。
  4. 關閉輸入流:操作完成后,關閉輸入流以釋放資源。

Response響應字符數據

發送字符數據

當需要發送文本數據,如 HTML、JSON、純文本等時,使用?PrintWriter?來發送字符數據。以下是一個示例,展示如何向客戶端發送一段 HTML 內容:

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.io.PrintWriter;@WebServlet("/sendCharData")
public class SendCharDataServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 設置響應內容類型和字符編碼response.setContentType("text/html;charset=UTF-8");// 獲取響應的字符輸出流PrintWriter writer = response.getWriter();// 向輸出流寫入 HTML 內容writer.println("<html>");writer.println("<head><title>字符數據響應示例</title></head>");writer.println("<body>");writer.println("<h1>這是一段 HTML 內容</h1>");writer.println("</body>");writer.println("</html>");// 刷新輸出流writer.flush();// 關閉輸出流writer.close();}
}

代碼解釋

  1. 設置響應內容類型和字符編碼:通過?response.setContentType("text/html;charset=UTF-8")?設置響應內容類型為 HTML 文本,并指定字符編碼為 UTF - 8,確保中文等字符能正確顯示。
  2. 獲取字符輸出流:使用?response.getWriter()?獲取響應的字符輸出流?PrintWriter
  3. 寫入數據:使用?writer.println()?方法向輸出流寫入 HTML 內容。
  4. 刷新和關閉輸出流:調用?writer.flush()?方法將緩沖區的數據刷新到客戶端,最后關閉輸出流以釋放資源。

需要注意的是,getOutputStream()?和?getWriter()?方法不能同時使用,否則會拋出?IllegalStateException?異常。

通過以上示例,你可以了解到?HttpServletRequest?和?HttpServletResponse?在不同場景下的基本使用方法,它們是 Java Web 開發中處理請求和響應的基礎。

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

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

相關文章

李沐vscode配置+github管理+FFmpeg視頻搬運+百度API添加翻譯字幕

終端輸入nvidia-smi查看cuda版本 我的是12.5&#xff0c;在網上沒有找到12.5的torch&#xff0c;就安裝12.1的。torch&#xff0c;torchvision&#xff0c;torchaudio版本以及python版本要對應 參考&#xff1a;https://blog.csdn.net/FengHanI/article/details/135116114 創…

論文閱讀(十六):利用線性鏈條件隨機場模型檢測陣列比較基因組雜交數據的拷貝數變異

1.論文鏈接&#xff1a;Detection of Copy Number Variations from Array Comparative Genomic Hybridization Data Using Linear-chain Conditional Random Field Models 摘要&#xff1a; 拷貝數變異&#xff08;CNV&#xff09;約占人類基因組的12%。除了CNVs在癌癥發展中的…

Alibaba Spring Cloud 十三 Nacos,Gateway,Nginx 部署架構與負載均衡方案

在微服務體系中&#xff0c;Nacos 主要承擔“服務注冊與發現、配置中心”的職能&#xff0c;Gateway&#xff08;如 Spring Cloud Gateway&#xff09;通常負責“路由轉發、過濾、安全鑒權、灰度流量控制”等功能&#xff0c;而 Nginx 則常被用作“邊緣反向代理”或“統一流量入…

Next.js 實戰 (十):中間件的魅力,打造更快更安全的應用

什么是中間件&#xff1f; 在 Next.js 中&#xff0c;中間件&#xff08;Middleware&#xff09;是一種用于處理每個傳入請求的功能。它允許你在請求到達頁面之前對其進行修改或響應。 通過中間件&#xff0c;你可以實現諸如日志記錄、身份驗證、重定向、CORS配置、壓縮等任務…

ElasticSearch-文檔元數據樂觀并發控制

文章目錄 什么是文檔&#xff1f;文檔元數據文檔的部分更新Update 樂觀并發控制 最近日常工作開發過程中使用到了 ES&#xff0c;最近在檢索資料的時候翻閱到了 ES 的官方文檔&#xff0c;里面對 ES 的基礎與案例進行了通俗易懂的解釋&#xff0c;讀下來也有不少收獲&#xff0…

實驗二 數據庫的附加/分離、導入/導出與備份/還原

實驗二 數據庫的附加/分離、導入/導出與備份/還原 一、實驗目的 1、理解備份的基本概念&#xff0c;掌握各種備份數據庫的方法。 2、掌握如何從備份中還原數據庫。 3、掌握數據庫中各種數據的導入/導出。 4、掌握數據庫的附加與分離&#xff0c;理解數據庫的附加與分離的作用。…

技術中臺與終搜——2

文章目錄 5、語言處理與自動補全技術探測5.1 自定義語料庫5.1.1 語料庫映射OpenAPI5.1.2 語料庫文檔OpenAPI 5.2 產品搜索與自動補全5.2.1 漢字補全OpenAPI5.2.2 拼音補全OpenAPI 5.3 產品搜索與語言處理5.3.1 什么是語言處理&#xff08;拼寫糾錯&#xff09;5.3.2 語言處理Op…

15_業務系統基類

創建腳本 SystemRoot.cs 因為 業務系統基類的子類 會涉及資源加載服務層ResSvc.cs 和 音樂播放服務層AudioSvc.cs 所以在業務系統基類 提取引用資源加載服務層ResSvc.cs 和 音樂播放服務層AudioSvc.cs 并調用單例初始化 using UnityEngine; // 功能 : 業務系統基類 public c…

k8s優雅重啟

理論上處于terminating狀態的pod&#xff0c;k8s 就會把它從service中移除了&#xff0c;只用配置一個優雅停機時長就行了。kubectl get endpoints 驗證 因此&#xff0c;優雅重新的核心問題&#xff0c;是怎么讓空閑長連接關閉&#xff0c;再等待處理中的請求執行完。 一些底…

【Linux】華為服務器使用U盤安裝統信操作系統

目錄 一、準備工作 1.1 下載UOS官方系統 &#xff11;.&#xff12;制作啟動U盤 1.3 服務器智能管理系統iBMC 二、iBMC設置U盤啟動 一、準備工作 1.1 下載UOS官方系統 服務器CPU的架構是x86-64還是aarch64&#xff09;,地址&#xff1a;統信UOS生態社區 - 打造操作系統創…

27. 【.NET 8 實戰--孢子記賬--從單體到微服務】--簡易報表--報表服務

報表是每個記賬應用所具備的功能&#xff0c;要實現報表功能就需要把賬本的核心功能&#xff08;記賬&#xff09;完成&#xff0c;因此報表服務作為本專欄第一部分單體應用開發中最后一個要實現的功能&#xff0c;這一篇文章很簡單&#xff0c;我們一起來實現一個簡單的報表服…

基于 Node.js 的天氣查詢系統實現(附源碼)

項目概述 這是一個基于 Node.js 的全棧應用,前端使用原生 JavaScript 和 CSS,后端使用 Express 框架,通過調用第三方天氣 API 實現天氣數據的獲取和展示。 主要功能 默認顯示多個主要城市的天氣信息 支持城市天氣搜索 響應式布局設計 深色主題界面 優雅的加載動畫 技術棧 …

cursor重構谷粒商城04——vagrant技術快速部署虛擬機

前言&#xff1a;這個系列將使用最前沿的cursor作為輔助編程工具&#xff0c;來快速開發一些基礎的編程項目。目的是為了在真實項目中&#xff0c;幫助初級程序員快速進階&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速進階到中高階程序員。 本項目將基于谷粒商城…

leetcode 面試經典 150 題:簡化路徑

鏈接簡化路徑題序號71題型字符串解法棧難度中等熟練度??? 題目 給你一個字符串 path &#xff0c;表示指向某一文件或目錄的 Unix 風格 絕對路徑 &#xff08;以 ‘/’ 開頭&#xff09;&#xff0c;請你將其轉化為 更加簡潔的規范路徑。 在 Unix 風格的文件系統中規則如下…

如何在gitee/github上面搭建obsidian的圖床

在搭建圖床之前我們需要知道圖床是一個什么東西,圖床顧名思義就是存放圖片的地方&#xff0c;那么我們為什么要搭建圖床呢&#xff1f;因為我們在寫博客的時候&#xff0c;很多同學都是在本地使用typora或者是obsidian進行markdown語法的文章的書寫&#xff0c;文件格式通常都是…

JVM堆空間

JVM&#xff08;Java虛擬機&#xff09;堆空間是Java內存管理的核心區域之一&#xff0c;用于存儲Java對象實例。以下是關于JVM堆空間的詳細介紹&#xff1a; 1. 堆空間的作用 ? 存儲對象實例&#xff1a;幾乎所有的Java對象實例&#xff08;通過new關鍵字創建的對象&#xf…

Redis 的熱 Key(Hot Key)問題及解決方法

Redis 的熱 Key&#xff08;Hot Key&#xff09;問題及解決方法 1. 什么是 Redis 熱 Key&#xff1f; Redis 熱 Key&#xff08;Hot Key&#xff09;指的是訪問頻率極高的 Key&#xff0c;通常會造成以下問題&#xff1a; 單 Key 訪問量過大&#xff1a;熱點 Key 可能被高并…

SSM東理咨詢交流論壇

&#x1f345;點贊收藏關注 → 添加文檔最下方聯系方式咨詢本源代碼、數據庫&#x1f345; 本人在Java畢業設計領域有多年的經驗&#xff0c;陸續會更新更多優質的Java實戰項目希望你能有所收獲&#xff0c;少走一些彎路。&#x1f345;關注我不迷路&#x1f345; 項目視頻 js…

http的請求體各項解析

一、前言 做Java開發的人員都知道&#xff0c;其實我們很多時候不單單在寫Java程序。做的各種各樣的系統&#xff0c;不管是PC的 還是移動端的&#xff0c;還是為別的系統提供接口。其實都離不開http協議或者https 這些東西。Java作為編程語言&#xff0c;再做業務開發時&#…

gradle生命周期鉤子函數

文章目錄 0. 總結表格1. 構建初始階段gradle.settingsEvaluated()gradle.projectsLoaded() 2. 配置階段gradle.beforeProject()gradle.afterProject()gradle.projectEvaluated()gradle.afterEvaluate()gradle.taskGraph.whenReady 3. 執行階段gradle.taskGraph.beforeTaskgradl…