使用Maven实现第一个Servlet程序
目录
前言:
Maven
什么是Maven
创建Maven项目
Mevan目录介绍
Servlet程序
引入Servlet依赖
创建目录结构
编写代码
打包程序
部署程序
验证程序
idea集成Tomcat
下载Tomcat插件
配置Tomcat的路径
Smart Tomcat工作原理
小结:
前言:
第一个Servlet程序实现客户端发起请求,服务端返回hello world。使用Maven进行项目管理,引入依赖,打包程序,目录管理等一些操作。
Maven
什么是Maven
Maven是一个项目管理工具,能更好的帮助我们进行开发。它可以规范目录结构,管理依赖(使用第三方库),构建,打包项目,测试等等一些功能。
创建Maven项目

选中这里的Maven点击Create按钮就可以创建Maven管理的项目了。
如果第一次使用需要下载一些插件,由于默认服务器是国外的,下载的速度可能有点慢。如果实在太慢尝试更换下网络,或者使用国内镜像的阿里云服务器也可以。

当下载完成后,右侧就会出现一个Maven的按钮,点击之后就可以看到这个页面。有一些插件和Maven提供的项目管理程序。
Mevan目录介绍

Maven项目创建完成后,这些目录就会自动创建。main目录中放业务代码。java目录中放java代码。resources目录中放程序依赖文件。test目录下放测试代码。pom.xml文件是Maven项目总的配置文件。
Servlet程序
引入Servlet依赖
在Maven仓库中进行下载,之前使用的是Tomcat8这里对应的Servlet是3.1.0版本。
Maven Repository: Search/Browse/Explore (mvnrepository.com)

由于我们使用了Maven进行项目管理,它可以帮助我们下载依赖程序。

复制这段代码到pom.xml文件中。创建个dependencies标签,是project标签的子标签。将这段代码放入其中。

当这段代码复制到pom.xml文件中,Maven就会自动下载相应的依赖文件。也可能由于网络问题下载较慢,同样尝试换下网络。
创建目录结构

按照这样的位置创建这些目录和文件(名字也需要相同)。Maven在打包项目的时候就会寻找这些指定位置的目录结构。
我们写的第一个Servlet程序是没有main方法的,那么它是怎么跑起来的?
注意这里有和个web.xml,它就是声明了Tomcat服务器程序在运行时需要加载这个项目中的一些文件。这里就是使用了Tomcat为我们提供的接口Servlet,具体的执行由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>
编写代码
在java目录中编写代码。通常都需要继承HttpServlet这个类(Servlet为我们提供的)。
重写doGet方法。参数会有(HttpServletRequest req,HttpServletResponse resp)两个参数。Tomcat服务器接收到GET或者POST请求时就会调用这里对应的方法。
req:TCP读到请求时,Tomcat会根据这个请求构造req对象。
resp:这个为空对象(需要我们去构造)。doGet方法就是根据请求计算响应。
我们目的是打印hello world,这里就不用管req中的属性了,直接构造resp这个参数。我们往参数中的body属性写入字符串,当这个对象构造完成时,Tomcat会进行网卡写入。
写注解
@WebServlet("/hello")
注解就是针对一个类/方法,进行额外的解释说明,赋予额外的含义。
这里注解的含义就是为了把当前的类和路径关联起来。url中的路径,通过这个注解就可以确定服务器中具体的哪个类,就可以执行相应的代码。
// 把当前的类和HTTP请求的路径关联起来
// 根据url中的路径,通过这个注解,就可以确定调用服务器中的哪个类
// 路径和servlet是一一对应关系
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {// 这里的doGet方法不需要自己手动调用,交给tomcat调用、// tomcat收到get请求,就会触发doGet方法,tomcat会构造好两个参数req和resp// resp:空对象(输出型参数)// req:TCP Socket中读出来的字符串,按照HTTP协议解析,得到的对象// doGet做的工作就是根据请求构造响应@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//req:tomcat针对请求,已经解析构造好了//服务端控制台打印System.out.println("hello world");//构造resp对象,写回到客户端//写入resp中的body。当整个对象构造好,最终由tomcat写入网卡,发送至客户端resp.getWriter().write("hello world");}
}
打包程序
Maven默认打jar包。但是Tomcat中的webapp需要war包。jar包就是普通的java程序,war包是Tomcat部署webapp使用的压缩文件,可以包含一些前端代码。
修改pom.xml文件,指定需要打什么包,并且指定打包后的文件名。代码段为project标签的子标签。
<!-- 描述要打什么包 -->
<packaging>war</packaging>
<!-- 声明打包后的名字 -->
<build><finalName>hello_servlet</finalName>
</build>

