当前位置: 首页 > news >正文

使用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程序

目录 前言&#xff1a; Maven 什么是Maven 创建Maven项目 Mevan目录介绍 Servlet程序 引入Servlet依赖 创建目录结构 编写代码 打包程序 部署程序 验证程序 idea集成Tomcat 下载Tomcat插件 配置Tomcat的路径 Smart Tomcat工作原理 小结&#xff1a; 前言&#…...

【MySQL】MySQL的优化(一)

目录 查看SQL执行频率 定位低效率执行SQL 定位低效率执行SQL-慢查询日志 定位低效率执行SQL-show processlist 查看SQL执行频率 MySQL 客户端连接成功后&#xff0c;通过 show [session|global] status 命令可以查看服务器状态信息。通 过查看状态信息可以查看对当…...

win kubernetes dashbord部署springboot服务

文章目录前言一、新建springboot工程二、制作镜像1.编写dockerfile2.使用阿里云镜像仓库3.使用dashbord部署服务总结前言 使用win版docker desktop安装的k8s&#xff0c;kubenetes dashbord。 一、新建springboot工程 就是简单一个接口。没什么说的 二、制作镜像 1.编写dock…...

Linux之进程终止

本节目录1.进程终止2.exit与_exit函数1.进程终止 进程终止时&#xff0c;操作系统做了什么&#xff1f; 释放进程中申请的相关内核数据结构和对应的数据和代码。本质就是释放系统资源。 进程终止的常见方式 a.代码跑完&#xff0c;结果正确 b.代码跑完&#xff0c;结果不正确…...

全网独家首发|极致版YOLOv7改进大提升(推荐)网络配置文件仅24层!更清晰更方便更快的改进YOLOv7网络模型

有不少小伙伴和我交流YOLO改进的时候&#xff0c;都说YOLOv7的网络配置文件长达104层&#xff0c;改起来很费力&#xff0c;数层数都要数很久&#xff0c;还很容易出错&#xff0c;而且基于YOLOv5代码架构&#xff0c;Debug起来也确实比较费时&#xff0c;所以博主对YOLOv7网络…...

C++入门 谁都能看懂的类和对象

类 C语言结构体中只能定义变量. 在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 //c语言 typedef struct ListNode {int val;struct ListNode* next; }LTN; //c struct ListNode {int val;//c中可以直接用这个&#xff0c;不用加structListNode* next…...

C++ STL:string类的模拟实现

目录 前置说明 一. 构造函数和析构函数的模拟实现 1.1 构造函数 1.2 析构函数 二. string类对象容量及成员相关的函数 2.1 获取字符串有效字符数、容量及_str成员变量获取相关函数 2.2 扩容及变长相关函数 2.3 字符串清空和判空函数 三. 运算符重载函数 3.1 赋值运算…...

并发编程---线程池(六)

阻塞队列的应⽤——线程池一 线程池基本概念二 线程池三种常⽤创建⽅式2.1.newFixedThreadPool线程池&#xff1a;2.2.newSingleThreadExecutor线程池&#xff1a;2.3.newCachedThreadPool线程池&#xff1a;2.4. 线程池代码演示三 线程池创建的七个参数四 线程池底层原理理解&…...

【Java实战】不会还有人用if else进行参数校验吧

当请求参数很多&#xff0c;几乎每一个参数都需要后端去兜底校验时&#xff0c;你还在写if else去判断参数是否为空吗&#xff1f;&#xff1f;要校验为空的参数三四个还好&#xff0c;要是十几个&#xff0c;业务逻辑还没开始就写二三十行代码开始堆山了嘛&#xff0c;教给大家…...

深度学习部署(十六): CUDA RunTime API _vector-add 使用cuda核函数实现向量加法

1. 知识点 nthreads的取值&#xff0c;不能大于block能取值的最大值。一般可以直接给512、256&#xff0c;性能就是比较不错的 (input_size block_size - 1) / block_size;是向上取整 对于一维数组时&#xff0c;采用只定义layout的x维度&#xff0c;若处理的是二维&#xff…...

堆结构的两个应用

堆排序 堆结构很大的一个用处&#xff0c;就是用于堆排序了&#xff0c;堆排序的时间复杂度是O(n∗log2n)O(n*log_2n)O(n∗log2​n)量级的&#xff0c;在众多排序算法中所处的地位也是高手级别的了。 但很多人在使用堆排序的时候&#xff0c;首先认为我必须得有一个堆数据结构…...

Java中的 static

1 static 静态变量 1.1 静态变量的使用 static变量也称作静态变量&#xff0c;也叫做类变量 静态变量被所有的对象所共享&#xff0c;在内存中只有一个副本 当且仅当在类初次加载时会被初始化 静态变量属于类 通过类名就可以直接调用静态变量 也可以通过对象名.静态变量…...

基于Vision Transformer的图像去雾算法研究与实现(附源码)

基于Vision Transformer的图像去雾算法研究与实现 0. 服务器性能简单监控 \LOG_USE_CPU_MEMORY\文件夹下的use_memory.py文件可以实时输出CPU使用率以及内存使用率&#xff0c;配合nvidia-smi监控GPU使用率 可以了解服务器性能是否足够&#xff1b;运行时在哪一步使用率突然…...

服务器相关常用的命令

cshell语法 https://www.doc88.com/p-4985161471426.html domainname命令 1&#xff09;查看当前系统域名 domainname2&#xff09;设置并查看当前系统域名 domainname example.com3&#xff09;显示主机ip地址 domainname -Iwhich命令 which 系统命令在 PATH 变量指定的…...

今天是国际数学日,既是爱因斯坦的生日又是霍金的忌日

