网站开发--详解Servlet

💕"Echo"💕
作者:Mylvzi
文章主要内容:网站开发–详解Servlet
在这里插入图片描述

一.基本介绍

tomcat是Java中开发服务器的重要的一个工具,任何开发的服务器都要部署在tomcat之上,可以说tomcat是所有服务器的底座,为了更好的操作http,tomcat对原生的api进行了封装,封装为Servlet*,通过servlet就可以非常方便的完成和http协议的祥光操作

关于Servlet的学习,主要学习以下三个类即可:

  1. HttpServlet
  2. HttpRequestServlet
  3. HttpResponseServlet

掌握好这三个类,就能很好的使用Servlet

二.HttpServlet

HttpServlet是Servlet中最核心的一个类,我们创建的用于进行交互的类都必须要继承于HttpServlet

在这里插入图片描述

HttpServlet中常用方法
在这里插入图片描述

  1. init()方法会在一个Servlet对象被创建好之后,自动的调用这个方法,完成初始化操作
  2. destroy()方法会在Servlet对象被销毁之前进行调用,完成一些释放资源的工作
  3. service()方法实际上并不会直接使用到,而是被doGet(),doPost()给替代

init(),destroy(),service()这三个方法在实际的开发中很少用到,都是tomcat自动的在合适的时机帮助我们调用的,这三个方法经常会出现到一个经典的面试题中:

经典面试题:Servlet的生命周期

Servlet的生命周期是指Servlet实例被创建出来到被销毁的过程,具体来说可以分为以下几点:

  1. Servlet实例的创建:当客户端发送请求,服务器就要创建出一个Servlet实例来处理请求,通过构造方法创建出一个Servlet实例
  2. 初始化:在实例被创建好之后,会自动调用init()方法,来完成一些初始化操作,比如:读取配置文件,数据库的连接,一些资源的初始化
  3. 处理请求:当有客户端的http请求发送到服务器时,Servlet会先调用service()方法,判断请求的具体类型(根据请求的方法),service()方法就像是火车的中转站一样,看你的目的是什么,再给你对应的路线.这里也是一样,如果请求是GET方法,就会交给代码中的doGet()方法处理,如果是POST请求,就会交给doPost()方法
  4. 实例的销毁:当我们不再使用Servlet实例时(客户端不再有请求发送过来/人为关闭),先调用destroy()方法,做一些清理工作,比如数据库的断开,资源释放等

这个过程类似于生命周期中的起始、成长、运行和结束阶段,每个阶段都有其特定的任务和目的。

总的来说,我们所写的代码都要继承于HttpServlet这个类,重写里面的方法,并将重写的方法插入到tomcat已有的框架之中,我们只需关注数据处理部分,其余操作都是tomcat自动帮助我们完成

二.HttpServletRequest

1.介绍

HttpServletRequest表示一个Http请求类,用于接受从客户端传输过来的http请求

HttpServletRequest中的很多属性和请求头的相关属性相同,理解好请求头中的相关属性有助于学习HttpServletRequest类

一个Http请求由四部分组成:

  1. 首行 = 方法 + URL + 版本号
  2. 请求头:由键值对组成
  3. 空行
  4. body

2.HttpServletRequest常用方法介绍

在这里插入图片描述

在这里插入图片描述

1.获取首行信息和header中的数据**

@WebServlet("/request1")
public class RequestParameter extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 尝试获取请求报文中的详细信息StringBuffer stringBuffer = new StringBuffer();// 这个是线程安全的// 1.获取首行信息stringBuffer.append(req.getMethod());stringBuffer.append("<br>");// <br>是html中的换行标签stringBuffer.append(req.getRequestURI());stringBuffer.append("<br>");stringBuffer.append(req.getProtocol());stringBuffer.append("<br>");// 2.获取请求头信息Enumeration<String> enumeration = req.getHeaderNames();while (enumeration.hasMoreElements()){// 利用迭代器访问每一个头部keyString key = enumeration.nextElement();String val = req.getHeader(key);// 获取key的值stringBuffer.append(key + ":" + val + "<br>");}resp.getWriter().write(stringBuffer.toString());}
}

