当前位置: 首页 > news >正文

【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");}
}

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

相关文章:

  • Java进阶API第三章
  • 用人话讲解深度学习中CUDA,cudatookit,cudnn和pytorch的关系
  • 叙永微公益:开展“活水计划-益童成长守护”周末陪伴活动
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件
  • 设计基于STM32F103C8T6微控制器的巡线小车
  • Angular 由一个bug说起之二:trackBy的一点注意事项
  • excel导入 Easy Excel
  • idea一键打包docker镜像并推送远程harbor仓库的方法(包含spotify和fabric8两种方法)--全网唯一正确,秒杀99%水文
  • 前台页面从数据库中获取下拉框值
  • (SpringBoot)第七章:SpringBoot日志文件
  • 15分钟,不,用模板做数据可视化只需5分钟
  • Django模板层
  • GAT里面的sofamax函数的实现:
  • 2023.11.17 -hivesql调优,数据压缩,数据存储
  • 【图像分类】【深度学习】【Pytorch版本】ResNet模型算法详解
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CSS中外联样式表代表的含义
  • iOS 系统授权开发
  • JSONP原理
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PaddlePaddle-GitHub的正确打开姿势
  • PhantomJS 安装
  • python大佬养成计划----difflib模块
  • Ruby 2.x 源代码分析:扩展 概述
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • webpack+react项目初体验——记录我的webpack环境配置
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 解析 Webpack中import、require、按需加载的执行过程
  • 面试遇到的一些题
  • 前端相关框架总和
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一天一个设计模式之JS实现——适配器模式
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 在Unity中实现一个简单的消息管理器
  • 智能合约Solidity教程-事件和日志(一)
  • PostgreSQL之连接数修改
  • 进程与线程(三)——进程/线程间通信
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (转)程序员疫苗:代码注入
  • (转)平衡树
  • .net wcf memory gates checking failed
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • /etc/skel 目录作用
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [51nod1610]路径计数
  • [Android]使用Git将项目提交到GitHub
  • [Bada开发]初步入口函数介绍