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.mzph.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在癌症发展中的…

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…

【Linux】华为服务器使用U盘安装统信操作系统

目录 一、准备工作 1.1 下载UOS官方系统 &#xff11;.&#xff12;制作启动U盘 1.3 服务器智能管理系统iBMC 二、iBMC设置U盘启动 一、准备工作 1.1 下载UOS官方系统 服务器CPU的架构是x86-64还是aarch64&#xff09;,地址&#xff1a;统信UOS生态社区 - 打造操作系统创…

cursor重构谷粒商城04——vagrant技术快速部署虚拟机

前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶到中高阶程序员。 本项目将基于谷粒商城…

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

在搭建图床之前我们需要知道图床是一个什么东西,图床顾名思义就是存放图片的地方&#xff0c;那么我们为什么要搭建图床呢&#xff1f;因为我们在写博客的时候&#xff0c;很多同学都是在本地使用typora或者是obsidian进行markdown语法的文章的书写&#xff0c;文件格式通常都是…

SSM东理咨询交流论坛

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 js…

http的请求体各项解析

一、前言 做Java开发的人员都知道&#xff0c;其实我们很多时候不单单在写Java程序。做的各种各样的系统&#xff0c;不管是PC的 还是移动端的&#xff0c;还是为别的系统提供接口。其实都离不开http协议或者https 这些东西。Java作为编程语言&#xff0c;再做业务开发时&#…

【云安全】云原生-Docker(五)容器逃逸之漏洞利用

漏洞利用逃逸 通过漏洞利用实现逃逸&#xff0c;主要分为以下两种方式&#xff1a; 1、操作系统层面的内核漏洞 这是利用宿主机操作系统内核中的安全漏洞&#xff0c;直接突破容器的隔离机制&#xff0c;获得宿主机的权限。 攻击原理&#xff1a;容器本质上是通过 Linux 的…

微信小程序date picker的一些说明

微信小程序的picker是一个功能强大的组件&#xff0c;它可以是一个普通选择器&#xff0c;也可以是多项选择器&#xff0c;也可以是时间、日期、省市区选择器。 官方文档在这里 这里讲一下date picker的用法。 <view class"section"><view class"se…

[java] 面向对象进阶篇1--黑马程序员

目录 static 静态变量及其访问 实例变量及其访问 静态方法及其访问 实例方法及其访问 总结 继承 作用 定义格式 示例 总结 子类不能继承的内容 继承后的特点 成员变量 成员变量不重名 成员变量重名 super访问父类成员变量 成员方法 成员方法不重名 成员方法…

AI News(1/21/2025):OpenAI 安全疏忽:ChatGPT漏洞引发DDoS风险/OpenAI 代理工具即将发布

1、OpenAI 的安全疏忽&#xff1a;ChatGPT API 漏洞引发DDoS风险 德国安全研究员 Benjamin Flesch 发现了一个严重的安全漏洞&#xff1a;攻击者可以通过向 ChatGPT API 发送一个 HTTP 请求&#xff0c;利用 ChatGPT 的爬虫对目标网站发起 DDoS 攻击。该漏洞源于 OpenAI 在处理…

LLMs的星辰大海:大语言模型的前世今生

文章目录 一. LLM 的演进&#xff1a;从规则到智能的跃迁 &#x1f4ab;1.1 语言模型的蹒跚起步 &#x1f476;1.2 RNN 与 LSTM&#xff1a;序列建模的尝试 &#x1f9d0;1.3 Transformer 的横空出世&#xff1a;自注意力机制的革命 &#x1f4a5;1.4 LLM &#xff1a;从预测到…

7-Zip高危漏洞CVE-2025-0411:解析与修复

7-Zip高危漏洞CVE-2025-0411&#xff1a;解析与修复 免责声明 本系列工具仅供安全专业人员进行已授权环境使用&#xff0c;此工具所提供的功能只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利…

数据结构(精讲)----树(应用篇)

特性&#xff1a; 什么是树&#xff1a; 树(Tree)是(n>0)个节点的有限集合T&#xff0c;它满足两个条件&#xff1a; (1) 有且仅有一个特定的称为根&#xff08;Root&#xff09;的节点。 (2) 其余的节点可以分为m&#xff08;m≥0&#xff09;个互不相交的有限集合T1、…

【动态规划】--- 斐波那契数模型

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey &#x1f3e0; 第N个泰波那契数模型 &#x1f4cc; 题目解析 第N个泰波那契数 题目要求的是泰波那契数&#xff0c;并非斐波那契数。 &…

如何确保Spring单例Bean在高并发环境下的安全性?

在Spring中&#xff0c;单例Bean就像是一个“公共的水杯”&#xff0c;整个应用程序中的所有线程都会共享这一个实例。在大部分情况下&#xff0c;这没什么问题&#xff0c;但如果多个线程同时想要修改这个“水杯”里的内容&#xff0c;就可能会出现问题了。 想象一下&#xff…