【JavaEE】Servlet API 详解(HttpServletRequest类)

二、HttpServletRequest

Tomcat 通过 Socket API 读取 HTTP 请求(字符串), 并且按照 HTTP 协议的格式把字符串解析成 HttpServletRequest 对象(内容和HTTP请求报文一样)

1.1 HttpServletRequest核心方法

在这里插入图片描述

1.2 方法演示

@WebServlet("/showRequest")
public class ShowRequest extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//通过字符串拼接的方式演示各个get方法得到的结果StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(req.getProtocol());stringBuilder.append("<br>");stringBuilder.append(req.getMethod());stringBuilder.append("<br>");stringBuilder.append(req.getRequestURI());stringBuilder.append("<br>");stringBuilder.append(req.getQueryString());stringBuilder.append("<br>");stringBuilder.append(req.getContextPath());stringBuilder.append("<br>");stringBuilder.append("------------------------<br>");Enumeration<String> headerNames = req.getHeaderNames();  //getHeaderNames返回的是枚举类型while (headerNames.hasMoreElements()) {//通过循环返回枚举类型中的每个元素String headerName = headerNames.nextElement();  //每个元素的keyString headerValue = req.getHeader(headerName);  //每个元素的valuestringBuilder.append(headerName + ":" + headerValue + "<br>");  //以键值对的形式写入stringBuilder}//在响应中设置body的类型方便浏览器解析resp.setContentType("text/html;charset=utf8");//为了让<br>生效//写入响应中resp.getWriter().write(stringBuilder.toString());}
}

在这里插入图片描述

1.3 数据传输

前端给后端传数据是非常常见的场景,通常是以下三种方法:
🚓(1)通过query string传输
🚓(2)通过body(form)传输
🚓(3)通过body(json)传输

那使用Servlet怎么进行以上三种传输呢?

1.3.1 通过query string传输

约定前端通过query string传输usernamepassword

此时后端代码怎么编写?

@WebServlet("/getParameter")
public class GetParameter extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 前端通过 url 的 query string 传递 username 和 password 两个属性String username = req.getParameter("username");if (username == null) {System.out.println("username这个key在query string中不存在");}String password = req.getParameter("password");if (password == null) {System.out.println("password这个key在query string中不存在");}System.out.println("username=" + username + ", password=" + password);resp.getWriter().write("ok");}
}

在这里插入图片描述
注意:
上面URL中的键值对尽量不要使用中文,使用中文要进行urlencode转码
Servlet会自动进行解码,我们感知不到
在这里插入图片描述

1.3.2 通过body(form)传输

相当于body里存放和query string一样的数据格式,但是Content-Type是application/x-www-form-unicodeed

这里也是通过getParameter来获取键值对

@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 前端通过 body, 以 form 表单的格式, 把 username 和 password 传给服务器String username = req.getParameter("username");if (username == null) {System.out.println("username这个key在body中不存在");}String password = req.getParameter("password");if (password == null) {System.out.println("password这个key在body中不存在");}System.out.println("username=" + username + ", password=" + password);resp.getWriter().write("ok");}

此时向服务器发送POST请求:
在这里插入图片描述
注意:
如果我们输入的参数有中文:
在这里插入图片描述
这是由于后端并不知道传的数据是什么类型,所以乱码
需要显示的告诉后端请求数据的类型,要在代码中加上:

req.setCharacterEncoding("utf-8");//给请求设置类型

再次启动服务器并发送刚才一样的POST请求
在这里插入图片描述

1.3.3 通过body(json)传输(最重要最常见的传输方式)

json也是键值对格式的数据
在这里插入图片描述
但是Servlet没有内置解析json类型的工具
因此就需要借助其他的第三方库:
在这里插入图片描述
在这里插入图片描述
将这里的代码复制到idea中的pom.xml即可

接下来编写后端代码:

class User {public String username;public String password;
}
@WebServlet("/json")
public class JsonServlet extends HttpServlet {// 使用 jackson, 最核心的对象就是 ObjectMapper// 通过这个对象, 就可以把 json 字符串解析成 java 对象; 也可以把一个 java 对象转成一个 json 格式字符串.private ObjectMapper objectMapper = new ObjectMapper();@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 通过 post 请求的 body 传递过来一个 json 格式的字符串.User user = objectMapper.readValue(req.getInputStream(), User.class);System.out.println("username=" + user.username + ", password=" + user.password);resp.getWriter().write("ok");}
}

在这里插入图片描述
代码如何解析的呢?
在这里插入图片描述

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

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

相关文章