获取结果:
在这里插入图片描述

总结:
对于请求报文来说,获取首行中的信息(版本号/方法/URL),可以直接通过指定的get方法来获取,获取请求头(header)中内容,可以利用迭代器,将请求头中的所有键值对都存储到一个集合之中,再利用getHeader方法,指定参数,来获取对应的value值

2.获取请求报文中的query string**

query string,译为查询字符串,往往和用户的关键信息相关(登录密码),在日常的开发中,我们也经常利用到query string来完成一些业务上的逻辑,所以获取请求报文中的query string是一个很频繁且重要的操作

query string在请求报文中的位置是不固定的,具体位置取决于请求报文中的方法(method),如果方法是Get,query string就位于URL之中,如果方法是Post,query string就位于body之中

注意:实际上URL中是包含query string的,但是在servlet的getURL类似的方法中返回的是一个不携带query string的URL(可能是因为查询字符串这个操作过于频繁,就单独拿出来进行包装了)

1.方法为Get

说明:前后端交互的一个关键点在于前端和后端要对传输内容的格式都了然于胸,后端要知道前端是如何组织数据进行传输的

比如,规定好客户端发送的请求报文中的query string的格式是类似于:

username=zhangsan&password=123456

那么服务器这边就可以规定好的格式进行解析

代码演示:

@WebServlet("/request2")
public class GetRequestParameter extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取用户传输过来的query string// 假设用户传输过来的query string的格式是形如 username='lisi'&password='123'这样的形式// servlet会自动将query string中的所有内容存储到一个Map结构之中(键值对都存储到其中// 后端程序员只需通过getParameter()方法来获取具体的值即可// 注意你构造的query string内部不需要有引号!!!// 可以根据这个特性来完成很多操作  比如判断用户名是否正确// 在传输中文的时候最好传输urlencode之后的内容String username = req.getParameter("username");String password = req.getParameter("password");System.out.println("username=" + username);System.out.println("password=" + password);}
}

在这里插入图片描述

当在浏览器中输入:“http://127.0.0.1:8080/testsevlet/request2?username=zh&password=123”

在终端上显示:
在这里插入图片描述

如果不添加query string,显示的结果就是null

在这里插入图片描述

总结:

对于Get方法的请求,query string位于首行中,直接使用getParameter方法,并制定参数,就能获取到对应的值

2.方法为Post

此时query string位于body之中,而body的传输是有不同的格式的,对于不同格式的body,要采用不同的方法来进行解析,获取query string,常用的body格式有两种:

  1. form表单
  2. json
1.form表单格式

body通过form表单来进行数据的组织,内部是键值对,Content-Type:application/x-www-form-urlencoded

获取body中的内容和上面获取query string的方法一致

通过postman发送一个post请求
在这里插入图片描述
服务器的代码不变,打印结果为:
在这里插入图片描述

总结:如果body的格式是form表单,虽然此时query string位于body之中,但是也可以直接使用**getParameter()**方法,并指定参数来获取要查询的内容

2.json格式

如果body是通过json格式来进行组织,原生的Servlet是不支持解析json格式的数据的,此时需要进入第三方库jackson来帮助进行json格式数据解析(jackson也是spring官方推荐的用于解析JSON格式数据的第三方库)

准备:引入jackson依赖

在maven中找到jackson,选择合适的版本进行路径的复制,并在项目中的pom.xml中引入

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.0</version></dependency>

在这里插入图片描述

在这里插入图片描述
引入好依赖之后就可以使用jackson中的api解析json格式的数据

具体的操作依赖于一个类和两个核心方法:
在这里插入图片描述
ObjectMapper(对象映射器),是JSON数据与Java对象转换的核心枢纽,在交互时,通过JSON字符串进行网络传输,处理逻辑,使用Java对象