点击右侧的Maven按钮,双击运行package程序,Maven就会帮助我们打包好文件。项目中会出现一个target目录,war包就在其中。

部署程序
将这个war包直接拷贝到Tomcat的webapps目录中即可。当服务器启动时就会自动解压缩。

验证程序
首先启动Tomcat服务器,然后浏览器中输入url:http://127.0.0.1:8080/hello_servlet/hello 。Tomcat端口默认为8080端口。
注意这里的两级路径。第一级是webapps目录下的war包文件名。第二级路径是我们之前写的注解。请求就会根据这两级路径找到服务器中具体的类。

idea集成Tomcat
下载Tomcat插件

搜索Tomcat,下载Smart Tomcat插件即可。下载完成后需要配置Tomcat的路径。idea专业版直接集成了Tomcat Server插件,不过没有这个好用。
配置Tomcat的路径

当下载好Smart Tomcat插件后,左侧就会出现Smart Tomcat按钮,点击配置即可。

配置完成后的效果。点击三角形即可运行Tomcat服务器。

当看见绿色框中的提示, Smart Tomcat就启动成功了,不过这个不能访问Tomcat的欢迎页面。
Smart Tomcat工作原理
Tomcat支持启动的时候显示指定一个特定的 webapp 目录。相当于是让Tomcat加载单个webapp运行。idea直接调用Tomcat,让Tomcat加载当前项目中的目录。这里没有打包的过程,也没有拷贝和解压缩的过程。
这两种部署,其实是两种Tomcat运行方式,对于context path的定位不同。如果是直接拷贝war包的方式部署,context path就是war包名。如果是Smart Tomcat方式部署,这里的context path是可以配置的,默认是项目名(前面配置Tomcat路径时,不用修改的部分就存在)。
小结:
这里的操作需要大量的动手实践。当出现错误,我们根据http响应的状态码来定位错误,并且修改bug。
相关文章:
使用Maven实现第一个Servlet程序
目录 前言: Maven 什么是Maven 创建Maven项目 Mevan目录介绍 Servlet程序 引入Servlet依赖 创建目录结构 编写代码 打包程序 部署程序 验证程序 idea集成Tomcat 下载Tomcat插件 配置Tomcat的路径 Smart Tomcat工作原理 小结: 前言&#…...
【MySQL】MySQL的优化(一)
目录 查看SQL执行频率 定位低效率执行SQL 定位低效率执行SQL-慢查询日志 定位低效率执行SQL-show processlist 查看SQL执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以查看服务器状态信息。通 过查看状态信息可以查看对当…...
win kubernetes dashbord部署springboot服务
文章目录前言一、新建springboot工程二、制作镜像1.编写dockerfile2.使用阿里云镜像仓库3.使用dashbord部署服务总结前言 使用win版docker desktop安装的k8s,kubenetes dashbord。 一、新建springboot工程 就是简单一个接口。没什么说的 二、制作镜像 1.编写dock…...
Linux之进程终止
本节目录1.进程终止2.exit与_exit函数1.进程终止 进程终止时,操作系统做了什么? 释放进程中申请的相关内核数据结构和对应的数据和代码。本质就是释放系统资源。 进程终止的常见方式 a.代码跑完,结果正确 b.代码跑完,结果不正确…...
全网独家首发|极致版YOLOv7改进大提升(推荐)网络配置文件仅24层!更清晰更方便更快的改进YOLOv7网络模型
有不少小伙伴和我交流YOLO改进的时候,都说YOLOv7的网络配置文件长达104层,改起来很费力,数层数都要数很久,还很容易出错,而且基于YOLOv5代码架构,Debug起来也确实比较费时,所以博主对YOLOv7网络…...
C++入门 谁都能看懂的类和对象
类 C语言结构体中只能定义变量. 在C中,结构体内不仅可以定义变量,也可以定义函数。 //c语言 typedef struct ListNode {int val;struct ListNode* next; }LTN; //c struct ListNode {int val;//c中可以直接用这个,不用加structListNode* next…...
C++ STL:string类的模拟实现
目录 前置说明 一. 构造函数和析构函数的模拟实现 1.1 构造函数 1.2 析构函数 二. string类对象容量及成员相关的函数 2.1 获取字符串有效字符数、容量及_str成员变量获取相关函数 2.2 扩容及变长相关函数 2.3 字符串清空和判空函数 三. 运算符重载函数 3.1 赋值运算…...
并发编程---线程池(六)
阻塞队列的应⽤——线程池一 线程池基本概念二 线程池三种常⽤创建⽅式2.1.newFixedThreadPool线程池:2.2.newSingleThreadExecutor线程池:2.3.newCachedThreadPool线程池:2.4. 线程池代码演示三 线程池创建的七个参数四 线程池底层原理理解&…...
【Java实战】不会还有人用if else进行参数校验吧
当请求参数很多,几乎每一个参数都需要后端去兜底校验时,你还在写if else去判断参数是否为空吗??要校验为空的参数三四个还好,要是十几个,业务逻辑还没开始就写二三十行代码开始堆山了嘛,教给大家…...
深度学习部署(十六): CUDA RunTime API _vector-add 使用cuda核函数实现向量加法
1. 知识点 nthreads的取值,不能大于block能取值的最大值。一般可以直接给512、256,性能就是比较不错的 (input_size block_size - 1) / block_size;是向上取整 对于一维数组时,采用只定义layout的x维度,若处理的是二维ÿ…...
堆结构的两个应用
堆排序 堆结构很大的一个用处,就是用于堆排序了,堆排序的时间复杂度是O(n∗log2n)O(n*log_2n)O(n∗log2n)量级的,在众多排序算法中所处的地位也是高手级别的了。 但很多人在使用堆排序的时候,首先认为我必须得有一个堆数据结构…...
Java中的 static
1 static 静态变量 1.1 静态变量的使用 static变量也称作静态变量,也叫做类变量 静态变量被所有的对象所共享,在内存中只有一个副本 当且仅当在类初次加载时会被初始化 静态变量属于类 通过类名就可以直接调用静态变量 也可以通过对象名.静态变量…...
基于Vision Transformer的图像去雾算法研究与实现(附源码)
基于Vision Transformer的图像去雾算法研究与实现 0. 服务器性能简单监控 \LOG_USE_CPU_MEMORY\文件夹下的use_memory.py文件可以实时输出CPU使用率以及内存使用率,配合nvidia-smi监控GPU使用率 可以了解服务器性能是否足够;运行时在哪一步使用率突然…...
服务器相关常用的命令
cshell语法 https://www.doc88.com/p-4985161471426.html domainname命令 1)查看当前系统域名 domainname2)设置并查看当前系统域名 domainname example.com3)显示主机ip地址 domainname -Iwhich命令 which 系统命令在 PATH 变量指定的…...
今天是国际数学日,既是爱因斯坦的生日又是霍金的忌日
目录 一、库函数计算 π 二、近似值计算 π 三、无穷级数计算 π 四、割圆术计算 π 五、蒙特卡罗法计算 π 六、计算800位精确值 从2020年开始,每年的3月14日又被定为国际数学日,是2019年11月26日联合国教科文组织第四十届大会上正式宣布…...
Qt Quick - StackLayout 堆布局
StackLayout 堆布局一、概述二、attached 属性三、例子1. 按钮切换 StackLayout 页面一、概述 StackLayout 其实就是说,在同一个时刻里面,只有一个页面是展示出来的,类似QStackWidget 的功能,主要就是切换界面的功能。这个类型我…...
C/C++网络编程笔记Socket
https://www.bilibili.com/video/BV11Z4y157RY/?vd_sourced0030c72c95e04a14c5614c1c0e6159b上面链接是B站的博主教程,源代码来自上面视频,侵删,这里只是做笔记,以供复习和分享。上一篇博客我记录了配置环境并且跑通了࿰…...
RK3568平台开发系列讲解(网络篇)什么是Socket套接字
🚀返回专栏总目录 文章目录 一、什么是socket ?二、socket 理解为电话机三、socket 的发展历史四、套接字地址格式4.1、通用套接字地址格式4.2、IPv4 套接字格式地址4.3、IPv6 套接字地址格式4.4、几种套接字地址格式比较沉淀、分享、成长,让自己和他人都能有所收获!😄 …...
2022年全国职业院校技能大赛(中职组)网络安全竞赛试题——渗透测试解析(详细)
渗透测试 任务环境说明: 服务器场景:Server9服务器场景操作系统:未知(关闭连接)系统用户名:administrator密码:123456通过本地PC中渗透测试平台Kali对靶机场景进行系统服务及版本扫描渗透测试,以xml格式向指定文件输出信息(使用工具Nmap),将以xml格式向指定文件输出…...
尚融宝03-mybatis-plus基本CRUD和常用注解
目录 一、通用Mapper 1、Create 2、Retrieve 3、Update 4、Delete 二、通用Service 1、创建Service接口 2、创建Service实现类 3、创建测试类 4、测试记录数 5、测试批量插入 三、自定义Mapper 1、接口方法定义 2、创建xml文件 3、测试条件查询 四、自定义Serv…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
