【Servlet】如何编写第一个Servlet程序

news2024/11/16 1:47:50

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【Servlet】
本专栏旨在分享学习Servlet的一点学习心得,欢迎大家在评论区交流讨论💌

Servlet是Java编写的服务器端程序,主要用于处理客户端请求和生成响应。它可以接收来自客户端(通常是Web浏览器)的请求,执行特定的任务,并返回响应给客户端。

目录

  • 一、创建项目
  • 二、引入依赖
  • 三、创建必要的目录和文件
  • 四、代码编写
  • 五、打包程序
  • 六、程序部署
  • 七、验证程序
    • 注意事项

重要的事情放前面:Servlet程序运行时,一定要保证Tomcat处于运行状态

一、创建项目

在这里插入图片描述

什么是Maven
Maven是Java中的一个构建工具。
一个程序在编写过程中往往会涉及到第三方库的依赖,同时需要对写好的程序进行一个打包部署。
Maven存在的意义就是为了能够方便的进行依赖管理打包部署
IntelliJ是Java中默认的构建工具,Gradle(安卓中会用到)同样是是Java中常见的构建工具。

在这里插入图片描述

我们来带看一下pom.xml文件
在这里插入图片描述
后续我们会根据需要会继续向pom.xml文件中放新的内容。
在这里插入图片描述

好了,以上就是创建项目的步骤,接下来我们来到下一步,即引入依赖。

二、引入依赖

当前的代码要使用Servlet开发,而Servlet并不是Java标准库自带的,所以我们需要Maven把Servlet的依赖获取到。所以我们需要找到Maven的中央仓库,然后从中央仓库中找到我们想要获取到的依赖。

中央仓库地址:https://mvnrepository.com/

来到中央仓库后,直接搜索servlet即可。
在这里插入图片描述
如上图,点击Java Servlet API后来到如下页面
在这里插入图片描述
找到3.1.0的版本,因为Tomcat和Servlet是有对应关系的:如果Tomcat使用8版本的话,那么Servlet就需要使用3.1版本。
在这里插入图片描述
在这里插入图片描述
此时IDEA就会自动的通过Maven从中央仓库下载到这里的依赖。
我们可以看到上面报红了,有可能还没有下载完(第一次使用一般会比较慢,因为要从中央仓库中下载很多的依赖),这种情况稍微等一下就好了。
但是如果等了很长时间都没有解决的话,我们就需要点击下面的刷新按钮:
在这里插入图片描述

好了,以上就是引入依赖的全过程。

三、创建必要的目录和文件

Tomcat对于Servlet项目是有一些额外的要求的。

Maven最为一个通用的工具,不仅仅可以管理Servlet项目,还可以管理其它的项目。再此基础上还需要按照Servlet项目的要求来创建出特定的目录和文件。

  • 在main目录下创建webapp目录
  • webapp目录中创建一个目录WEB-INF
  • WEB-INF目录中创建web.xml文件,web.xml文件的作用就是告诉Tomcat我这个目录中的内容是一个webapp,需要把我加载起来。

整个目录结构如下:
在这里插入图片描述
上述创建的目录结构(包括目录的名字)和文件都是固定的。

另外,我们需要在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的作用是指定了该 Web 应用程序的基本信息和配置参数,例如,控制应用程序如何处理请求、响应、会话管理等(具体细节我们这里暂时跳过)。

上述的配置文件可能会出现如下报错,请看:
在这里插入图片描述
爆红不是我们的原因,这里直接忽略即可(并不影响程序的运行)。
解释一下:爆红的部分即"http://java.sun.com/dtd/web-app_2_3.dtd"是一个schema文件,该文件描述了xml文件的格式是怎样的(哪些标签是合法的,哪些是不合法的,以及标签之间如何进行嵌套)。

好了,以上就是创建目录结构及文件的全部内容。接下来开始正式的代码编写。

四、代码编写

  • 第一步:创建类HelloServlet,然后让该类继承HttpServlet(此类是Servlet的jar包提供的,编写Servlet程序一般都需要继承这个类——HttpServlet),如下图:

在这里插入图片描述
如果HttpServlet报红的话,可能是之前的pom.xml中的依赖没有正确引入。这是我们只需要刷新一下pom.xml文件即可。
在这里插入图片描述
在这里插入图片描述

  • 第二步:重写父类HttpServlet中的方法(doGet方法

在这里插入图片描述
在解释doGet方法之前,我们先来回顾下服务器典型的三步走流程:
①读取请求并解析请求
②根据请求计算响应
③把响应写回到客户端

好了接下来解释doGet方法:
在这里插入图片描述

doGet方法要做的事情就是根据请求(req)计算出响应(resp),所以对应的doGet方法中的代码就是根据req请求中不同的参数细节从而生成一个具体的resp对象(即往空对象中设置属性)。

然后,Tomcat就会根据这个resp响应对象转换成符合HTTP协议的响应报文并返回给浏览器。

注解(配置路由):
在这里插入图片描述
我们已经知道Tomcat会在合适的时机自动调用doGet方法,体现在两个方面:
第一个方面:根据请求方法的不同来调用不同的方法。举例:如果请求方法是GET,那么Tomcat就会在合适的时机自动调用doGet;如果请求的方法是PUT,那么Tomcat就会在合适的时机自动调用doPost。
第二个方面:请求的路径中,url后面带有层次结构的路径。一个Servlet程序中可能有多个Servlet类,这些Servlet类需要在不同的情况下被执行到。比如当请求的路径中有hello的时候,才能执行到HelloServlet的代码。当然,不同的Servlet类可以关联到不同的路径
总结:Tomcat在合适的时机自动调用Servlet的方法,根据请求的方法类型和请求的路径进行匹配,以调用对应的Servlet方法来处理请求。这样可以实现不同Servlet类在不同情况下的执行(不同的代码应用到不同的场景)。

总而言之,doGet方法就是根据请求算出响应(即服务器典型三步走的第二步,第一步和第三步由Tomcat来完成)。

以上就是代码的编写,现在问题来了,为什么没有出现main方法。
解释:Servlet程序不需要main方法。上述写的代码并不是独立的程序,而是放到Tomcat上去执行的。而main方法在Tomcat,我们写的代码比如说doGet之类的方法都是让Tomcat来调用的

五、打包程序

这里写的程序是放到Tomcat上运行,所以需要对程序进行打包。
打包成一个Tomcat能识别的包的格式,此时代码才会被Tomcat给加载起来。
打包的过程是借助Maven来完成。

在这里插入图片描述

看到如下图就说明已经打包好了。在这里插入图片描述
在这里插入图片描述
在Maven中默认打包生成的是jar包(jar包是java中常用的打包方式,jar包中就是一些.class文件),但是Tomcat需要的并不是jar包,而是war包(war包本质上和jar包差不多,war包中会包含一些前端的代码,如html、css等,以及一些Tomcat的配置(web.xml))。
所以我们需要修改配置项来让Maven打包出来的是一个war包
pom.xml文件中插入<packaging>war</packaging>即可,如下图:
在这里插入图片描述

另外,除了在pom.xml中添加packaging标签外,我们还可以添加其它标签,如下:

<build>
    <finalName>java_servlet</finalName>
</build>

在这里插入图片描述
通过finalName标签可以设置打包出来的war包的名字(不是必须的,也可以使用默认的名字)。

好了,修改了上述的配置之后,接下来我们重新打包:
在这里插入图片描述
在这里插入图片描述
可以看到上图中target目录中新打成的war包。
在这里插入图片描述
这个war包就是我们想要向Tomcat中部署的内容。

至此,打包完成,我们就可以把war包放到Tomcat中了。

六、程序部署

程序部署就是把我们刚刚打包生成的war包放到Tomcat上,具体来说就是把这个war包拷贝到Tomcat中的webapps目录中。

在这里插入图片描述
把war包复制到Tomcat中的webapps目录后,Tomcat就会识别到有新的webapp到来了,然后就会自动对这个war包进行解压缩。

下面就到了最后一步——验证程序。

七、验证程序

通过浏览器发起http get请求,触发刚刚的servlet的代码。

在这里插入图片描述
第一点:通过第一级路径(称为context path/application path)来确认要访问哪个webapp(这个路径就是war包的名字);第二点:然后通过第二级路径(称为servlet path)来访问哪一个servlet代码;第三点:然后通过方法来确定执行servlet中哪个方法。

结合上面三点就定位到了要执行的代码时doGet方法

最后,程序成功执行。

在这里插入图片描述

注意事项

如果我们要对代码进行修改的话,我们需要重复上述的五、六、七步骤。

好了,以上就是本文的全部内容了。希望各位友友可以一键三连哈!!!

在这里插入图片描述

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

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

相关文章

STM32第一节——初识STM32

1 硬件介绍 1.1 硬件平台 配套硬件&#xff1a;以野火的STM32 F1霸道开发板为平台&#xff0c;若用的是别的开发板&#xff0c;可自己进行移植。 1.2 什么是STM32 STM32是由意法半导体&#xff08;STMicroelectronics&#xff09;公司推出的一系列32位的ARM Cortex-M微控制…

CMIP6数据驱动WRF和WRF-Chem模式、WRF-Chem的未来大气污染变化模拟

目录 一、CMIP6数据及运行平台建设 二、CMIP6数据驱动WRF和WRF-Chem模式 三、WRF-Chem的未来情景模拟 更多应用 对模式比较计划的全球气候预估数据进行动力降尺度&#xff0c;结合预估的未来气候变化&#xff0c;运用区域气候模式和气候-化学耦合模式&#xff0c;实现对未来…

【数据结构】数据结构初识

前言&#xff1a; 数据结构是计算存储&#xff0c;组织数据的方式。数据结构是指相互间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 Data Structure Vi…

day2 C++

封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <iostre…

笔记--写代码好习惯

原文&#xff1a;写代码有这16个好习惯&#xff0c;可以减少80%非业务的bug

uniapp vuecli项目融合[小记]:将多个项目融合,打包成一个小程序/App,拆分多个H5应用

前言&#xff1a; 目前两个uniapp vuecli开发的项目【A、B】&#xff0c;新规划的项目C&#xff1a;需要融合项目B 80%的功能模块&#xff0c;同时也需要涵盖项目A的所有功能模块。 应用需求&#xff1a; 1、新项目C【小程序】可支持切换到应用A/C界面【内部通过初始化、路由跳…

对于小微企业而言,数字化转型的重要性是什么?

数字化转型对于小微企业至关重要&#xff0c;原因如下&#xff1a; 1.效率和生产力&#xff1a;采用数字工具和技术可以简化业务流程、自动化重复性任务并提高整体效率。这使得小型企业能够用更少的资源完成更多的工作&#xff0c;最终提高生产力。 2.节省成本&#xff1a;数…

Gradle学习笔记:Gradle的简介、下载与安装

文章目录 一、什么是Gradle二、为什么选择Gradle三、下载并安装Gradle四、Gradle的bin目录添加到环境变量五、测试Gradle是否安装正常 一、什么是Gradle Gradle是一个开源构建自动化工具&#xff0c;专为大型项目设计。它基于DSL&#xff08;领域特定语言&#xff09;编写&…

江科大STM32 中

目录 6、TIM&#xff08;Timer&#xff09;定时器基本定时器通用定时器高级定时器示例程序&#xff08;定时器定时中断&定时器外部时钟&#xff09;TIM输出比较示例程序&#xff08;PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机&#xff09;TIM输入捕获示例程序&…

Qt 基于海康相机 的视频标绘

需求&#xff1a; 基于 视频 进行 标注&#xff0c;从而进行测量。 曾经搞在线教育时&#xff0c;尝试在视频上进行文字或者图形的绘制&#xff0c;但是发现利用Qt widget 传sdk 句柄的方式&#xff0c;只能使用窗口叠加的方式&#xff08;Qt 基于海康相机的视频绘图_海康相…

在 Linux 上搭建 Java 环境

目录 一、安装jdk 1. 挑选 jdk 版本 2. 安装 3. 验证 jdk 二、安装tomcat 1. 下载压缩包 2. 上传压缩包给 Linux &#xff08;需要用到 rz 命令&#xff09; 3. 解压压缩包&#xff08;需要用到 unzip&#xff09; 4. 进入 bin 目录 5. 给启动脚本增加可执行权限 6. 启…

CAN基础知识介绍

1.CAN的基本介绍 CAN&#xff08;Controller Area Network&#xff09;&#xff0c;是ISO国际标准化的串行通信协议。为了满足汽车产业的“减少线束的数量”、“通过多个LAN&#xff0c;进行大量数据的高速通信”的需求。 发展历史&#xff1a; 1986年&#xff0c;博世公司开…

JVM篇----第七篇

系列文章目录 文章目录 系列文章目录前言一、老年代二、永久代三、JAVA8 与元数据四、引用计数法五、可达性分析前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一…

postman自动化测试如何设置环境变量教程

在接口测试中&#xff0c;我们经常会用到一些通用请求参数&#xff0c;或者需要使用某个接口的返回参数作为另一个接口的请求参数&#xff0c;静态的参数还好&#xff0c;如果是经常变动的参数&#xff0c;那么操作起来&#xff0c;就特别的麻烦&#xff0c;这时候&#xff0c;…

pytorch代码实现注意力机制之SK Attention

SK注意力机制 简介&#xff1a;在标准卷积神经网络 &#xff08;CNN&#xff09; 中&#xff0c;每一层人工神经元的感受野被设计为共享相同的大小。在神经科学界众所周知&#xff0c;视觉皮层神经元的感受野大小受到刺激的调节&#xff0c;这在构建 CNN 时很少被考虑。我们在…

使用阿里云的oss对象存储服务实现图片上传(前端vue后端java详解)

一&#xff1a;前期准备&#xff1a; 1.1&#xff1a;注册阿里云账号&#xff0c;开启对象存储oss功能&#xff0c;创建一个bucket&#xff08;百度教程多的是&#xff0c;跟着创建一个就行&#xff0c;创建时注意存储类型是标准存储&#xff0c;读写权限是公共读&#xff09;…

深度学习(6)---Transformer

文章目录 一、介绍二、架构2.1 Multi-head Attention2.2 Encoder(编码器)2.3 Decoder(解码器) 三、Encoder和Decoder之间的传递四、Training五、其他介绍5.1 Copy Mechanism5.2 Beam Search 一、介绍 1. Transformer是一个Seq2Seq&#xff08;Sequence-to-Sequence&#xff09;…

redis + 拦截器 :防止数据重复提交

1.项目用到,不是核心 我们干系统开发,不免要考虑一个点&#xff0c;数据的重复提交。 我想我们之前如果要校验数据重复提交要求&#xff0c;会怎么干?会在业务层&#xff0c;对数据库操作&#xff0c;查询数据是否存在,存在就禁止插入数据; 但是吧,我们每次crud操作都会连接…

【史上最全之 ChatGPT 和文心一言对比】

ChatGPT 和文心一言哪个更好用&#xff1f; 在当今的AI助手领域中&#xff0c;ChatGPT与文心一言无疑是备受瞩目的两位选手。两者分别由美国OpenAI公司和中国百度研发&#xff0c;均致力于提供卓越的人工智能对话体验。接下来&#xff0c;我们将从智能回复、语言准确性以及知识…

SQL - 事务控制

SQL - 事务控制 文章目录 SQL - 事务控制TCL - 事务事务的边界事务的特性事务的应用 事务隔离等级MySQL支持四种隔离级别 TCL - 事务 **模拟场景&#xff1a;**生活当中转账是转账方账户扣钱&#xff0c;收账方账户加钱。用数据库操作来模拟现实转账。 数据库模拟&#xff1a…