站在服务器的角度,我们收到的数据是JSON字符串,需要将其转化为Java对象(read放哪发),来完成一些业务上的逻辑,完成后,还需要将处理好的Java对象转化为JSON字符串(write方法)

1.创建一个类 用于接收JSON字符串

// 创建一个类  用于接收JSON字符串
class Request {public String username;public String password;
}

2.交互

    // 创建出ObjectMapper实例private ObjectMapper objectMapper = new ObjectMapper();@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1.将JSON字符串转化为Java对象Request request = objectMapper.readValue(req.getInputStream(),Request.class);// 2.获取query stringString username = request.username;String password = request.password;// 3.打印String user = "username=" + username + "<br>password=" + password;System.out.println(user);// 4.将打印的结果传输给客户端// 这个方法就是和上面的read方法相反// 这里把Java对象转化为json字符串,传输给客户端String respBody = objectMapper.writeValueAsString(user);resp.getWriter().write(respBody);}

3.发送请求并打印结果

在这里插入图片描述
在这里插入图片描述

objectMapper.readValue()内部做了很多工作,最终的结果是把JSON字符串转化为Request的Java对象,内部具体实现细节为:

  1. 根据请求报文的输入流(就是方法的第一个参数)获取到请求报文中的body部分的所有内容
  2. 按照JSON格式进行解析,并把解析出来的所有的键值对都存储到一个Map之中
  3. 通过第二个参数(反射)来明确要转化的Java对象,拿着Java对象中的属性从Map之中寻找对应的值,并把对应的值赋给赋给创建出来的Java对象

通过以上三步就完成了JSON字符串到Java对象的转化,举一个简单的例子
在这里插入图片描述

以上就是关于HttpRequestServlet的所有内容,可以观察到,这个类中大部分方法都是get方法,主要原因是因为我们是想通过这个类获取到客户端发送的请求报文,而不是去修改请求报文,所以不需要设置set方法,而在下面要介绍的HttpResponseServlet类中,更多的方法就是set方法(服务器这边要返回一个响应报文)

三.HttpResponseServlet

常用方法:
在这里插入图片描述

setStatus() 设置状态码

@WebServlet("/status")
public class StatusServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.setStatus(404);// 此时响应报文的状态码就被设置为404// 如果只传输上述的状态码  浏览器是空白界面  不会有任何信息// 我们一般看到的都是有一个"错误界面"// 可以通过resp.sendError(404,"你小子搜的是什么资源???");// 这里面就比较的灵活了// 根据一定的逻辑  来灵活的输出状态码信息}
}

当需要发送报错信息时,更推荐使用第二种方式,更加灵活
结果显示:
在这里插入图片描述

setHeader 在头部中设置一些属性

自动刷新

每间隔1s就自动刷新界面,利用header中的refresh字段

@WebServlet("/refresh")
public class RefreshServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setHeader("refresh","1");// 1s 后自动刷新界面resp.getWriter().write("" + System.currentTimeMillis());}
}

在这里插入图片描述
在这里插入图片描述

sendRedirect() 构造重定向

当状态码是3xx时,就代表要进行重定向,利用sendRedirect方法可以直接跳转

@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        // 一个重定向的报文包含两部分:状态码 和 要跳转的界面
//        resp.setStatus(302);// 核心是要有对应的状态码(以3开头),以及要跳转的界面(Location字段)
//        resp.setHeader("Location","https://sogou.com");// 此时就会自动跳转到搜狗界面// 上述写法比较繁琐  一般来说会使用下面这个方法来设置一个跳转的响应报文resp.sendRedirect("https://sogou.com");}
}

不仅可以通过服务器这边设置跳转的界面,还可以在前端中使用JS定时器来实现相同的效果

<!DOCTYPE html>
<html>
<head><title>页面跳转示例</title><script>// 在页面加载后,等待 3 秒后跳转到新页面window.onload = function() {setTimeout(function() {window.location.href = "https://www.sogou.com";}, 3000); // 3 秒};</script>
</head>
<body><h1>页面将在 3 秒后跳转到搜狗主页</h1>
</body>
</html>

