【JavaEE初阶】——第七节.Servlet入门学习笔记

news2024/9/20 18:37:51

作者简介:大家好,我是未央;

博客首页:未央.303

系列专栏:JavaEE进阶

每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!


文章目录

前言

一、前置知识:Maven

1.1 🍎初识Maven

1.2 🍎Maven的使用

 二、Servlet

第一个Servlet程序:hello world

方法步骤:

2.1 创建maven项目

 2.2 引入依赖

 2.3 创建目录结构

2.4 编写servlet代码

2.5 打包操作

 2.6 部署操作

2.7 验证程序

 2.8 一点相关补充

smart  tomato的使用

三、ServletAPI详解

3.1 HttpServlet

3.2 HtttpServletRequest

3.3 HttpServletResponse

​编辑

总结


前言

今天我们将进入到Servlet的认识当中,Servlet对于我们后面项目的创建编写有着非常重要的作用,需要我们能够非常熟练的掌握他;


一、前置知识:Maven

1.1 🍎初识Maven

Maven,这是我们在编写Servlet代码的时候,要用到的一个常见的工具;

maven的介绍:

Maven, 是Java 世界中的一个非常知名的 “工程管理工具 / 构建工具”。

它的核心功能:

  • 1、管理依赖
  • 2、构建 / 编译
  • 3、打包 

有的人可能会产生疑问:编译,不是编译器的工作吗?和 Maven 有什么关系呢?

其实 Maven 的 构建 / 编译,也是在调用 JDK 来去进行 编译 和 打包 的工作。

但是呢,如果你光用 JDK ,就好像是:
执行这个操作,你去进行编译。
执行下一个操作,你去进行打包。


而现在Maven 把 这一系列的操作,都给你串起来了。

用一个成语来形容:一气呵成;
因此,Maven 存在的意义:
就是能够直接把这些操作(管理依赖,构建 / 编译,打包)串起来。(一气呵成)


尤其是一些比较大的程序,它里面有很多模块。
你要是每一个模块,都去手动去敲一个命令去编译;或者每一个模块,都去点一下进行打包,这就很麻烦了。

但是,我们如果使用 Maven,就可以一键式的来帮我们把这里的这些操作,全部完成。

对于上面说到的构建/编译,我还知道。可是这个打包和依赖是什么意思?????


打包:就是把Java代码给构造成jar包,或者是war包。

 jar包:其实就是一个特殊的压缩包,类似于 rar。里面就是把 各种 .class 文件,放到一起来。然后,进行压缩得到的包,就是 jar 包。
war包,也是同理。只是与 jar 包,在细节上存在差别。 

另外,打包,也是 Maven 调用 JDK 里面的功能来实现的。(强调一下)


依赖:就是你在进行一个A操作之前,先要进行一个B操作。如果没有B操作的实现,你A操作就无法完成。

🌰举例说明:

要想有老婆,就必须先要有结婚的对象。
要想有结婚的对象,就必须先要有 女朋友。
要想有女朋友,就必须要有自己中意的对象。


其中 结婚的对象,女朋友,中意的对象,都是进行前者操作的必要条件。
两者之间的关系,就被称为 “依赖”。 

咱们写代码的时候,也是有很多依赖的。

只是当前阶段,依赖的东西不多。


1、经常会依赖标准库(集合类:Scanner,顺序表,链表等等…)

但是,更严格来说:标准库并不算是依赖。
因为,你只有安装了JDK,这些东西就都会有。【自带的】
但是,要想执行 Java 程序,肯定是需要依赖 JDK 的。
因此,Java 程序 和 JDK 是属于 依赖关系,
但java程序和标准库之间的依赖关系,太勉强了。


2、经常依赖第三方库

第三方库:就是我们写代码的时候,需要引入的一些其它的jar包。
就像前面讲 JDBC编程 的时候,当时就下载了一个 mysql 的驱动包。
当时,我们要想进行 JDBC 编程,这个 驱动包 是必不可少的!
这也就属于依赖。

其实写代码的时候,有时候的依赖也会非常复杂。
你引入了一个第三方库A,而这个 A 又依赖于 库 B,B 由依赖于 C,C又依赖于D,
类似这样的套娃操作,我们要想使用 A,就必要把它前面所依赖的库,全部引入。

