【JavaEE】Servlet API 详解(HttpServletRequest类)

二、HttpServletRequest

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

1.1 HttpServletRequest核心方法

在这里插入图片描述

1.2 方法演示

@WebServlet("/showRequest")
public class ShowRequest extends HttpServlet {
    @Override
    protected 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();  //每个元素的key
            String headerValue = req.getHeader(headerName);  //每个元素的value
            stringBuilder.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 {
    @Override
    protected 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来获取键值对

@Override
    protected 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();

    @Override
    protected 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");
    }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

M2LC-Net

模型结构 作者未提供代码

Eclipse使用配置tomcat服务:未识别的web项目

问题1&#xff1a;未识别的项目 解决&#xff1a;elispse未识别到改项目为Web项目

DDD设计模式需要在存储层之前就需要有ID,如何实现?

在DDD设计领域中, 聚合根 或者实体在存储层之前就需要有id。一般采用如下类提前生成,然后直接落库。 DDD元素 在使用DDD设计系统时,主要包括Entity,Value Object,Service,Aggregate,Repository,Factory,Domain Event,Moudle等元素 在建模时,Entity可以用来代表一个事物…

【MySQL】事务(下)

文章目录 1. 各个隔离级别的演示事务隔离级别 —— 读未提交事务隔离级别—— 读提交事务隔离级别 —— 可重复读事务隔离级别 —— 串行化脏读 不可重复读 幻读的理解 2. MVCC机制读写3个记录隐藏列字段undo日志模拟MVCCread view 理论 3. 读提交与 可重复读的区别两者本质区别…

HarmonyOS分布式文件系统开发指导

分布式文件系统概述 分布式文件系统&#xff08;hmdfs&#xff0c;HarmonyOS Distributed File System&#xff09;提供跨设备的文件访问能力&#xff0c;适用于如下场景&#xff1a; 两台设备组网&#xff0c;用户可以利用一台设备上的编辑软件编辑另外一台设备上的文档。平板…

AI大模型的制作:RAG和向量数据库,分别是什么?

目录 一、什么是 AI 大模型 二、RAG 三、向量数据库 四、如何制作一个好的 AI 大模型 一、什么是 AI 大模型 AI大模型是指具有大规模参数和复杂结构的人工智能模型。传统的机器学习模型通常有限的参数量&#xff0c;而AI大模型则通过增加参数量和层数来提升模型的表达能力…

黑客泄露 3500 万条 LinkedIn 用户记录

被抓取的 LinkedIn 数据库分为两部分泄露&#xff1a;一部分包含 500 万条用户记录&#xff0c;第二部分包含 3500 万条记录。 LinkedIn 数据库保存了超过 3500 万用户的个人信息&#xff0c;被化名 USDoD 的黑客泄露。 该数据库在臭名昭著的网络犯罪和黑客平台 Breach Forum…

经纬恒润马来西亚工厂正式投入试运行

2023年11月&#xff0c;经纬恒润在中国境外的第一家工厂正式投入试运行。新工厂位于马来西亚&#xff0c;于2023年4月开始筹建&#xff0c;规划总产能500万个汽车电子控制器&#xff0c;主要用于生产新能源汽车电子产品&#xff0c;以满足国外客户日益增长的需求。 经纬恒润马来…

C语言从入门到精通之【字符串】

C语言没有专门用于储存字符串的变量类型&#xff0c;字符串都被储存在char类型的数组中。数组由连续的存储单元组成&#xff0c;字符串中的字符被储存在相邻的存储单元中&#xff0c;每个单元储存一个字符&#xff0c;每个字符占1个字节。 数组末尾位置的字符\0。这是空字符&am…

Eclipse使用配置tomcat服务:部署找不到web.xml

问题&#xff1a;部署找不到web.xml及其他资源文件。只有lib和class 解决&#xff1a;将web.xml所在目录添加到部署配置里

设备数据如何为预测性维护提供支持

预测性维护是现代制造业中一种高效而受欢迎的维护策略&#xff0c;它能够帮助企业提前发现设备故障的早期迹象&#xff0c;并采取相应措施&#xff0c;从而避免生产线的停机和生产效率的下降。实施预测性维护的关键在于充分利用设备数据&#xff0c;通过数据的收集、处理和分析…

yolo如何画框、如何变换目标检测框的颜色和粗细、如何运行detect脚本

这段代码是一个使用YOLO模型进行目标检测的Python脚本。下面我将逐步解释脚本的主要部分&#xff0c;并提供一些关于超参数的使用方法。 1. 脚本结构 导入相关库设置配置参数加载YOLO模型运行目标检测处理检测结果显示或保存结果 2. 超参数说明 --weights: 指定YOLO模型的…

工业控制(ICS)学习笔记

目标&#xff1a;工业互联网安全的比赛 工控CTF之协议分析1——Modbus_ctf modbus-CSDN博客 常见的工控协议有&#xff1a;Modbus、MMS、IEC60870、MQTT、CoAP、COTP、IEC104、IEC61850、S7comm、OMRON等 不用看了&#xff0c;没太多技术含量&#xff0c;做了一会发现全得看答案…

敏捷开发工具有哪些?这款在线敏捷工具好评如潮!

随着软件开发的日渐复杂&#xff0c;敏捷开发方法已经成为当前软件开发的主流方式之一。敏捷开发是一种快速且灵活的软件开发方法&#xff0c;以快速响应需求变化和提供高质量软件为目标。在敏捷开发过程中&#xff0c;使用合适的敏捷工具能够更好地辅助开发团队进行协作和管理…

接口自动化测试(Python+Requests+Unittest)合集详解教程

&#xff08;1&#xff09;接口自动化测试的优缺点 优点&#xff1a; 测试复用性。维护成本相对UI自动化低一些。回归方便。可以运行更多更繁琐的测试。 自动化的一个明显的好处是可以在较少的时间内运行更多的测试。为什么UI自动化维护成本更高&#xff1f; 因为前端页面变…

小程序实现语音识别功能

不废话&#xff0c;直接上代码 <template><view><u-popupround"16" :show"recordShow" :close-on-click-overlay"false":safe-area-inset-bottom"false"close"close"open"open"><view clas…

直播推流与拉流简概

推流&#xff1a;将直播内容推送至服务器的过程 拉流&#xff1a;为服务器已有直播内容&#xff0c;用指定地址进行拉取的过程 在推流中&#xff0c;我们想要进行传输到服务端, 那么肯定要将数据使用传输协议进行封装&#xff0c;变成流数据。常用的流传输协议有哪几种呢? RT…

数字化转型时代,商业智能BI到底是什么?

据国际数据公司&#xff08;IDC&#xff09;预测&#xff0c;2025年时中国产生的数据量预计将达48.6ZB&#xff0c;在全球中的比例为27.8%。商业智能BI这一专为企业提供服务的数据类解决方案&#xff0c;仅2021年上半年在中国商业智能BI市场规模就达到了3.2亿美元&#xff0c;商…

19C进入数据库出现问号

问题情况如图所示&#xff1a; 解决方法&#xff1a; su - oracle echo "NLS_LANGAMERICAN_AMERICA.ZHS16GBK;export NLS_LANG" >> ~/.bash_profilesource ~/.bash_profileofile