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

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

GAN模式奔溃的探讨论文综述(一)

简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...

生产管理系统开发:专业软件开发公司的实践与思考

生产管理系统开发的关键点 在当前制造业智能化升级的转型背景下&#xff0c;生产管理系统开发正逐步成为企业优化生产流程的重要技术手段。不同行业、不同规模的企业在推进生产管理数字化转型过程中&#xff0c;面临的挑战存在显著差异。本文结合具体实践案例&#xff0c;分析…...

基于python大数据的水文数据分析可视化系统

博主介绍&#xff1a;高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实实在…...

FMC STM32H7 SDRAM

如何无痛使用片外SDRAM? stm32 已经成功初始化了 STM32H7 上的外部 SDRAM&#xff08;32MB&#xff09; 如何在开发中无痛使用SDRAM 使它像普通 RAM 一样“自然地”使用? [todo] 重要 MMT(Memory Management Tool) of STM32CubeMx The Memory Management Tool (MMT) disp…...