Servlet(1)Request 请求对象

1、接收请求数据的流程

  1. 浏览器发送HTTP请求到Tomcat服务器
  2. HTTP的请求中会包含很多请求数据(请求行+请求头+请求体)
  3. Tomcat服务器会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中
  4. 所封装的对象即为Request对象,所以可以从Request对象中获取请求的的所有信息,如请求头、请求参数、请求路径、会话信息等
  5. 获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作

2、Request对象

Request对象是一个包含客户端发送给服务器端的所有信息的对象。它是Servlet的一个核心组件,用于收集客户端发送的表单数据、Cookies、超链接等信息,以及获取与客户端请求相关的其他数据,如请求方式、请求头信息、请求参数等。

作用是与客户端进行交互,它允许Servlet获取并处理来自客户端的请求数据。通过Request对象,Servlet可以了解客户端的请求细节,并根据这些请求数据生成相应的响应。

作用域是一次请求。在一次请求中,Servlet可以使用Request对象来获取和处理请求数据,并根据需要构建响应对象(Response对象)来发送回客户端。

3、方法

当客户端发送一个HTTP请求到Servlet时,Servlet容器(Tomcat)会自动创建一个实现了HTTPServletRequest接口的对象,这个对象包含了请求的所有信息(如请求头、请求参数、请求路径等),并将这个对象传递给Servlet的doGet()、doPost()等方法,让Servlet能够处理这个请求。Servlet容器负责管理和调用Servlet处理请求。由于不需要直接实现这个接口,而是使用Servlet容器提供的实例,所以只需要关注怎样使用接口提供的方法处理请求。

HTTP请求数据中包含了请求行、请求头、请求体,分别用各自的API方法获取对应的值:

1)请求行

请求行包括三块内容:请求方式、请求资源路径、HTTP协议及版本。

  • getMethod():获取请求方式
  • getRequestURL():获取客户端发出请求时的完整URL
  • getRequestURI():获取请求行中的资源名称部分(项目名称开始)
  • getQueryString():获取请求行中的参数部分(GET请求)
  • getProtocol():获取HTTP版本号
  • getContextPath():获取请求的上下文路径

应用举例:

@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);//GET// String getContextPath():获取虚拟目录(项目访问路径):/request-demoString contextPath = req.getContextPath();System.out.println(contextPath);// StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1StringBuffer url = req.getRequestURL();System.out.println(url.toString());// String getRequestURI():获取URI(统一资源标识符): /request-demo/req1String uri = req.getRequestURI();System.out.println(uri);// String getQueryString():获取请求参数(GET方式): username=zhangsanString queryString = req.getQueryString();System.out.println(queryString);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}

启动服务器,访问http://localhost:8080/request-demo/req1?username=zhangsan&passwrod=123,获取的结果如下:

2)请求头

请求头的数据格式是 key: value的键值对。

  •   getHeader(String name)根据请求头名称获取其对应的值

应用举例:

//获取请求头: user-agent: 浏览器的版本信息String agent = req.getHeader("user-agent");

3)请求体(POST请求)

对于POST请求,特别是当内容类型是application/json、application/xml或text/plain等时,请求体可能包含重要的数据,如JSON对象或XML文档。在这种情况下,获取请求体是非常常见的。

先获取流对象,再从流对象中拿数据。

  • BufferedReader getReader():获取字符输入流(纯文本)
BufferedReader reader = request.getReader();  
String line;  
StringBuilder requestBody = new StringBuilder();  
while ((line = reader.readLine()) != null) {  requestBody.append(line);  
}  
String body = requestBody.toString();
  • ServletInputStream getInputStream():获取字节输入流
InputStream inputStream = request.getInputStream();  
byte[] buffer = new byte[1024];  
int bytesRead;  
StringBuilder requestBody = new StringBuilder();  
while ((bytesRead = inputStream.read(buffer)) != -1) {  requestBody.append(new String(buffer, 0, bytesRead));  
}  
String body = requestBody.toString();
  • 对于JSON请求体,还可以使用JSON处理库(如Jackson或Gson)解析请求体为Java对象:
import com.fasterxml.jackson.databind.ObjectMapper;  ObjectMapper objectMapper = new ObjectMapper();  
MyObject myObject = objectMapper.readValue(request.getInputStream(), MyObject.class);//注:ObjectMapper类是Jackson库中的一个核心类,它用于在Java对象和JSON数据之间进行转换。
//Jackson 是一个流行的Java库,用于处理JSON(JavaScript Object Notation)数据格式。 //ObjectMapper提供了丰富的方法来进行序列化和反序列化操作。

对于大型请求体,应该考虑使用流式处理来避免内存溢出。此外,在处理完请求体后,应该关闭Reader或InputStream以释放资源。

在现代Web框架(如Spring MVC)中,框架通常会自动处理请求体的解析,并将请求体映射到方法参数上,这使得手动处理请求体变得不那么常见。然而,了解如何在Servlet中手动处理请求体仍然是有价值的,因为它提供了对底层HTTP交互的更深入理解。

4)获取请求参数

请求参数:如登录时的用户名、密码

请求数据:包含请求行、请求头和请求体的所有数据

关系:请求参数是请求数据中的部分内容(GET请求的请求参数在请求行中;POST请求的请求参数一般在请求体中)

  • getParameter(String name)获取指定名称的请求参数的值

应用举例:获取username=zs&password=123 :

@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");System.out.println(username);System.out.println(password);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}
  • getParameterValues(String name):获取指定名称的请求参数的所有值(当参数有多个值时)

应用举例:获取hobby=xx&hobby=game

@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("------------");String[] hobbies = req.getParameterValues("hobby");for (String hobby : hobbies) {System.out.println(hobby);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}
  • getParameterMap():获取所有参数的map集合

应用举例:

@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//GET请求逻辑System.out.println("get....");//1. 获取所有参数的Map集合Map<String, String[]> map = req.getParameterMap();for (String key : map.keySet()) {// username:zhangsan lisiSystem.out.print(key+":");//获取值String[] values = map.get(key);for (String value : values) {System.out.print(value + " ");}System.out.println();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}

5)设置编码

解决POST请求方式的乱码:

  • request.setCharacterEncoding("UTF-8");

GET请求方式在Tomcat 8.0版本后不会出现乱码

应用举例:

@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 解决乱码: POST getReader()//设置字符输入流的编码,设置的字符集要和页面保持一致request.setCharacterEncoding("UTF-8");//2. 获取usernameString username = request.getParameter("username");System.out.println(username);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

4、请求转发(forward)

一种在服务器内部的资源跳转方式。

浏览器发送请求给服务器,服务器中的资源A接收到请求并将请求发给资源B,资源B处理完后将结果响应给浏览器。其中,请求从资源A到资源B的过程就叫请求转发。可以转发到Servlet或JSP。

请求转发是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保 存,地址栏中的 URL 地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。只能转发到当前服务器的内部资源,不能从一个服务器通过转发访问另一台服务器,因此不能请求转发到服务器外部资源。

实现方式:

  • req.getRequestDispatcher("资源B路径").forward(req,resp);

应用举例:

步骤一:需要创建2个servlet

@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("这是demo1");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("这是demo2");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

步骤二:请求转发:在RequestDemo1的doGet方法中进行

@WebServlet("/req")
public class RequestDemo5 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("这是demo1");//请求转发request.getRequestDispatcher("/req2").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

启动访问:http://localhost:8080/request-demo/req1 

看到控制台打印:

这是demo1

这是demo2   

说明请求已经转发到了 /req2

5、共享数据

把请求从/req1 转发到/req2的时候,怎样传递数据给/req2 ?

使用Request对象进行请求转发资源间的共享数据。

Request对象是一个域(范围)对象,具有特定的作用范围,即在一次请求及其转发的过程中。它提供了一组方法—setAttribute、getAttribute和removeAttribute,用于存储、获取和移除数据。

应用举例:

步骤一:在源Servlet中设置数据到Request对象:

@WebServlet("/sourceServlet")  
public class SourceServlet extends HttpServlet {  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  // 设置数据到Request对象  request.setAttribute("sharedData", "data");  // 请求转发到目标Servlet  RequestDispatcher dispatcher = request.getRequestDispatcher("/targetServlet");  dispatcher.forward(request, response);  }  
}

步骤二:在目标Servlet中获取数据:

@WebServlet("/targetServlet")  
public class TargetServlet extends HttpServlet {  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  // 获取共享数据  String sharedData = (String) request.getAttribute("sharedData");  // 使用共享数据System.out.println("收到分享的数据: " + sharedData);  
}

这里面有两个Servlet,当访问SourceServlet时,它会将数据"data"添加到Request对象中,并通过RequestDispatcher将请求转发到TargetServlet。

在TargetServlet中,通过调用request.getAttribute("sharedData")得到之前设置的数据,并可以在该Servlet的业务逻辑中使用这些数据。

客户端的请求URL应该指向源Servlet(在这个例子中是/sourceServlet),然后由源Servlet负责转发请求并共享数据。如http://localhost:8080/request-demo/sourceServlet。

使用请求转发时,客户端访问的URL是源Servlet的URL。请求转发是一种在服务器内部将请求从一个Servlet或JSP转发到另一个Servlet或JSP的技术,客户端并不知道这个过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu安装新版本的CMake

来到cmake官网选择版本 我需要在嵌入式板子上的Ubuntu18安装使用 故我选择aarch64版本。 按F12进入检查模式得到下载链接。 在板子上运行以下命令&#xff0c;获取安装脚本 wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-aarch64.s…

OpenCV实现目标追踪

目录 准备工作 语言&#xff1a; 软件包&#xff1a; 效果演示 代码解读 &#xff08;1&#xff09;导入OpenCV库 &#xff08;2&#xff09;使用 cv2.VideoCapture 打开指定路径的视频文件 &#xff08;3&#xff09;使用 vid.read() 读取视频的第一帧&#xff0c;ret…

前端视角对Rust的浅析

概述 本文将从 Rust 的历史&#xff0c;前端的使用场景和业界使用案例一步步带你走进 Rust的世界。并且通过一些简单的例子&#xff0c;了解 Rust 如何应用到前端&#xff0c;提高前端的生产效率。 Rust简史 2006年&#xff0c;软件开发者Graydon Hoare在Mozilla工作期间&#…

队列的概念及使用

目录 一. 概念 二. 队列的使用 三. 队列模拟实现 四. 循环队列 五. 面试题 一. 概念 队列 &#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操…

IDEA基础——Maven配置tomcat

配置方案 一、配置maven-tomcat plugin插件&#xff08;只最高支持到tomcat 8&#xff09;~~1.添加镜像源&#xff0c;获取tomcat 8插件配置~~~~1.1 在pom.xml里先添加镜像源~~~~1.2 添加tomcat插件配置~~ 2. 添加tomact官方发布的插件配置&#xff08;无需添加镜像源&#xff…

本届挑战赛季军方案:基于图网络及LLM AGENT的微服务系统异常检测和根因定位方法

aiboco团队荣获本届挑战赛季军。该团队来自亿阳信通。 方案介绍 本届挑战赛采用开放式赛题&#xff0c;基于建行云龙舟运维平台的稳定性工具和多维监控系统&#xff0c;模拟大型的生活服务APP的生产环境&#xff0c;提供端到端的全链路的日志、指标和调用链数据。参赛队伍在组…

vue中将某个不太规则的json转成对象,或者将对象转成json字符串

vue中将某个不太规则的json转成对象&#xff0c;或者将对象转成json字符串 以我自己做的项目某个不规则的json为例 将json对象转成json字符串&#xff1a; JSON.stringify(jsonData); 将不规则json字符串转成对象并获取对应的属性的值&#xff1a; JSON.parse(jsonData).Name…

云原生精品资料合集(附下载)

云计算是产业数字化转型的关键基础设施,以基础设施资源为中心的云搬迁时代接近尾声&#xff0c;以应用价值为中心的云原生时代已经到&#xff0c;所以IT人员学习云原生正当时&#xff01;最近跟各位大神征集了云原生的教程&#xff0c;行业报告和最佳实践&#xff0c;总有一款适…

蓝桥杯_中断系统

一 中断 中断&#xff0c;即cpu暂停执行当前程序&#xff0c;转而执行另外一段特殊程序&#xff0c;处理结束后。返回之前暂停程序继续执行。 中断向量&#xff0c;中断服务程序的入口地址&#xff0c;每个中断源都对应一个固定的入口地址。 中断服务函数&#xff0c;内核响应中…