以上就是<<网站开发–详解Servlet>>的所有内容,重点掌握三个类的api的基本用法,多多使用就能融会贯通,实现更复杂的交互!

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

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

相关文章

配置多个后端 API 代理

在开发 React 应用时&#xff0c;通常会涉及到与后端 API 的交互。而在开发过程中&#xff0c;我们经常需要在开发环境中使用代理来解决跨域请求的问题。Create React App 提供了一种简单的方式来配置代理&#xff0c;即通过创建一个名为 setupProxy.js 的文件来配置代理规则。…

Linux之安装jdk,tomcat,mysql,部署项目

目录 一、操作流程 1.1安装jdk 1.2安装tomcat&#xff08;加创建自启动脚本&#xff09; 1.3 安装mysql 1.4部署项目 一、操作流程 首先把需要用的包放进opt文件下 1.1安装jdk 把jdk解压到/usr/local/java里 在刚刚放解压包的文件夹打开vim /etc/profile编辑器&#xff0c…

高防服务器的原理

高防服务器的原理是什么?高防服务器的原理可以从哪些方面解读&#xff0c;小编为您整理发布高防服务器的工作原理主要基于以下几个方面&#xff1a; - **防火墙配置**&#xff1a;在服务器的节点上配置防火墙&#xff0c;能够自动过滤网络恶意攻击&#xff0c;提高网络安全性。…

Linux之部署前后端分离项目

Nginx配置安装 1.安装依赖 我们这里安装的依赖是有4个的 [rootlocalhost opt]# yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2.上传解压安装包 [rootlocalhost opt]# tar -xvf nginx-1.13.7.tar.gz -C /usr/local/java/3.安装Nginx &#xff0…

聚观早报 | OPPO公布全新AI战略;华为P70 Art影像细节曝光

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 2月22日消息 OPPO公布全新AI战略 华为P70 Art影像细节曝光 苹果正加速开发智能戒指 微软将大规模投资人工智能 …

openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore

文章目录 openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore229.1 设计原理229.2 核心优势229.3 使用指导 openGauss学习笔记-229 openGauss性能调优-系统调优-配置Ustore Ustore存储引擎&#xff0c;又名In-place Update存储引擎&#xff08;原地更新&#xff09…

北上广深数据分析岗位的薪资对比

目录 一、数据介绍及预处理 1、数据介绍 2、数据预处理 二、数据分析 1、岗位数量、薪资水平统计 3、企业维度岗位数量 4、top薪资岗位 三、划重点 少走10年弯路 之前跟大家分享过BOSS直聘上base北京的数据分析职位薪资数据分析&#xff0c;这次爬了北上广深四个城市的…

【MySQL面试复习】详细说下事务的特性

系列文章目录 在MySQL中&#xff0c;如何定位慢查询&#xff1f; 发现了某个SQL语句执行很慢&#xff0c;如何进行分析&#xff1f; 了解过索引吗&#xff1f;(索引的底层原理)/B 树和B树的区别是什么&#xff1f; 什么是聚簇索引&#xff08;聚集索引&#xff09;和非聚簇索引…

GEE数据集——全球无缝高分辨率温度数据集(GSHTD)

全球无缝高分辨率温度数据集&#xff08;GSHTD&#xff09; 本研究中介绍的全球无缝高分辨率温度数据集&#xff08;GSHTD&#xff09;为各领域的研究人员提供了全面而宝贵的资源。该数据集涵盖 2001 年至 2020 年&#xff0c;主要关注陆地表面温度 (Ts) 和近地面气温 (Ta)。GS…

camunda7流程平台技术架构概述

Camunda Platform 是一个基于 Java 的BPMN(流程引擎)、DMN&#xff08;规则引擎&#xff09;、CMMN&#xff08;案例管理&#xff09;的开源框架。主要组件是用 Java 编写的&#xff0c;主要专注于为 Java 开发人员提供在 JVM 上设计、实现和运行业务流程和工作流所需的工具&am…