如果我们是手动去管理这个依赖,那就会相当的麻烦!!
不光你得研究清楚,每个库都依赖哪些其他库。
而且,还得要研究清楚,这些依赖之间的版本是否匹配的问题。
如果版本不匹配,搭配起来使用,就会有很多莫名其妙的bug存在。


为了解决上述的依赖问题,很多编程员都引入了自己的包管理工具(自动解决依赖)。
Java:Maven,Gradle
Python:pip
JS:npm
各种语言都有着自己的包管理工具。
除了 C++。。。
这就是一个比较悲伤的故事了。
目前为止,C++官方还没有提供这样的一个包管理工具。
第三方的包管理工具是有,但是问题多。
就没有一个像 Maven 这种这么成熟的工具。


1.2 🍎Maven的使用

对于Maven来说,我们不用下载,因为idea中内置了线程的Maven,我们之间拿来用就好。

下面我们主要介绍在Maven在idea中的使用:
 

1、新建一个Maven项目:


2、Maven的使用

首先我们先了解刚刚我们新创建的Maven项目的组成部分


下面我们以mysql驱动包的引入来说明Maven引入依赖的流程 


 二、Servlet

Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app(网页).

第一个Servlet程序:hello world

方法步骤:

2.1 创建maven项目


 2.2 引入依赖

因为Servlet这个API部署JDK内置的,而是第三方(Tomcat)提供的,所以我们要想使用,就需要额外的引入Servlet依赖 ;

 我们借助Maven来引入Servlet依赖——这里我们所导入的第三方库都是从Maven中央仓库中获取的:
中央仓库链接:https://mvnrepository.com/

图示说明:


 2.3 创建目录结构

虽然当下 Maven 帮我们创建了一些目录,但是还不够。

当前这个目录还不足以支撑我们写一个 Servlet 项目,我们这个项目是依赖Tomca服务器,为了符合Tomcat的格式,我们就需要手动创建一些目录和文件。

 注意:

这些目录和文件的格式是固定的,不要问为啥要创建这样一个目录或者说文件,这是为了符合Tomcat而弄出的硬性要求;

图示示例:


其中这个web.xml文件里的内容不能为空,需要放下述代码:

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>

 对上述文件的一些解释:
webapp 目录就是未来部署到 Tomcat 中的一个重要的目录. 当前我们可以往 webapp 中放一些
静态资源, 比如 html , css 等.
在这个目录中还有一个重要的文件 web.xml. Tomcat 找到这个文件才能正确处理 webapp 中的动态资源.


2.4 编写servlet代码

图示示例:

 经过上面的分析,我们可以知道,我具体的servlet代码是要在doGet这个方法中写的,下面我们深入这个方法来看一下

 你以为到了这里就大功告成了吗?

我们要实现的是通过在浏览器输入url(发一个HTTP的get请求),进而通过tomcat服务器来调用我们这个doGet。

当我们成功给tomcat发了一个get请求,tomcat怎么知道要调用具体哪个servlet代码呢?

这里我们希望调用我们HelloServlet类中的doGet方法,那么我们就需要给我们这个类添加一个“标识符”,同时把这个标识符写到在浏览器url中中,这样tomcat就能够识别到这个请求具体是要调用哪个servlet代码了。

代码示例:


2.5 打包操作

定义:

刚刚我们编写的servlet代码是不能单独运行的

我们的servlet程序要配合Tomcat才能正确执行,这里我们的servlet代码就相当于是一节节的车厢,光有车厢不能跑起来,还需要车头——也就是Tomcat的帮助才能跑起来;

打包就是把你车厢和车头连接起来,让车头Tomcat拖着我们的车厢Servlet程序来执行;

下面我们看一下打包的具体实现过程 

代码示例:


 2.6 部署操作

即:把 war 包拷贝到 Tomcat 的 webapps 目录下;

让Tomcat(车头)拖着war执行。


2.7 验证程序

其实就是看看能不能通过tomcat服务器在浏览器来访问我们的servlet代码;


 2.8 一点相关补充

与HTML生成页面不同,我们当前的通过Servlet生成的页面是动态的,根据用户输入的不同,是可以得到不同的显示效果的。