【亚马逊云科技】通过Amazon CloudFront(CDN)快速访问资源

文章目录 前言一、应用场景二、【亚马逊云科技】CloudFront&#xff08;CDN&#xff09;的优势三、入门使用总结 前言 前面有篇文章我们介绍了亚马逊云科技的云存储服务。云存储服务主要用于托管资源&#xff0c;而本篇文章要介绍的CDN则是一种对托管资源的快速访问服务&#…

Socket网络编程(二)——UDP快速入门

目录 UDP相关概念UDP是什么为什么不可靠UDP能做什么UDP包最大长度 UDP单播、广播、多播概念1. 单播、广播、多播模型图2. ip地址分类3. 子网掩码的作用&#xff1a;4. 广播地址5. 网段划分6. 变长子网掩码 UDP核心APIAPI-DatagramSocketDatagramSocket构造方法DatagramSocket常…

6.5 共享数据

本节介绍Android的四大组件之一ContentProvider的基本概念和常见用法&#xff1a;首先说明如何使用内容提供器封装内部数据的外部访问接口&#xff0c;然后阐述如何使用内容解析器通过外部接口操作内部数据&#xff0c;最后叙述如何利用内容解析器读写联系人信息&#xff0c;以…

10_Vue

文章目录 Vue快速入门Vue的指令Vue的插值表达式V指令v-bind&#xff08;单向绑定&#xff09;v-model&#xff08;双向绑定&#xff09;v-on&#xff08;事件监听&#xff09;v-for&#xff08;循环&#xff09;v-text、v-htmlv-show&#xff08;显示/隐藏&#xff09;v-if&…

了解GPT:ChatGPT的终极指南

在人工智能&#xff08;AI&#xff09;的世界里&#xff0c;有一颗冉冉升起的新星正在革命性地改变我们与机器的交互方式&#xff1a;ChatGPT。在本文中&#xff0c;我们将深入研究什么是ChatGPT&#xff0c;为什么底层技术GPT如此强大&#xff0c;以及它是如何实现其卓越功能的…

excel导出标准化

虽然标题叫标准化&#xff0c;只不过是我自己的习惯&#xff0c;当一件事情变得流程标准化之后&#xff0c;开发程序就会飞快&#xff0c;开发评估工作总是 搞个1~2天&#xff0c;实则前端后端一起开发&#xff0c;1个小时就可以搞定。 1 前端 const exportXls async () >…

C++重点---STL简介

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、STL简介 STL&#xff08;Standard Template Library&#xff09;是C标准库中的一个重要组成部分&#xff0c;它提供了…

iOS中卡顿产生的主要原因及优化思路

卡顿本质上是一个UI体验上的问题&#xff0c;而UI的渲染及显示&#xff0c;主要涉及CPU和GPU两个层面。若 CPUGPU渲染耗时超过16.7ms&#xff0c;就会在屏幕vsync信号到来时无法更新屏幕内容&#xff0c;进而导致卡顿。 iOS中UI渲染主要包含Layout->Draw->Prepare->Co…

MySQL5.7.44版本压缩包在Win11系统快速安装

一.背景 主要还是为了公司的带徒弟任务。我自己也喜欢MySQL的绿色版本。 1.软件版本说明 MySQL版本&#xff1a;5.7.44 压缩包版本&#xff0c;相当于绿色版。当然&#xff0c;你也可以使用window系统的Installer版本去安装。 操作系统&#xff1a;Win11家庭版 二.MySQL软…

electron-release-server部署electron自动更新服务器记录

目录 一、前言 环境 二、步骤 1、下载上传electron-release-server到服务器 2、宝塔新建node项目网站 3、安装依赖 ①npm install ②安装并配置postgres数据库 ③修改项目配置文件 ④启动项目 ⑤修改postgres的认证方式 ⑥Cannot find where you keep your Bower p…

spring6学习笔记

1.环境准备 1.idea建立一个空项目&#xff0c;jdk要求是17 2.Maven配置&#xff08;和mybatis里一样&#xff09; 3.新建一个模块 2.ocp原则 3.依赖倒置原则&#xff08;DIP&#xff09; 什么是依赖倒置原则? 1.面向接口编程&#xff0c;面向抽象编程&#xff0c;不要面向…