Tomcat、Maven以及Servlet的基本使用

news2024/9/22 21:19:18

  • Tomcat
    • 什么是Tomcat
    • Tomcat的目录结构
    • 启动Tomcat
  • Maven
    • Maven依赖管理流程
    • 配置镜像源
  • Servlet
    • 主要工作
    • 实现Servlet
      • 添加依赖
      • 实现
      • 打包
      • 分析
    • 配置插件

Tomcat

什么是Tomcat

Tomcat 是一个 HTTP 服务器。前面我们已经学习了 HTTP 协议, 知道了 HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式。HTTP 服务器可以通过 Java Socket 来实现,而 Tomcat 就是基于 Java 实现的一个开源免费, 也是被广泛使用的 HTTP 服务器。

Tomcat的目录结构

在这里插入图片描述
其中最关注的目录就是 webapps 目录。web applications 的简称, 意思是用来存放 web 应用的文件夹。 "web 应用"就是一个具有独立完整功能的 “网站”, 我们就可以称为一个 “web 应用”。
例如搜狗搜索实现了独立完整的 “搜索引擎功能”, 淘宝网 实现了独立完整的 “电商功能” 。
一个 Tomcat 服务器上是可以同时部署多个这样的 web 应用的。这些 web 应用以目录的形式被放到 webapps 目录中。

启动Tomcat

在 bin 目录中, 双击 startup.bat 即可启动 Tomcat 服务器。然后在浏览器中输入 127.0.0.1:8080 即可看到 Tomcat 的默认欢迎页面。
在这里插入图片描述

Maven

什么是Maven?
Maven 是一个项目构建工具,创建的项目只要遵循 Maven 规范 (称为Maven项目),即可使用Maven 来进行: 管理 jar 包、编译项目,打包项目等功能。
为什么学习 Servlet 之前要学 Maven?
因为 Servlet 是框架,要使用 Maven 进行iar 包管理和项目打包和发布。

Maven依赖管理流程

在这里插入图片描述

配置镜像源

在配置Maven的settings文件时,主要是需要配置国内镜像源。
在这里插入图片描述

Servlet

Servlet 是 Tomcat 这个 HTTP 服务器提供给 Java 的一组 API, 来完成构建动态页面这个任务。

主要工作

1.建立连接:客户端和程序的连接(当用户输入了请求URL之后,程序能够感知到用户的请求);
2.获取用户请求参数:处理request对象
3.将服务器处理结果返回给客户端:返回response对象

实现Servlet

添加依赖

新建空项目之后,在pom.xml中添加Servlet依赖。

        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

其中,groupId表示组织Id,artifactId表示项目Id,version表示版本号,scope表示作用域。
作用域的类型:
compile: 默认作用域,在编译、运行、测试时均有效
provided: 在编译、测试时有效,但是在运行时无效。意味着打包的时候可以不用包进去,别的设施(WebContainer)会提供。
runtime: 在运行、测试时有效,但是在编译代码时无效。
test: 只在测试时有效,包括测试代码的编译,执行。例如: JUnit.
system: 在编译、测试时有效,但是在运行时无效。
这里的作用域是provided,也就是在运行时无效,此时用的是Tomcat内置的一套Servlet Api
blog.csdnimg.cn/df81764ea1174a64b049576c2f0cd708.png#pic_center)

实现

1.创建webapp目录。在 main 目录下, 和 java 目录并列, 创建一个 webapp 目录 (注意, 不是 webapps)
2.创建 web.xml。然后在 webapp 目录内部创建一个 WEB-INF 目录, 并创建一个 web.xml 文件。
在这里插入图片描述
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>

注意:webapp 目录就是未来部署到 Tomcat 中的一个重要的目录。当前我们可以往 webapp 中放一些静态资源, 比如 html , css 等。在这个目录中还有一个重要的文件 web.xml。Tomcat 找到这个文件才能正确处理 webapp 中的动态资源。

代码实现:

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取前端对象
        String name = req.getParameter("name");
        //将结果返回给前端
        resp.getWriter().println("name=" + name);
    }
}