此外当我们修改了servlet代码后,我们需要重写进行打包、部署、然后再验证程序。

注意:我们在重新部署时候,最好重启一下tomcat;

但是如果每次改了代码,我们都要重新打包生成一个.war文件,然后再把这个新的.war文件放到tomcat目录中的webapps目录下,然后再找到bin目录下的startup.bat文件重新启动tomcat。这样子的确十分的麻烦。

为此我们可以借助第三方工具:smart tomcat来简化我们的打包和部署

  •  smart tomcat这个idea里的一个插件,就 保证我们把tomcat服务器和我们的idea关联起来。保证我们一键式完成打包和部署操作。
  • 但是我们要知道idea 和 tomcat是两个独立的程序!!! tomcat部署idea功能的一部分 ,tomcat只是通过idea插件:smart tomcat,来和我们的idea建立起来一个合作的桥梁。 

为什么要提这一点?
这是因为后面开发,主要还是通过 idea 调用 Tomcat的方式来进行。
用的时间长了之后,大家就对于 Tomcat的印象,就开始模糊。
甚至会产生 Tomcat 是 idea 功能的一部分,这样的错觉!


以后大家在工作中,会涉及到几个不同的环境。 


smart  tomato的使用

图示举例:

 使用 Smart Tomcat 部署的时候, 我们发现 Tomcat 的 webapps 内部并没有被拷贝一个 war 包,也没有看到解压缩的内容.

                                                                                                                                                  
Smart Tomcat 相当于是在 Tomcat 启动的时候直接引用了项目中的 webapp 和 target 目录(@WebServlet()中的内容).


三、ServletAPI详解

3.1 HttpServlet

相信通过上面我们第一个hello world程序,大家应该已经知道了。我们写的servlet代码总是继承自HttpServlet这个类——我们就是重写其中的doPost、doGet等相关方法来被Tomcat执行调用的;

这个过程 和 继承 有关,就会涉及到Java中的一个核心语法 “多态”。


在我们学习Java的时候,多态就是我们一个难啃的骨头。
如果以后在面试的时候,被面试官问到。
让你讲讲对多态的理解,最好方式就是 举例子。

最好举一些有意义的例子,并且最好是关于代码的。


举例说明:
比如:
集合类: List list = new ArrayList<>();
多线程:class Mythred extends Thread{ 重写 run方法 }

像这种平常刷题经常会用到的代码,用来举例是最好的。


另外,Servlet 也是一个很好的例子!
因为我们自己写的代码也是通过继承重写的方式来实现的。
因此在执行的过程,是一定会涉及到 “多态的”!


HttpServlet的核心方法

我们实际开发的时候主要重写 doXXX 方法, 很少会重写 init / destory / service; 

这些方法的调用时机, 就称为 "Servlet 生命周期". (也就是描述了一个 Servlet 实例从生到死的过程)

Servlet生命周期描述的是Servlet创建到销毁的过程

  • 当一个请求从HTTP服务器转发给Servlet容器时,容器检查对应的Servlet是否创建,没有创建就实例化该Servlet,并调用init()方法,init()方法只调用一次,之后的请求都从第二步开始执行;
  • 请求进入service()方法,根据请求类型转发给对应的方法处理,如doGet, doPost, 等等
  • 容器停止前,调用destroy()方法,进行清理操作,该方法只调用一次,随后JVM回收资源。

图示说明:


注意:Httpservlet实例只是在程序

其中的doGet和doPost等doxx方法,是根据HTTP的请求的不同来分别执行的。

doGet处理get请求,doPost处理post请求,doPut处理put请求;


3.2 HtttpServletRequest

核心方法:



打印请求信息 

代码示例:


获取get请求的参数

方法代码示例:


 获取post请求的参数

代码示例:


3.3 HttpServletResponse

同样的,HttpServletResponse 对应到 一个 HTTP 响应。
HTTP 响应中有什么,这里就有什么。

Servlet 中的 doXXX 方法的目的就是根据请求计算得到相应, 然后把响应的数据设置到
HttpServletResponse 对象中.

然后 Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式, 转成一个字符串, 并通过Socket 写回给浏览器


核心方法


 方法使用代码案例:

自动刷新:

方法步骤:
1
.
实现 Servlet, 设置 header, 实现每隔 1s 自动刷新页面的效果. 页面上要显示当前时间;

2.让页面上能够显示格式化的事前. 例如 2022-01-19 12:00:00;

 3、重定向:访问 /redirect 路径后, 自动重定向到 搜狗主页 的代码.

注意:

光理解了 Servlet API,还不足以支撑我们写出一个功能完整的网站。
还需要理解一个网站的开发过程大概是什么样子的。
理解这里的一些基本的编程思维 和 设计思路。

这就需要通过更多的案例,来进行强化了。

下篇博文就让我们一起事情一个服务器版本的表白墙(注意不只是单单的前端HTML文件哦,还有与之相对应的后端代码——说白了就是一个简单的前后端交互的栗子)

总结

今天我们对于servlet有了非常详细的认识,接下来我们就将他应用到我们的实战项目的编写当中,让我们拭目以待吧!!!!!!!!!!!!!

 

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

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

相关文章

基于 moleculer 微服务架构的智能低代码PaaS 平台源码 可视化开发

低代码开发平台源码 低代码管理系统PaaS 平台 无需代码或通过少量代码就可以快速生成应用程序的开发平台。 本套低代码管理后台可以支持多种企业应用场景&#xff0c;包括但不限于CRM、ERP、OA、BI、IoT、大数据等。无论是传统企业还是新兴企业&#xff0c;都可以使用管理后台…

filebeat介绍

1、filebeat概述 Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置&#xff0c;收集日志事件&#xff0c;并将它们转发到Elasticsearch或 Logstash或kafka进行索引 1.1 Filebeat两个主要组件 prospector 和 harvester。 prospector&a…

SpringBoot项目使用MyBatisX+Apifox IDEA 插件快速开发

今天跟大家介绍两个快速开发项目的插件。能大大提高开发效率。希望能帮助到大家。 1、MyBatisX 插件 MyBatis-Plus为我们提供了强大的mapper和service模板&#xff0c;能够大大的提高开发效率。但是在真正开发过程中&#xff0c;MyBatis-Plus并不能为我们解决所有问题&#xf…

Spark Streaming流媒体引擎

Spark Streaming是Spark的上一代流媒体引擎。Spark Streaming不再有更新&#xff0c;它是一个遗留项目。Spark中有一个更新且更易于使用的流媒体引擎&#xff0c;称为结构化流媒体 概述 Spark Streaming是核心Spark API的扩展&#xff0c;支持实时数据流的可扩展、高吞吐量、…

技术分享 | App测试时常用的adb命令你都掌握了哪些呢?

adb 全称为 Android Debug Bridge&#xff08;Android 调试桥&#xff09;&#xff0c;是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具&#xff0c;可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作&#xff0…

Python Geoplotlib 可视化地理数据的综合指南

Geoplotlib&#xff1a; Exploring the World with Python Python Geoplotlib 可视化地理数据的综合指南 Geoplotlib是一个强大的Python库&#xff0c;用于可视化地理数据。它提供了一种简单直观的方法来创建地图并在其上绘制地理数据。 Geoplotlib 建立在 matplotlib 和 numpy…

有哪些常用的设计素材资源网站?

设计师要想在瞬息万变的设计世界中紧跟潮流&#xff0c;就需要不断探索和访问流行的UI设计网站&#xff0c;看看什么是时尚。UI设计网站也是寻求可能解决方案、脚本和设计反馈的好地方。Behance对很多设计师来说并不陌生&#xff0c;是Adobe的UI设计网站。然而&#xff0c;2022…

蓝桥杯单片机第九届国赛 真题+代码

iic.c /* # I2C代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行编写相关代码或以该代码为基础&#xff0c;根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求&#xff0c;进行代码调试和修改。 */ #include <STC1…

【Vue3】局部组件和全局组件

1. 局部组件 Card.vue <template><div class"card"><header><div>标题</div><div>副标题</div></header><section>内容</section></div> </template><script setup lang"ts"…

Jenkins集成SonarQube保姆级教程

