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

 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 {@Overrideprotected 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.mzph.cn/news/697658.shtml

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

相关文章

css3的var()函数

css3的var()函数 变量要以两个连字符--(横杆)(减号)为开头 变量可以在:root{}中定义, :root可以在css中创建全局样式变量。通过 :root本身写的样式,相当于 html,但优先级比后者高。 在CSS3中,var()函数是一个用于插入CSS自定义属性&#xff…

Vulhub 靶场训练 DC-6解析

一、搭建环境 kali充当攻击机 ip地址是:192.168.200.14 DC-6充当靶机 : IP地址暂时未知 注意:让两台机器的使用同一种网络适配器 二、信息收集 1、探索同网段存活的主机 ①第一种方法 arp-scan -l②第二种方法 netdiscover -i eth0 -…

npm/nodejs安装、切换源

前言 发现自己电脑上没有npm也没有node很震惊,难道我没写过代码么?不扯了,进入正题哈哈…… 安装 一般没有npm的话会报错: 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称而且报这个错,我们执行…

【骑行新纪元】社交风暴来袭,你准备加入骑友圈了吗?

当你的自行车轮轻轻滑过清晨的露水,你是否曾想与志同道合的骑友分享这一刻的喜悦?骑行,这个曾经只是简单运动的代名词,如今正在悄然转变。随着科技的进步和社交平台的发展,骑行不再只是一种健身方式,它还带…

C-指针-010

1指针 1.1语法: 【基类型*指针变量名】 【int *p&a】1.2语义: 【基类型】:指针变量指向的目标的数据类型 【*】:表示此时定义的变量是一个指针类型的变量 【&a】:一块存放着int类型数据的空间的地址 【*p】…

【高德地图】Android搭建3D高德地图详细教

📖Android搭建3D高德地图详细教程 📖第1章 高德地图介绍✅了解高德地图✅2D地图与3D地图 📖第2章 搭建3D地图并显示✅第 1 步:创建 Android 项目✅第 2 步:获取高德Key✅第 3 步:下载地图SDK✅第 4 步&…

照片上多余的人怎么处理?这几种方法让你的照片更完美!

照片怎么去掉多余人像?这是许多摄影爱好者经常遇到的问题。有时候,我们拍摄了一张非常美好的照片,但由于某些原因,照片中出现了不希望出现的人物。这时候,我们该如何处理呢?下面,我将分享几种常…

2.5网安学习第二阶段第五周回顾(个人学习记录使用)

本周重点 ①多进程和多线程 1、进程和线程 2、多线程爆破 ②Redis数据库 1、Redis的使用 2、Redis持久化 3、Redis未授权免密登录 ③嗅探和Python攻击脚本 1、嗅探(端口扫描和IP扫描) 2、SCAPY的应用 3、Python攻击脚本(SYN半连接…

计算机网络-局域网

文章目录 局域网局域网拓扑结构以太网以太网传输介质以太网时隙提高传统以太网带宽的途径以太网帧格式 局域网协议IEEE 802参考模型IEEE802.2协议LLC帧格式及其控制字段LLC提供的三种服务 IEEE 802.3协议IEEE 802.4协议IEEE 802.5协议 高速局域网100M以太网千兆以太网万兆以太网…

冲突管理最佳实践

任何团队都无法避免冲突,如何有效管理冲突,将冲突转化为团队成长和凝聚的动力,是任何一个团队管理者的必修课。原文: Best Practices for Managing Conflict in Engineering Management Obie Fernandez Unsplash 冲突在任何组织中都不可避免&…

Android中Transition过渡动画的简单使用

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 一、布局xml文件代码如下&#xff1a; <?xml version"1.0" encoding&quo…

ABB触摸屏维修工控机显示屏维修CP405 A1/A0

ABB人机界面维修常见故障&#xff1a;黑屏白屏花屏&#xff0c;按触摸屏无反应或反应慢触摸不好&#xff0c;内容错乱&#xff0c;进不了系统界面&#xff0c;无背光背光暗&#xff0c;有背光无字符&#xff0c;不能通信&#xff0c;按键无无反应等均可维修。 此维修检测方法有…

英文输入法(C 语言)

题目 主管期望你来实现英文输入法单词联想功能&#xff0c;需求如下&#xff1a; 依据用户输入的单词前缀&#xff0c;从已输入的英文语句中联想出用户想输入的单词。按字典序输出联想到的单词序列&#xff0c;如果联想不到&#xff0c;请输出用户输入的单词前缀。 注意 英…

Java设计模式 | 七大原则之单一职责原则

一、单一职责原则 基本介绍 对类来说&#xff0c;一个类应该只负责一项原则&#xff0c;如类A负责两个不同职责&#xff1a;职责1&#xff0c;职责2。当职责1需求变更而改变A时&#xff0c;可能造成职责2执行错误&#xff0c;所以需要将类A的粒度分解为A1&#xff0c;A2。 注…

玩主机游戏能省去不少烦恼?+主机该购买哪台?

文/嘉兰SK 来到次世代&#xff0c;玩家们最关心的问题逐渐变成了购买的游戏能否支持升级。 各个游戏厂商也没有闲着。 此前还有标准版、黄金版、终极版、决定版等一系列。 想出很多招数。 于是很多新玩家开始疑惑&#xff1a;你们都说玩主机游戏可以省去很多麻烦&#xff0c;可…

每天一个知识点 - 如何快速熟悉后端项目

入职一家新公司的时候&#xff0c;不可避免的就是接触到新公司的项目&#xff0c;有些项目一启动就是好几年&#xff0c;业务功能极其复杂&#xff0c;下面我总结几个方法让大家快速熟悉后端项目&#xff08;图文结合&#xff09; 用例图简析 用例是系统中的一个功能单元&…

springboot网站开发02-接入持久层框架mybatisPlus

springboot网站开发02-接入持久层框架mybatisPlus&#xff01;经过上一小节内容分享&#xff0c;我们的项目嵌套模式框架搭建好了&#xff0c;下面就是开始编辑具体的业务代码了&#xff0c;我们使用到了持久层框架是mybatisPlus插件。下面是一些具体的植入框架的操作步骤。 第…

Python 光速入门课程

首先说一下&#xff0c;为啥小编在即PHP和Golang之后&#xff0c;为啥又要整Python&#xff0c;那是因为小编最近又拿起了 " 阿里天池 " 的东西&#xff0c;所以小编又不得不捡起来大概五年前学习的Python&#xff0c;本篇文章主要讲的是最基础版本&#xff0c;所以比…

DT DAY3 信号和槽

作业&#xff1a; 1> 思维导图 2> 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 btn3 new QPushButton("按钮3",this);btn3->resize(ui->btn2->width(),ui->b…

研发流程图

1、需求评审流程 2、用例评审流程 3、代码评审流程 4、产品功能上线流程