【Java EE初阶二十四】servlet的深入理解

news2025/1/12 3:44:33

 1. Servlet API 的学习

        下面主要学习这三个类,就已经可以完成 Servlet 的大部分开发了;

1. Httpservlet
2. HttpServletRequest
3. HttpServletResponse

2. Httpservlet的学习

2.1 Httpservlet在tomcat的工作原理

        写一个 Servlet 代码,往往都是要继承这个类,重写里面的方法.,我们之前写的代码如下:

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("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //把这句话打印在tomact的控制台上(服务器上)
        System.out.println("hell0 word");
        //把内容显示到页面上,把hello word字符串作为http响应的body部分
        //这个部分就会被浏览器显示在页面上
        resp.getWriter().write("hello word");
    }
}

        servlet这里的代码,只需要继承httpservlet就行,不必写一个main方法;

        HttpServlet,继承这个类,重写里面的方法,目的就是为了把咱们自己定义的代码,“插入到" tomcat ”中;

        简单了解其工作原理如下:

        在 tomcat 中,就有形如以下这样的代码:

        // 先通过 tcp socket 读取请求. http 也是基于 tcp
        String requestString = readRequest();
        // 解析这个请求
        HttpServletRequest reg = parse(requestString);
        // 构造空的响应对象
        IttpServletResponse = new HttpServletResponse();

        // 创建一个 HttpServlet 对象.
        Htpservlet s = new Helloservlet();------->Tomcat 能够自动的 new 出一个咱们写的子类;

        

        进一步的,也就相当于,让咱们的代码"嵌入到"tomcat 内部运行了;

2.2 Httpservlet 的方法

        一个 Servlet 不用了,说明 Tomcat 要关闭了,Tomcat 关闭有两种方式:
        1.直接干掉 Tomcat 进程 (比如直接在任务管理器中结束任务或者直接一点x), 完全来不及调用 destroy 的.
        2.通过 8005 管理端口,给 Tomcat 发送一个"停机"指令.这个时候是能够执行 destroy 的.

        关于servlet和Httpservlet的理解:

servlet:一组 api, 由tomcat 提供的来操作 http 协议的,也可以理解成是一个 HTTP 服务器框架;写网站的时候主要的工作步骤如下:1接收前端传来的 http 请求,并解析;2根据 http 请求计算出一个 http 响应;3HttpServlet把 http 响返回到浏览器这边

Httpservlet:一般需要继承这个类,并重写里面的方法,最后把重写的代码插入到 Tomcat 的既定流程之中;

 3. HttpServletRequest

        HttpServletRequest表示了一个 HTTP 请求;

3.1 关于HttpServletRequest的一些方法 

        上述介绍的方法,都是 get 系列的方法 (都是读方法),没有 set 系列 (没有写方法),我们当前拿到的 HttpServletRequest,这里的数据都是来自于客户端发来的,这些数据的内容已经确定下来了,我们是不应该修改的; 

        下面主要通过postman构造http请求,观察服务器的相关响应:

        最终浏览器得到服务器返回的响应:

3.2 在服务器获取请求中的参数.(Query String)

        query string 中的键值对, 都是程序猿自定义的,实际开发中都会非常广泛的使用到 qrery string 这样的机制,如下图所示:

        1、http请求中没有query string

        

         1、http请求中有query string

3.3 通过 http 请求的 body 来传递参数(POST)

        1)、直接通过 form 表单(body 的格式就是 query string 的格式)
        Content-Type: application/x-www-form-urlencoded

        前端往后端传输数据并顺利拿到:

        该方式能被servlet支持;

        2)、直接使用 json
        (body 的格式就是json),Content-Type: application/json  

        json 本质上也是键值对,规则和 form 表单截然不同,解析方式自然也就变了,由于json 支持“嵌套”,因此自己手写解析 jon 的代码,并不容易的,其嵌入结构如下所示:

        该方式不能被servlet支持,所以要下载第三方库;此处为了针对 json 格式的数据进行解析和构造,就需要引入 json 的库;java 世界中,json 的第三方库是非常多的.咱们使用的叫做 jackson,下载第三方库如下:

        1)下载导入jackson 到项目中.通过 maven:

        2)使用 jackson

 一个类,两个方法:

        ObjectMapper:对象映射器;

        把json 字符串,映射成一个 Java 的对象,读方法;

        把一个java 对象,映射成json 字符串,写方法;

 使用逻辑如下:

        网络传输的时候:使用 json 字符串;

        站在服务器的角度:收到的请求,就是json 字符串.,需要把 json 字符串,先映射成java 对象,再进行一系列的业务逻辑处理,处理完了之后,可能还需要把得到的java 对象,映射回json字符串,并且通过响应来返回;

        图解对象映射器的分析如下:

1、读方法

        

        关于java.class文件的详细了解:

        细节处理:

  2、写方法

该端代码的分析:

3、postman构造请求:

        postman 对于json 格式要求比较严格,key 必须加上 引号;

4. HttpServletResponse

        HttpServletResponse的方法:

        response 里的 api 都是 set 系列的方法,request 里的 api 都是 get 系列的方法;

        有时候请求得到的响应,光是一个状态码但是 body 是空,不太友好,浏览器上是不会直接显示状态码,如下图所示:

        ps:本次的学习就到这里了,如果大家感兴趣的话,就请一键三连哦!!!

        

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

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

相关文章

C++最佳实践之编译篇

C最佳实践之工程编译 在大型c/c工程开发中,往往会涉及多级CMakeLists.txt的调用,并且调用方式错综复杂,主要有以下两种方式: 1. 子目录中的CMakeList.txt独立生成目标,不作为主目标生成过程的依赖关系(比…

Windows+Yolo3-darknet训练自己数据集并测试

WindowsYolo3-darknet训练自己的数据集并测试 一、首要条件 Windows 7下配置好VS2015OPENCV3.4.2YOLO3CUDA10.0CUDNN7.5生成darknet.exe。具体配置可参考我的博客:https://blog.csdn.net/wszswllnzn_/article/details/100760477 二.制作数据集 1、方法1 使用软件la…

uView组件使用

u-collapse 折叠面板 https://www.uviewui.com/components/collapse.html?ivk_sa1024320u 如果是异步加载的数据,最开始的 u-collapse-item是默认高度,,第一次点开的时候,异步数据不能撑开高度 但是如果 u-collapse-item中有内…

BUGKU-WEB 备份是个好习惯

题目描述 题目截图如下: 进入场景看看: 解题思路 看源码看提示:备份是个好习惯扫描目录md5弱比较 相关工具 御剑md5解密:https://www.somd5.com/ 解题步骤 看到的这串字符,有点像md5? d41d8cd98…

X-Rhodamine maleimide ,ROX 马来酰亚胺,实验室常用的荧光染料

您好,欢迎来到新研之家 文章关键词:X-Rhodamine maleimide ,X-Rhodamine mal,ROX-maleimide,ROX 马来酰亚胺 一、基本信息 【产品简介】:ROX, also known as Rhodamine 101, is a product whose active …

linux0.11 源码阅读 head.s setup.s bootsect.s加载位置

从github上下载linux0.11源码 linux0.11源码 将0x10000处的代码往下复制到0开始的地址处。 移动后的内存布局如下 setup中存在gdt和idt的相关数据。此时需要用gdtr和idtr寄存器指向对应的数据。 实模式下,访问内存方式。最多访问1M内存。 分页模式下&…

STM32控制max30102读取血氧心率数据(keil5工程)

一、前言 MAX30102是一款由Maxim Integrated推出的低功耗、高精度的心率和血氧饱和度检测传感器模块,适用于可穿戴设备如智能手环、智能手表等健康管理类电子产品。 该传感器主要特性如下: (1)光学测量:MAX30102内置…

Java向ES库中插入数据报错:I/O reactor status: STOPPED

Java向ES库中插入数据报错:java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STO 一、问题问题原因 二、解决思路 一、问题 在使用Java向ES库中插入数据时,第一次成功插入,第二次出现以下错误&#xff1a…

C++种pair的初始化及与unordered_map的区别

pair的初始化及与unordered_map的区别 概述pair初始化开发环境头文件示例运行结果 与unordered_map的区别 概述 本文旨在介绍pair初始化,同时简述pair与unordered_map的区别。 pair初始化 pair是一个模板类,可以存储两个类型的数据为一个对象。 开发…

【深度学习】SSD 神经网络:彻底改变目标检测

一、说明 Single Shot MultiBox Detector (SSD) 是一项关键创新,尤其是在物体检测领域。在 SSD 出现之前,对象检测主要通过两阶段过程执行,首先识别感兴趣的区域,然后将这些区域分类为对象类别。这种方法虽…

js数组操作大全

目录 创建数组: 访问和修改数组元素: 数组的遍历: 数组的操作: 数组的转换: 创建数组: 使用数组字面量:let arr []。使用new关键字和Array构造函数:let arr new Array()。 访问…

【更换yarn的位置】解决yarn和nodejs不在同一盘下产生的某些命令应用失败问题

具体问题我记得是command fail什么error,记不太清楚了,文章主要写了如何替换yarn路径,希望可以帮助到大家。

【算法与数据结构】链表、哈希表、栈和队列、二叉树(笔记二)

文章目录 四、链表理论五、哈希表理论五、栈和队列理论5.1 单调栈 六、二叉树理论6.1 树的定义6.2 二叉树的存储方式6.3 二叉树的遍历方式6.4 高度和深度 最近博主学习了算法与数据结构的一些视频,在这个文章做一些笔记和心得,本篇文章就写了一些基础算法…

10:部署Dashboard|部署Prometheus|HPA集群

部署Dashboard|部署Prometheus|HPA集群 Dashboard部署Dashboard上传镜像到私有仓库安装服务发布服务创建管理用户查看登录的Token信息 Prometheus步骤一:导入所有后续需要的镜像到私有镜像仓库(在master主机操作操作)步…

LangChain原理学习笔记

最新越发觉得AI的发展,对未来是一场革命,LangChain已经在工程设计上有了最佳实践,类似于AI时代的编程模型或编程框架,有点Spring框架的意思。之前在LangChain上也有些最佳实践,所以在这里分享记录下。 LangChain解决什…

计算机网络面经-TCP三次握手一文说清

目录 说一下TCP的三次握手? 为什么要三次握手?两次行不行?四次呢? 为什么建立连接是三次握手,关闭连接确是四次挥手呢? TCP四次挥手的过程? 如果已经建立了连接,但是客户端突然出…

编译GreatSQL with RocksDB引擎

GreatSQL里也能用上RocksDB引擎 1. 前言 RocksDB 是基于Facebook 开源的一种支持事务的、高度可压缩、高性能的MyRocks存储引擎,特别适用于高度压缩和大容量的数据。以下是一些关键特点: 高性能: LSM 树结构使得RocksDB在写入密集型负载下表现…

苹果分拣检测YOLOV8NANO

苹果分拣,可以检测成熟、切片、损坏、不成熟四种类型,YOLOV8NANO,训练得到PT模型,然后转换成ONNX,OPENCV的DNN调用,支持C,PYTHON 苹果分拣检测YOLOV8NANO,检测四种类型苹果

React18源码: React调度中的3种优先级类型和Lane的位运算

优先级类型 React内部对于优先级的管理,贯穿运作流程的4个阶段(从输入到输出),根据其功能的不同,可以分为3种类型: 1 )fiber优先级(LanePriority) 位于 react-reconciler包,也就是L…

【电路笔记】-RC放电电路

RC放电电路 文章目录 RC放电电路1、概述2、RC放电电路3、RC放电电路示例当电压源从完全充电的 RC 电路中移除时,电容器 C 将通过电阻 R 放电。 1、概述 RC 放电电路利用电阻器-电容器组合的固有 RC 时间常数以指数衰减率对电容器进行放电。 在之前的 RC 充电电路教程中,我们…