【Servlet 基础】

news2025/1/17 21:42:05

🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!

欢迎志同道合的朋友一起加油喔🤺🤺🤺


目录

1. 什么是Servlet?

2. 第一个Servlet程序   

1. 创建maven项目(基于IDEA2021)

2. 引入依赖 

3. 创建目录结构

4. 编写servlet代码

5. 打包

6. 部署

7. 验证程序

3.利用smart Tomcat 插件一键完成打包部署

3.1 安装smart Tomcat

 3.2 如何进行一键操作

3.3  smart Tomcat的适用场景

4. 七大步骤总结



1. 什么是Servlet?

在了解Servlet前,先了解一下为什么需要Servlet

Servlet产生的背景

前面学习了Tomcat,它是一个Web服务器,提供Web程序处理服务端对请求的解析和对响应的封装,也就是请求的解析和响应的封装都不需要我们自己手动写程序来完成 

比如我们将一个webapp(Web应用)部署到Tomcat中,如果自己写程序来处理请求和返回响应的内容,就需要调用Tomcat提供的API(Tomcat提供的类和接口中的方法和属性),如果此时更改Web服务器,我们自己写的请求解析和响应内容就无法使用了

Servlet是什么? 

Servlet是一种实现动态页面的技术,所谓动态页面就是用户不同,时间不同,输入的参数不同,页面内容也不会发生变化,而静态页面是内容始终固定不变的,html就是静态的资源文件

Servlet为不同的JavaWeb服务器规定了响应的编程规范,它屏蔽Web服务器实现的细节(不同的服务器对请求的解析和响应的封装可以是不同的),但是定义好了统一的编程规范(统一的类,接口,方法),也就是换一个Web服务器,还可以使用 

Servlet主要做的工作 

  • 允许程序员注册一个类,在服务器收到某个特定的HTTP请求的时候,执行这个类中的一些代码
  • 帮助程序员解析HTTP请求,把HTTP请求从一个字符串解析为一个HttpRequest对象
  • 帮助程序员构造HTTP响应,程序员只要给指定的HttpResponse对象填写一些属性字段,Servlet就会自动按照HTTP协议构造HTTP响应字符串,并通过Socket写回给客户端

2. 第一个Servlet程序   

Maven项目的引入

  • Maven是一个"构建工具",针对代码进行依赖管理、编译、打包、验证、部署等功能。我们之前写的代码,在IDEA中直接点击"运行"就可以运行了,这是因为之前写的代码都比较简单,也不需要将代码打包部署给别人来用
  • 但如果是一个复杂的项目,依赖了很多的第三方库,同时自身还有很多的模块,模块之间也存在依赖关系,此时编译运行就没那么简单了,Maven可以视为是针对复杂项目进行管理的一个解决方案
  • maven自身支持的功能有很多,我们下面主要使用两个功能:管理依赖和打包
  • 管理依赖:如果在项目中想使用某个第三方库,就可以使用maven把这个库下载下来并导入到项目中
  • 打包:把我们的代码编译好,将.class文件打包成压缩包(类似于.jar和.war这些)

我们直接基于IDEA内部现成的Maven来操作哈,首次创建项目会下载很多东西,

如果觉得下载过慢,可以参考我上一篇博客将maven源改为国内阿里云镜像

1. 创建maven项目(基于IDEA2021)

①选择Maven创建项目:

Maven Archetype是用来创建特定类型项目的模板,它的种类非常多,因为它可以由任何人创建并发布。以下是一些常见的官方和非官方的Maven Archetypes:

  1. maven-archetype-quickstart: 这是最基本的Archetype,它创建一个包含简单Java类和单元测试的项目。

  2. maven-archetype-webapp: 这个Archetype创建一个简单的Java web应用,包括一个servlet和一个JSP,以及相关的Web配置。

  3. maven-archetype-j2ee-simple: 这个Archetype创建一个简单的J2EE应用,包含一个EJB模块和一个Web模块。

  4. maven-archetype-simple: 这个Archetype创建一个非常简单的Maven项目,不包含任何特定的代码或者目录结构。

  5. maven-archetype-mojo: 这个Archetype创建一个Maven插件项目。

  6. spring-boot-archetype: 这是Spring Boot项目的官方Archetype,创建一个Spring Boot应用。

  7. jersey-quickstart-webapp: 这是Jersey框架的官方Archetype,创建一个RESTful Web服务。

  8. appengine-standard-archetype: 这是Google App Engine的官方Archetype,创建一个可以部署到Google App Engine的应用。

以上只是众多Archetype中的一部分。实际上,任何人都可以创建并发布他们自己的Maven Archetype,这意味着存在着大量的Archetypes,可以用来创建各种类型的项目。你可以在Maven的官方网站,或者其他第三方网站,查找更多的Archetypes。