功能强大的国产API管理神器 Eolink,亲测好用

前言 大家好&#xff0c;我是小月&#xff0c;今天给大家讲讲最近很火的Eolink&#xff0c;一款功能强大且非常实用的国产 API管理工具。在我们日常的前端、后端开发测试过程中经常会用到API&#xff0c;特别是在大型项目中API管理工具也就必不可少。工欲善其事必先利其器&…

SAP 70策略测试简介

在前面的文章中我们已经测试了10、11、20、40、50、52、60、62策略的测试,接下来我们需要对70策略进行测试,很多的项目中也都会用到70策略。 70策略是一种比较常见的、基于按库存且主要用于半成品或者原材料的计划策略。 我们还是按照之前的惯例,先看下70策略的后台配置 我…

Linux环境实现mysql所在服务器定时同步数据文件到备份服务器(异地容灾备份场景)

目录 概述 1、建立ssh连接 1.1、操作mysql所在服务器 1.2、操作备份文件服务器 2、创建脚本实现备份以及传输 3、配置定时任务 概述 应对异地容灾备份场景&#xff0c;mysql所在服务器和备份服务器需要建立ssh连接&#xff0c;每天mysql服务器通过定时任务执行脚本&…

web3 React dapp进行事件订阅

好啊&#xff0c;上文web3 React Dapp书写订单 买入/取消操作 我们已经写好了 填充和取消订单 这就已经是非常大的突破了 但是 留下了一个问题 那就是 我们执行完之后 订单的数据没有直接更新 每次都需要我们手动刷新 才能看到结果 那么 今天我们就来看解决这个问题的事件订阅 …

什么是 IT 资产管理(ITAM),以及它如何简化业务

IT 资产管理对任何企业来说都是一项艰巨的任务&#xff0c;但使用适当的工具可以简化这项任务&#xff0c;例如&#xff0c;IT 资产管理软件可以为简化软件和硬件的管理提供巨大的优势。 什么是 IT 资产管理 IT 资产管理&#xff08;ITAM&#xff09;是一组业务实践&#xff…

大数据-之LibrA数据库系统告警处理(ALM-12045 网络读包丢包率超过阈值)

告警解释 系统每30秒周期性检测网络读包丢包率&#xff0c;并把实际丢包率和阈值&#xff08;系统默认阈值0.5%&#xff09;进行比较&#xff0c;当检测到网络读包丢包率连续多次&#xff08;默认值为5&#xff09;超过阈值时产生该告警。 用户可通过“系统设置 > 阈值配置…

idea生成代码(一):实现java语言的增删改查功能(基于EasyCode插件)支持自定义模板【非常简单】

idea生成代码&#xff08;一&#xff09;&#xff1a;实现java语言的增删改查功能&#xff08;基于EasyCode插件&#xff09;支持自定义模板【非常简单】 idea生成代码&#xff08;二&#xff09;&#xff1a;实现java语言的增删改查功能&#xff08;基于mybatis-plus代码生成器…

记录:unity脚本的编写6.0

目录 unity UI系统添加ui编写脚本 unity UI系统 在日常的游戏或者别的什么活动中&#xff0c;ui总是必不可少的一项&#xff0c;在java中也有关于GUI的内容&#xff0c;unity也不例外&#xff0c;这次就使用脚本控制在unity添加的各种ui组件&#xff0c;使他们可以完成一些我们…

【第2章 Node.js基础】2.4 Node.js 全局对象(一)

什么是Node.js 全局对象 对于浏览器引擎来说&#xff0c;JavaScript 脚本中的 window 是全局对象&#xff0c;而Node.js程序中的全局对象是 global&#xff0c;所有全局变量(除global本身外)都是global 对象的属性。全局变量和全局对象是所有模块都可以调用的。Node.is 的全局…

java 旋转方阵

public static void main(String[] args) {Scanner scanner new Scanner(System.in);// N阶方阵int n scanner.nextInt();// 构建方阵List<List<Integer>> matrix new ArrayList<>();for (int i 0; i < n; i) {List<Integer> row new ArrayLis…

书单 | 11月程序员新书播报

11月最新上架计算机书籍 1、人工智能&#xff08;第3版&#xff09; 美国经典人工智能教材第3版&#xff0c;人工智能的百科全书&#xff0c;新增深度学习及人工智能编程等内容&#xff0c;理论阐释结合动手实践&#xff0c;附赠PPT课件、配套视频及代码文件。 1.人工智能经典…

Vue中组件与插件:究竟有何不同?详细解析带你get到核心差异!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、组…