• 创建一个类 HelloServlet , 继承自 HttpServlet
• 在这个类上方加上@WebServlet(“/hello”) 注解, 表示 Tomcat 收到的请求中, 路径为 /hello的请求才会调用HelloServlet 这个类的代码。(这个路径未包含 Context Path)
• 重写 doGet 方法。doGet 的参数有两个,分别表示收到的 HTTP 请求 和要构造的 HTTP 响应. 这个方法会在 Tomcat 收到 GET 请求时触发。
• HttpServletRequest 表示 HTTP 请求. Tomcat 按照 HTTP 请求的格式把 字符串 格式的请求转 成了一个HttpServletRequest 对象. 后续想获取请求中的信息(方法, url, header, body 等) 都是通过这个对象来获取。
• HttpServletResponse 表示 HTTP 响应。 代码中把响应对象构造好(构造响应的状态码,header, body 等)
• resp.getWriter() 会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器。

打包

将程序打包放在Tomcat中运行。
使用 maven 进行打包。 打开 maven 窗口 (一般在 IDEA 右侧就可以看到 Maven 窗口) ,然后展开 Lifecycle , 双击 package 即可进行打包,得到一个.jar后缀的包。
在这里插入图片描述
在这里插入图片描述

但此时这样的 jar 包并不是我们需要的, Tomcat 需要识别的是另外一种 war 包格式,而且这个包的名字太复杂。此时需要在pom.xml文件中在新增一个 packing 标签, 表示打包的方式是打一个 war 包。还可以再新增一个 build 标签, 内置一个 finalName 标签, 表示打出的 war 包的名字是ServletHelloWorld。

    <packaging>war</packaging>
    <build>
        <finalName>ServletHelloWorld</finalName>
    </build>

在这里插入图片描述

war 包和 jar 包的区别:
jar 包是普通的 java 程序打包的结果。 里面会包含一些 .class 文件。 war 包是 java web 的程序, 里面除了会包含 .class 文件之外, 还会包含 HTML, CSS, JavaScript, 图片,以及其他的 jar 包。打成 war 包格式才能被 Tomcat 识别。

将打包好的Servlet项目放在前面提到的Tomcat的webapps的根目录下才能正常运行。
在这里插入图片描述
此时双击Tomcat的bin目录下的statup.bat文件启动Tomcat,在浏览器中输入localhost:8080/ServletHelloWorld/hello,这样就简单实现了一个Servlet项目。注意,这里必须要输入完整的地址,ServletHelloWorld表示war包的名字,hello表示代码中的注解地址。

在这里插入图片描述

在这里可以发现,整个代码不是通过 main 方法作为入口了。main 方法已经被包含在 Tomcat 里, 我们写的代码会被Tomcat 在合适的时机调用起来。此时写的代码并不是一个完整的程序, 而是 Tomcat 这个程序的一小部分逻辑。
那随便写个类都能被 Tomcat 调用嘛? 满足啥样条件才能被调用呢?
主要满足三个条件:
a) 创建的类需要继承自 HttpServlet
b) 这个类需要使用 @WebServlet 注解关联上一个 HTTP 的路径
c) 这个类需要实现 doXXX 方法.
当这三个条件都满足之后, Tomcat 就可以找到这个类, 并且在合适的时机进行调用。

分析

通过开发者工具,可以看见通过浏览器访问的时候默认的是GET请求。
在这里插入图片描述
此时不能发送POST请求。我们使用postman发送POST请求来模拟接口。
Postman的使用:
在这里插入图片描述
当发送GET请求时:
在这里插入图片描述

而当发送post请求时,出现错误。
在这里插入图片描述
进而说明通过浏览器(URL)时默认GET请求。那如何让他支持post该怎么做呢?继续重写doPost方法。然后打包新程序,停止之前的Tomcat服务,将新程序的war包放到tomcat的webapps下,再启动tomcat服务

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取前端对象
        String name = req.getParameter("name");
        //将结果返回给前端
        resp.getWriter().println("name=" + name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //将请求转发到doGet方法中。
        this.doGet(req,resp);
    }
}

在这里插入图片描述

配置插件

上述整个流程中,每次更改程序之后都要重新打包,然后将其放在tomcat的目录下,非常不方便,我们需要一种方便的部署方式。可以通过下载smart Tomcat插件并重启IDEA(专业版忽略)。
在这里插入图片描述

设置好配置信息
在这里插入图片描述
将运行出的链接粘贴到浏览器并指定自己的注解即可。
在这里插入图片描述


继续加油~
在这里插入图片描述

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

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

相关文章