很多大佬实现了很多的第三方库,这些第三方库就是统一把他们放到中央仓库里面的,方便用户去查找。

②创建好项目后的目录结构:

③如何使用Maven项目:

 最常用的就是如上图的打包操作,但是不仅仅是如此,图中罗列的所有都可以实现的。 

④pom.xml的简介

在Maven中,pom.xml是一个非常重要的配置文件,它描述了项目的基本信息和项目的构建配置。POM全称为Project Object Model,即项目对象模型。

  1. groupId:定义当前Maven项目所属的实际项目组。通常采用反向的公司网址作为组织的标识,例如 com.mycompany。这类似于Java的包名用于避免类名冲突的方式。

  2. artifactId:定义实际项目的名称。例如,你可能正在为你的项目 "my-app" 创建一个Maven项目。在这种情况下,artifactId将是 "my-app"。

  3. version:定义实际项目的版本。这通常与实际项目的发布周期相对应。例如,你可能在开发 "my-app" 的1.0版本,那么version就应该是 "1.0"。

这三个元素组合在一起形成一个坐标,唯一标识了一个项目在所有的Maven项目中的位置。

2. 引入依赖 

Maven项目创建完,会生成一个pom.xml文件,我们需要在pom.xml中引入Servlet API依赖的jar包 

注意:Servlet的版本要和Tomcat匹配,如果我们使用Tomcat 8.5,就需要使用Servlet 3.1.0

附上查询版本对应关系链接:Tomcat与Servlet版本对应链接 

 (1)  去中央仓库上找到servlet 的驱动包。(中央仓库地址)

 (2)  选择3.1版本

 (3)  导入依赖

 将上述红框内容复制粘贴到pom.xml中

图中的红色部分表示暂时还未下载安装,刷新一下IDEA就会自动调用maven,从中央仓库下载该jar包,首次下载可能时间较长,大家需要耐心等待。 


3. 创建目录结构

虽然Maven帮我们创建了一些目录,但是还是不够,不足以支撑我们写一个servlet项目,所以还需要我们手动再创建一些目录和文件出来。

①在src/main的路径下创建一个webapp目录,注意此处是单数。        

 ②再在webapp目录下创建一个子目录WEB-INF 

 ③在 WEB-INF 目录下创建一个文件web.xml

 并在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>

此处web.xml文件中报错不要紧张,idea对非java代码的识别并不准确,不影响代码运行

4. 编写servlet代码

编写代码是在java中创建类实现的。

①各方面注意事项:

在网络程序中,就涉及到一对相当重要的概念:
请求:request
响应:response

 doGet方法要做的工作,就是根据请求,计算生成响应。

②一个服务器的工作流程,可以分为三个典型的步骤:
(1)接收请求并解析
(2)根据请求计算响应
(3)构造响应数据,并返回给客户端

这里面,(1)(3)这两步,Tomcat已经帮我们做好了。因此我们只需要实现(2),也就是doGet要实现的内容。

举个通俗的例子:

我去一个饭店点餐,我点了一份蛋炒饭,那在商家接到我的单之后,就会给后厨,其中一个人会去装一碗饭,同时,另一个打鸡蛋,另一个人开始准备炒,这三个行为可以看做三个线程的并发操作,最后炒好了,商家又端给我。这三个人的工作就相当于在请求计算响应的过程。

③对下面的解释

@WebServlet("/hello")

在类上方加上@WebServlet("/hello")注解,表示Tomcat收到的请求中,路径为/hello的请求才会调用HelloServlet这个类的代码

④综合代码如下:

  • 创建一个类HelloServlet,继承HttpServlet
  • 在类上方加上@WebServlet("/hello")注解,表示Tomcat收到的请求中,路径为/hello的请求才会调用HelloServlet这个类的代码
  • 重写doGet方法,doGet方法的参数有两个,分别表示收到的HTTP请求和要构造的HTTP响应,这个方法会在Tomcat收到GET请求时触发
  • HttpServletRequest表示HTTP请求,Tomcat按照HTTP请求的格式,把字符串格式的请求转化成了一个HttpServletRequest对象,后续想获得请求中的信息(方法,url,header,body等)都是通过这个对象来获取的
  • HttpServletResponse表示HTTP响应,在代码中把响应构造好(构造响应的状态码,header,body等)
  • resp.getWriter()是获取响应对象的输出流,通过输出流可以写入一些数据,写入的数据被构造一个HTTP响应的body部分,Tomcat会把整个响应转化为字符串,通过Socket写回给浏览器
    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 {
            //这是在服务器的控制台中,打印了字符串(服务器能看到,但是客户端看不到)
            System.out.println("hello world");
            //这是给resp(HTTP响应)的body中写入字符串hello world,这个内容就会被HTTP响应发回给浏览器,显示到浏览器页面上
            //这里为了表示Tomcat的页面所呈现的是动态的,不是静态的html,所以用了System.currentTimeMillis()来展示
            resp.getWriter().write("hello world "+System.currentTimeMillis());
        }
    }
    