【AIGC大模型】跑通wonder3D (windows)

论文链接&#xff1a;https://arxiv.org/pdf/2310.15008.pdf windows10系统 显卡&#xff1a;NVIDIA rtx 2060 一、安装anaconda 二、安装CUDA 11.7 (CUDA Toolkit 11.7 Downloads | NVIDIA Developer) 和 cudnn 8.9.7(cuDNN Archive | NVIDIA Developer)库 CUDA选择自定…

接口自动化测试用例如何设计

说到自动化测试&#xff0c;或者说接口自动化测试&#xff0c;多数人的第一反应是该用什么工具&#xff0c;比如&#xff1a;Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀&#xff0c;甚至出现“ 做平台的 &…

前后端分离Vue+node.js在线学习考试系统gqw7o

与其它应用程序相比&#xff0c;在线学习平台的设计主要面向于学校&#xff0c;旨在为管理员和学生、教师、院系提供一个在线学习平台。学生、教师、院系可以通过系统及时查看公告信息等。 在线学习平台是在Windows操作系统下的应用平台。为防止出现兼容性及稳定性问题&#xf…

多输入时序预测|WOA-CNN|鲸鱼算法优化的卷积神经网络时序预测(Matlab)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、完整程序数据下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matalb平台编译&…

无人集群试验评估现状及技术方法综述

源自&#xff1a;系统工程与电子技术 作者&#xff1a;赵蕊蕊, 于海跃, 游雅倩, 张涛, 陶敏, 姜江 “人工智能技术与咨询” 发布 摘 要 试验评估是促进装备系统作战能力生成和实战化应用的重要手段。无人集群依靠自组网实现复杂交互, 具备典型的智能性和涌现性, 开展无人集…

【大数据】Flink SQL 语法篇(四):Group 聚合

Flink SQL 语法篇&#xff08;四&#xff09;&#xff1a;Group 聚合 1.基础概念2.窗口聚合和 Group 聚合3.SQL 语义4.Group 聚合支持 Grouping sets、Rollup、Cube 1.基础概念 Group 聚合定义&#xff08;支持 Batch / Streaming 任务&#xff09;&#xff1a;Flink 也支持 G…

复制策略深入探讨

在之前的博客中&#xff0c;我们讨论了复制最佳实践和不同类型的复制&#xff0c;例如批量、站点和存储桶。但是&#xff0c;随着所有这些不同类型的复制类型的出现&#xff0c;人们不得不想知道在哪里使用哪种复制策略&#xff1f;从现有 S3 兼容数据存储迁移数据时&#xff0…

SV-6301 IP网络可视对讲报警柱简介

SV-6301 IP网络可视对讲报警柱简介 18123651365微信 功能特点&#xff1a; 1.全金属外壳&#xff0c;户外防风雨&#xff0c;坚固耐用&#xff0c;易于识别 2.单键呼叫&#xff0c;可通过软件指定呼叫目标&#xff0c;双向可视对讲广播喊话 3.终端内置扬声器和话筒眯头&…

GZ036 区块链技术应用赛项赛题第10套

2023年全国职业院校技能大赛 高职组 “区块链技术应用” 赛项赛卷&#xff08;10卷&#xff09; 任 务 书 参赛队编号&#xff1a; 背景描述 养老保险是对于老年人的最基本的生活保障。各种数据显示&#xff0c;当前的养老金市场规模庞大。2016年美国的养老金资…

SpringCloud-Docker原理解析

Spring Cloud和Docker的结合为微服务架构的部署和管理提供了强大的支持。本文深入剖析Spring Cloud与Docker的集成原理&#xff0c;从服务注册与发现、配置管理、负载均衡到容器化部署等方面展开详细解析。探讨Spring Cloud如何利用Docker容器技术实现服务的弹性伸缩&#xff0…