LinearAlgebraMIT_4_矩阵的LU分解

矩阵做逆变换需要要反过来&#xff0c;如下&#xff0c; 转置的逆等于逆的转置。 在知道了上面的基础知识后&#xff0c;我们进行矩阵的分解&#xff0c;常见如LU分解和LDU分解&#xff0c;如下&#xff0c; 在这里&#xff0c;我们首先具有一个矩阵A&#xff0c;我们对矩阵A进…

用html+javascript打造公文一键排版系统3:获取参数设置、公文标题排版

我们用自定义函数setDocFmt()来实现对公文的排版。 一、获取公文参数值 要对公文进行排版&#xff0c;首先要读取公文“参数设置”区中的参数值。比如公文要求对公文标题的一般规定是&#xff1a;一般用2号小标宋体字&#xff0c;居中显示。标题与正文中间空一行。 这些是“参…

Git---企业级开发模型

文章目录 前言拓展 一、系统开发环境二、Git分支设计规范master分支release分支develop分支feature分支hotfix分支 三、企业级项目管理实战准备工作创建项目创建仓库添加成员1. 添加企业成员2.添加项目成员3. 添加仓库开发⼈员 开发场景-基于git flow模型的实践新需求加入修复测…

Python之字典(dict)基础知识点

文章目录 一、创建字典1.1 基于dict函数创建1.2 基于{}创建1.3 基于空字典添加元素创建 二、访问字典三、修改字典四、删除字典五、字典的常用方法5.1 dict.items()方法5.2 dict.get()方法5.3 dict.setdefault()方法 参考资料 字典是python当中的一种数据类型&#xff0c;其结果…

Kafka入门,手动提交offset,同步提交,异步提交,指定 Offset 消费(二十三)

手动提交offset 虽然offset十分遍历&#xff0c;但是由于其是基于时间提交的&#xff0c;开发人员难以把握offset提交的实际。因此Kafka还提供了手动提交offset的API 手动提交offset的方法有两种&#xff1a;分别commitSync(同步提交)和commitAsync(异步提交)。两者的相同点是&…

conda创建环境等相关知识

1、首先下载Anaconda&#xff0c;官网下载即可&#xff0c;打开如下选项&#xff0c; 2、创建一个环境&#xff1a;命令如下 conda create -n 虚拟环境名称 python?实例&#xff1a;创建一个pytorch环境&#xff0c;指定python版本为3.9版本 conda create -n pytorch pytho…

【七天入门数据库】第一天 MySQL的安装部署

系列文章传送门&#xff1a; 【七天入门数据库】第一天 MySQL的安装部署 【七天入门数据库】第二天 数据库理论基础 【七天入门数据库】第三天 MySQL的库表操作 MySQL数据库存在多种版本&#xff0c;不同的版本在不同的平台上&#xff08;OS&#xff0c;也就是操作系统上&a…

文件资源管理器卡住,使用任务管理器结束任务后桌面图标和任务栏消失的解决方案

事情的起因是这样的&#xff0c;我想删除压缩包里的一张照片&#xff0c;结果文件资源管理器就卡住了&#xff0c;删除进度一直是0%&#xff0c;等了好久也没反应。没办法&#xff0c;只能掏出秘密武器任务管理器了&#xff0c;找到文件资源管理器&#xff0c;右键选择结束任务…

游戏渲染技术:前向渲染 vs 延迟渲染 vs Forward+渲染 (一)

在这篇文章中&#xff0c;会分析和对比三种渲染算法&#xff1a; 前向渲染(Forward Rendering)延迟着色(Deferred Shading)Forward(基于Tile的前后渲染) 介绍 前向渲染 前向渲染是通过在场景中光栅化每个几何对象来工作的&#xff0c;在着色过程中&#xff0c;通过迭代每个灯…

ModaHub魔搭社区:向量数据库Zilliz Cloud删除 Entity和删除 Collection教程

目录 删除单个 Entity 批量删除 Entity 开始前 操作步骤 使用限制 Entity 是指存储在 Zilliz Cloud 集群中的数据实体,包含用于处理、搜索和查询的数据。如果您不再需要某个 Entity,可以执行相关操作将其删除。 本文介绍如何从 Collection 中删除单个或多个 Entity。 …

RocketMQ5.0消息消费<三> _ 消息消费