Jenkins是自动化部署平台&#xff0c;一个粗眉大眼的糙汉子&#xff01; SonarQube是代码扫描平台&#xff0c;一个眉目清秀的小女子&#xff01; 有一天&#xff0c;上天交给我一个任务&#xff0c;去撮合撮合他们&#xff01; 我抬头看了看天&#xff0c; 不&#xff0c;…

第五章 传输层

第五章 传输层 5.1 运输层的功能 运输层功能&#xff1a; 运输层为应用进程之间提供 端到端的逻辑通信&#xff08;但网络层是为主机之间提供逻辑通信&#xff09;。 运输层还要对收到的报文进行差错检测。 运输层提供面向连接和无连接的服务 ​ 从通信和信息处理的角度看…

Jsp+Ssh+Mysql实现的简单的企业物资信息管理系统项目源码附带视频指导运行教程

由jspssh&#xff08;springstruts2mysql&#xff09;实现的企业物资信息管理系统&#xff0c;系统功能比较简单&#xff0c;实现了基本的管理员、操作员等用户管理、物品分类管理、物品管理、入库管理、出库管理、库存预警、客户管理、供应商管理等基本功能需要的可以联系我分…

Linux工具【1】(编辑器vim、编译器gcc与g++)

vim详解 引言vimVim的三种模式及模式切换普通模式下操作底行模式下操作 gcc与ggcc的使用&#xff08;g类似&#xff09;预编译编译汇编链接静态库与动态库 总结 引言 vim&#xff08;vi improved&#xff09;编辑器是从 vi 发展出来的一个文本编辑器。 代码补全、编译及错误跳…

C# 定时器封装版

一、概述 在 Winform 等平台开发中&#xff0c;经常会用到定时器的功能&#xff0c;但项目定时器一旦写多了&#xff0c;容易使软件变卡&#xff0c;而且运行时间长了会造成软件的闪退&#xff0c;这个可能是内存溢出造成的&#xff0c;具体原因我也没去深究&#xff0c;另一个…

2023年五大团队任务管理跟踪软件排行榜揭晓

企业对高效生产力的需求让团队任务管理跟踪软件在现代商业环境中变得越来越重要&#xff0c;然而市场上存在众多的任务管理工具&#xff0c;选择合适的工具对于提高工作效率和实现组织目标至关重要。本文章将提供一个客观的团队任务管理跟踪软件排行榜&#xff0c;帮助读者根据…

springboot创建并配置环境(二) - 配置基础环境

文章目录 一、介绍二、配置系统属性和环境变量三、配置自定义属性命令行参数四、作为应用配置信息 一、介绍 在上一篇文章&#xff1a;springboot创建并配置环境(一) - 创建环境中我们探讨了springboot是如何根据当前应用程序类型去创建对应的环境实例的。接下来探讨如何去配置…

java上传和解压任意压缩包

java上传zip文件并解压读取_java上传压缩包解压_梓隽的博客-CSDN博客 添加依赖 <dependency><groupId>com.github.junrar</groupId><artifactId>junrar</artifactId><version>7.4.1</version></dependency><dependency&g…

无涯教程-jQuery - hide( speed, callback)方法函数

hide(speed&#xff0c;[callback])方法使用优美的动画隐藏所有匹配的元素&#xff0c;并在完成后触发可选的回调。 hide( speed, [callback] ) - 语法 selector.hide( speed, [callback] ); 这是此方法使用的所有参数的描述- speed - 代表三个预定义速度("slow…

四. 点云着色(真彩点云)方案

前面内容&#xff1a; 一. 器件选型心得&#xff08;系统设计&#xff09;--1_goldqiu的博客-CSDN博客 一. 器件选型心得&#xff08;系统设计&#xff09;--2_goldqiu的博客-CSDN博客 二. 多传感器时间同步方案&#xff08;时序闭环&#xff09;--1 三. 多传感器标定方案&…

【业务功能篇57】Springboot + Spring Security 权限管理 【上篇】

4.权限管理模块开发 4.1 权限管理概述 4.1.1 权限管理的意义 后台管理系统中&#xff0c;通常需要控制不同的登录用户可以操作的内容。权限管理用于管理系统资源&#xff0c;分配用户菜单、资源权限&#xff0c;以及验证用户是否有访问资源权限。 4.1.2 RBAC权限设计模型 …