5. 打包

我们仔细观察,可以发现上面我们写的代码,是没有main方法的,也就是不能够运行,因此我们需要把当前的代码打包,然后部署到Tomcat中,再通过Tomcat来进行调用。

①找到打包所在位置:

②进行相关准备操作:修改pom.xml

jar和war都是java发布程序的压缩包格式。war算是给Tomcat专门搞的,这里不光会包含一些.class,还可以包含配置文件,以及依赖的第三方jar,还有html,css,js......

 ③判断打包完成:

 并且我们可以在目录这边看到

6. 部署

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

 然后打开Tomcat 服务器

 服务器启动后挂在后台不要关闭,否则开启失败

7. 验证程序

直接输入对应的网址向服务器发送请求,检查服务器能否响应并返回浏览器页面

 注意!!!每当我们刷新页面时,就会得到不同的数值,这是因为通过java代码生成的内容是可变的,而HTML中的内容是静态的,是不可变的。

3.利用smart Tomcat 插件一键完成打包部署

对于上述的七大步骤,我们会发现,每次修改代码的时候,都需要重新打包,部署。这个样子是相当麻烦的,所以我们尝试通过IDEA上的插件,直接把Tomcat给集成进来了,从而做到“一键式”完成打包部署。但是我们需要哦注意的是!!!Tomcat和IDEA是两个独立的程序,Tomcat并不是IDEA的一部分,不要搞混。 

3.1 安装smart Tomcat

①安装:

②配置:(只有第一次需要进行配置,后续不需要) 

 配置完成点击ok即可

 3.2 如何进行一键操作

配置完成点击下方按钮即可一键自动打包部署

看到以下内容说明打包部署成功

 在浏览器输入对应的网址向服务器发送请求,检查服务器能否响应并返回浏览器页面

3.3  smart Tomcat的适用场景

  • smart tomcat的运行方式和之前拷贝到webapps中,是存在本质区别的.
  • smart tomcat其实是使用了Tomcat另外一种运行方式.在运行Tomcat的时候,通过特定的参数,来指定Tomcat加载某个特定目录中的webapp

因此,上述过程,既不会打包,也不会拷贝~~(你打开 tomcat的 webapps看到里面没啥变化) 

这种方式只适用开发和调试阶段~~如果是部署到生产环境,还是得打war包,然后拷贝

4. 七大步骤总结

  后续针对代码进行了任何修改, 都需要重新进行 5 - 7 的步骤.

1-3 步,创建一个项目, 只要操作一次就好了 , 而 4 - 5 步, 每修改一次代码,都需要重复操作一次, 此处的 4 和 7 是省不了的, 可以针对 5,6 进行简化操作, 就是用 IDEA 的插件 smart tomcat.

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

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

相关文章

微软 LoRA| 使用万分之一的参数微调你的GPT3模型

一、概述 title&#xff1a;LORA: LOW-RANK ADAPTATION OF LARGE LAN- GUAGE MODELS 论文地址&#xff1a;https://arxiv.org/abs/2106.09685 代码&#xff1a;GitHub - microsoft/LoRA: Code for loralib, an implementation of "LoRA: Low-Rank Adaptation of Large …

课时6—死锁(二)

一、死锁的避免 避免死锁同样属于事先预防策略&#xff0c;是在资源动态分配过程中&#xff0c;防止系统进入不安全状态&#xff0c;以避免发生死锁。 1、系统安全状态 在避免死锁方法中&#xff0c;把系统的状态分为安全状态和不安全状态。当系统处于安全状态时可避免发生死…

Android UI开发之多样式富文本的简洁实现

多样式富文本的简洁实现 原文链接&#xff1a;Android UI开发之多样式富文本的简洁实现 AppendableStyleString 允许你快速构建多种样式文字。 特性 支持对于同一个字符串设置多种样式。支持文字和图片。提供默认样式。采用 DSL 确保更清晰的样式作用范围 快速开始 下面的…

【事务失效】十种常见场景

前提 大多数Spring Boot项目只需要在方法上标记Transactional注解&#xff0c;即可一键开启方法的事务性配置。 但是&#xff0c;事务如果没有被正确出&#xff0c;很有可能会导致事务的失效&#xff0c;避免因为事务处理不当导致业务逻辑产生大量偶发性BUG 事务的传播类型 …

JDK8-17的特性发生了哪些变化

JDK8-17的特性发生了哪些变化 垃圾回收器Java交互式编程接口定义扩展String底层结构变更of 创建不可变序列HTTP 2 协议接口引入 var 关键字字符串增强lambda 表达式类型推导switch 增强支持文本块定义instanceof 模式匹配引入record 关键字新增密封类的定义switch二度加强模块…