RocketMQ5.0.0消息消费&#xff1c;三&#xff1e; _ 消息消费 一、消息消费 1. 消费UML图 PUSH模式消息拉取机制参考《RocketMQ5.0.0消息消费&#xff1c;一&#xff1e; _ PUSH模式的消息拉取​》&#xff0c;PullMessageService负责对消息队列进行消息拉取&#xff0c;从B…

Cocktail mac版-Cocktail 苹果版(清理维护优化工具)安装教程

Cocktail for Mac是一款Mac OS X系统清理、修复和优化的常规实用工具。它不仅可以一键清理系统中的残余垃圾。还可以帮助用户修改系统的隐藏属性、隐藏文件&#xff0c;对优化mac系统有很大的帮助。CocktailV11.4破解版增加了清除macOS内容缓存的功能。 内容缓存保留了各种Appl…

如何查看自己windows电脑的ip地址

可能有些小伙伴对查看自己电脑的ip地址不太熟悉&#xff0c;今天这里介绍几种方式&#xff1a; 我自己的电脑是Win11&#xff0c;就直接展示截图了。 一、命令行方式&#xff1a; windowsR打开 CMD(命令行窗口)或者windows PowerShell窗口&#xff0c;输入以下命令&#xff1…

企业信息化可以为企业带来什么效益?

一、什么是信息化 在具体谈信息化前我们先来谈一谈信息化和数字化 信息化&#xff1a;信息化是指培养、发展以计算机为主的智能化工具为代表的新生产力&#xff0c;并使之造福于社会的历史过程。与智能化工具相适应的生产力&#xff0c;称为信息化生产力。 数字化&#xff1a;…

MySQL基础篇第6章(多表查询)

文章目录 1、一个案例引发的多表连接1.1 案例说明1.2 笛卡儿积 2、多表查询分类讲解2.1 等值连接2.2 非等值连接2.3 自连接2.4 内连接2.5 外连接(OUTER JOIN)2.5.1 左外连接(LEFT OUTER JOIN)2.5.2 右外连接2.5.3 满外连接(FULL OUTER JOIN) 3、UNION的使用3.1 UNION操作符3.2 …

Linux 命令大全(下)

Linux 命令大全&#xff08;上&#xff09; 本文目录 6. 网络通讯 常用命令6.1 ssh 命令 – 安全的远程连接服务器6.1.1 含义6.1.2 语法格式6.1.3 常用参数6.1.4 参考示例 6.2 netstat 命令 – 显示网络状态6.2.1 含义6.2.2 语法格式6.2.3 常用参数6.2.4 参考示例 6.3 dhclient…

IP协议【图解TCP/IP(笔记九)】

文章目录 IP即网际协议IP相当于OSI参考模型的第3层网络层与数据链路层的关系 IP基础知识IP地址属于网络层地址路由控制■ 发送数据至最终目标地址■ 路由控制表 数据链路的抽象化IP属于面向无连接型 IP即网际协议 TCP/IP的心脏是互联网层。这一层主要由IP&#xff08;Internet…

【netty】TCP 粘包和拆包及解决方案

TCP 粘包和拆包基本介绍 TCP是面向连接的&#xff0c;面向流的&#xff0c;提供高可靠性服务。收发两端&#xff08;客户端和服务器端&#xff09;都要有一一成对的socket&#xff0c;因此&#xff0c;发送端为了将多个发给接收端的包&#xff0c;更有效的发给对方&#xff0c…

电商API接口商品页面数据(详情数据,销量数据,sku数据,视频数据,优惠券数据)接口代码示例

有探讨稳定采集电商等多平台整站实时商品详情历史价格数据接口&#xff0c;通过该接口开发者可以更好地了解商品的情况&#xff0c;商品详情数据详细信息查询&#xff0c;数据参数包括&#xff1a;商品链接&#xff0c;商品列表主图、价格、标题&#xff0c;sku&#xff0c;库存…

技术流 | 使用eBPF增强kubernetes可观测性的实践分享

本文作者&#xff1a;擎创科技某大拿 01 背景与问题 当前&#xff0c;云原生技术主要是以容器技术为基础围绕着 Kubernetes的标准化技术生态&#xff0c;通过标准可扩展的调度、网络、存储、容器运行时接口来提供基础设施&#xff0c;同时通过标准可扩展的声明式资源和控制器来…