目录 一、库函数计算 π 二、近似值计算 π 三、无穷级数计算 π 四、割圆术计算 π 五、蒙特卡罗法计算 π 六、计算800位精确值 从2020年开始&#xff0c;每年的3月14日又被定​为国际数学日​&#xff0c;是2019年11月26日​联合国教科文组织​第四十届大会上正式宣布…...

Qt Quick - StackLayout 堆布局

StackLayout 堆布局一、概述二、attached 属性三、例子1. 按钮切换 StackLayout 页面一、概述 StackLayout 其实就是说&#xff0c;在同一个时刻里面&#xff0c;只有一个页面是展示出来的&#xff0c;类似QStackWidget 的功能&#xff0c;主要就是切换界面的功能。这个类型我…...

C/C++网络编程笔记Socket

https://www.bilibili.com/video/BV11Z4y157RY/?vd_sourced0030c72c95e04a14c5614c1c0e6159b上面链接是B站的博主教程&#xff0c;源代码来自上面视频&#xff0c;侵删&#xff0c;这里只是做笔记&#xff0c;以供复习和分享。上一篇博客我记录了配置环境并且跑通了&#xff0…...

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…...

巨有科技:景区二消低迷?智慧旅游重构盈利模式

门票降价、客流增长但营收不涨&#xff0c;是当下多数景区面临的经营困境。过度依赖门票经济&#xff0c;二次消费&#xff08;二消&#xff09;占比低、业态单一&#xff0c;景区盈利空间不断被压缩。2026年文旅行业告别粗放增长&#xff0c;景区盈利重心向二次消费转移&#…...

超长上下文20万字!internlm2-chat-1.8b在Ollama中的高效部署与调用详解

超长上下文20万字&#xff01;internlm2-chat-1.8b在Ollama中的高效部署与调用详解 想体验一个能记住超长对话、处理20万字文档的AI助手吗&#xff1f;今天&#xff0c;我们就来聊聊如何在Ollama上快速部署和玩转InternLM2-Chat-1.8B这个“小身材、大能量”的模型。它不仅能进…...

Detectron2特征图热力可视化实战:从Faster R-CNN到自定义网络

1. 为什么需要特征图热力可视化 当你训练一个目标检测模型时&#xff0c;有没有遇到过这样的困惑&#xff1a;模型在某些场景下表现很好&#xff0c;但在另一些场景却频频出错&#xff1f;作为算法工程师&#xff0c;我们往往只能看到最终的检测结果&#xff0c;却不知道模型内…...

别再只用命令行!Pycharm内置Database工具连接SQLite3的5个高效技巧(含文件路径避坑)

别再只用命令行&#xff01;Pycharm内置Database工具连接SQLite3的5个高效技巧&#xff08;含文件路径避坑&#xff09; 作为一名长期与SQLite3打交道的Python开发者&#xff0c;你是否还在反复切换终端和代码编辑器&#xff0c;用命令行执行sqlite3 test.db&#xff1f;或是为…...

开源模型运维实践:雯雯的后宫Z-Image-瑜伽女孩Xinference日志监控与告警配置

开源模型运维实践&#xff1a;雯雯的后宫Z-Image-瑜伽女孩Xinference日志监控与告警配置 1. 引言&#xff1a;当你的AI画师“罢工”了怎么办&#xff1f; 想象一下这个场景&#xff1a;你刚部署好一个能生成精美瑜伽女孩图片的AI模型&#xff0c;兴致勃勃地准备创作。你输入了…...

OpenClaw文件管理术:GLM-4.7-Flash智能归类200+文档

OpenClaw文件管理术&#xff1a;GLM-4.7-Flash智能归类200文档 1. 为什么需要智能文件管理助手 作为一个长期与各种技术文档打交道的开发者&#xff0c;我的电脑桌面常年处于"灾难现场"状态。上周整理项目资料时&#xff0c;发现同一个技术方案的三个版本散落在下载…...

OpenClaw新手必看:nanobot镜像的20个实用命令合集

OpenClaw新手必看&#xff1a;nanobot镜像的20个实用命令合集 1. 初识nanobot镜像 第一次接触OpenClaw的nanobot镜像时&#xff0c;我被它的轻量化设计所吸引。这个基于vllm部署的Qwen3-4B-Instruct-2507模型镜像&#xff0c;不仅体积小巧&#xff0c;还集成了chainlit推理界…...

HTML表单回车键的隐藏陷阱:为什么你的input总在刷新页面?5种解决方案实测

HTML表单回车键的隐藏陷阱与实战解决方案 你是否曾在电商后台系统填写冗长的商品信息时&#xff0c;习惯性按下回车键换行&#xff0c;却发现整个页面突然刷新&#xff0c;刚刚输入的数据全部消失&#xff1f;这种令人抓狂的体验背后&#xff0c;隐藏着HTML表单设计中的一个经典…...

终极浏览器3D高斯点云编辑器:SuperSplat完整指南与5大核心优势

终极浏览器3D高斯点云编辑器&#xff1a;SuperSplat完整指南与5大核心优势 【免费下载链接】super-splat 3D Gaussian Splat Editor 项目地址: https://gitcode.com/gh_mirrors/su/super-splat 在3D视觉与点云处理领域&#xff0c;传统桌面软件的高门槛正被一款创新的We…...

Slurm集群升级记:为什么以及如何将PMIx从v3.x迁移到v4.x?

Slurm集群升级实战&#xff1a;PMIx v3.x到v4.x迁移的深度解析 引言&#xff1a;为什么HPC管理员需要关注PMIx升级&#xff1f; 在Slurm集群的日常运维中&#xff0c;组件升级往往被视为"必要之恶"——既期待新特性带来的性能提升&#xff0c;又担忧升级过程中的兼容…...