栈及其实现

目录 一&#xff1a;栈 1.栈的概念和结构 2.栈的实现 <1>.初始化栈 <2>.入栈 <3>.出栈 <4>:获取栈顶元素 <5>.获取栈中有效元素个数 <6>.销毁栈 <7>.示例 二&#xff1a;栈的完整代码 一&#xff1a;栈 1.栈的概念和结构 …

Origin中log2的计算,设置以2为底的log坐标

使用高中的换底公式即可&#xff0c;把2的底换成10的底计算 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5747fdbd2b5c43f095d716092fd17124.png

模式介绍和基本管理

模式介绍&#xff1a; 用户的模式(SCHEMA&#xff09;指的是用户账号拥有的对象集&#xff0c;在概念上可将其看作是包含表、 视图、索引和权限定义的对象。在 DM 中&#xff0c;一个用户可以创建多个模式&#xff0c;一个模式中的对象 &#xff08;表、视图等&#xff09;可以…

【深度学习】- 作业2: MNIST手写数字识别

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

stata软件基本操作

一、stata软件介绍 Stata是一个用于分析和管理数据的功能强大又小巧玲珑的实用统计分析软件&#xff0c;由美国计算机资源中心&#xff08;Computer Resource Center&#xff09;研制。它同时具有数据管理软件、统计分析软件、绘图软件、矩阵计算软件和程序语言的特点&#xf…

二叉树的相关知识

1.树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#…

Typora Mac版本安装 Pandoc 导出文件为word格式(windows可通用)

今天在和一位商务小伙伴对接的时候&#xff0c;需要提供一份 word 版本的初稿。对于习惯了使用 支持 markdown 语法的 typora 来说&#xff0c;复制粘贴到 word 是不可能的。 可以通过 “导出” 功能&#xff0c;选择将当前文件导出为 “word” 格式&#xff0c;这个过程有个小…

通过CSS实现炫酷效果,让你的网页不再平淡无奇

通过CSS实现炫酷效果&#xff0c;让你的网页不再平淡无奇 (一)CSS基础1.1CSS介绍1.2CSS样式1.3CSS 格式 &#xff08;二&#xff09;CSS 选择器2.1标签选择器2.2类选择器2.3层级选择器2.4id选择器2.5组选择器2.6伪类选择器2.7通配符选择器 &#xff08;三&#xff09;样式表引入…

【自然语言处理】 - 作业3: 文本情感分析

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

C++的继承

继承 1.继承的概念及定义1.1继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元6. 继承与静态成员7.复杂的菱形继承及菱形虚拟继承 1.继承的概念及…

舒适交友 - 什么样的婚姻最舒服 稳态婚姻

人人都是心理学家,mbti等_个人渣记录仅为自己搜索用的博客-CSDN博客 人生两大目标: 生产力提升 让身边的人快乐. 激动 兴奋 不一定 舒适 开心 幸福 安全感 平静 宁静 祥和 婚姻 稳态 041 探秘“情绪”——如何确定只有六种基本情绪&#xff1f; - 知乎 ( 6种原始情绪&am…

chatgpt赋能Python-python_dilate

Python中的dilate操作&#xff1a;了解该操作及其应用 在计算机视觉领域&#xff0c;dilate操作是一种常用的图像处理技术。在Python中&#xff0c;我们可以使用OpenCV库来实现dilate操作。本文将介绍dilate操作的基本概念&#xff0c;讨论其应用及如何使用Python进行实现。 …

C++爱好者的自我修养(13.1):一维数组——简介,声明,初始化(赋值)

文章目录 1.什么是数组&#xff1f;2.数组的声明2.1格式2.2特别注意&#xff1a;有效下标值的重要性 3.数组的初始化&#xff08;赋值&#xff09;3.1格式3.2 C11新增的初始化方法规则功能3.2.1 等号的省略3.2.2 当大括号内无东西3.2.3 禁止缩窄转换 1.什么是数组&#xff1f; …

Kafka实时数据同步

目录 1 概述 2 捕获Oracle数据到Kafka 2.1 数据捕获设置 2.2 数据发布任务设置 2.3 捕获到发布数据流映射 2.4 查看任务执行日志 3 订阅Kafka数据到ClickHouse 3.1 数据订阅设置 3.2 数据加载设置 3.3 订阅到加载数据流映射 3.4 查看任务执行日志 4 校验数据一致性 …

GEE:GEDI数据提取值到矢量区域和点

作者:CSDN @ _养乐多_ 本文将介绍GEDI数据集从GEE上下载到本地,并将每一个激光点的值提取为一个矢量区域,并提取值到矢量区域的方法。 文章目录 一、GEDI数据下载二、GEDI数据栅格矢量化三、提取值到区域四、提取栅格值到点五、空间插值一、GEDI数据下载 GEDI数据下载链接:…