当前位置: 首页 > 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…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...