Tomcat、Maven以及Servlet的基本使用

  • 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(专业版忽略)。
在这里插入图片描述

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


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android性能优化(bin启动优化)

我们平时会在android里面写个bin程序来干点活&#xff0c;但是有时候我们会发现很奇怪的现象&#xff0c;我明明很早就启动这个bin了&#xff0c;但是过了很久bin程序的main函数才被调用~。这个是为啥呢&#xff1f;主要有2个原因&#xff1a; 一.bin程序依赖的so库太多&#…

Python:使用prometheus-client提交数据到实现prometheus+ grafana数据监控

相关资料 prometheus文档&#xff1a;https://prometheus.io/grafana文档&#xff1a;https://grafana.com/grafana github: https://github.com/grafana/grafanaPyhton客户端https://pypi.org/project/prometheus-client/ 目录 1、使用Python提供数据源2、启动 prometheus3、…

zabbix 监控 windows 系统、java应用、SNMP

Zabbix 监控 Windows 系统 1、下载 Windows 客户端 Zabbix agent 2 2、安装客户端&#xff0c;配置 3.在服务端 Web 页面添加主机&#xff0c;关联模板 Zabbix 监控 java 应用 1、客户端开启 java jmxremote 远程监控功能 1.1配置 java jmxremote 远程监控功能 1.2启动…

左神算法之中级提升(2)

目录 [案例1】 【题目描述】 【思路解析1】 【思路解析2】 【代码实现】 【案例2】 【题目描述】 【思路解析】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【代码实现】 【案例4】 【题目描述】今日头条2018面试题 第四题 【输入描述】 【思路解析】 【…

pytorch学习第一篇:conda配置jupyter notebooks pytorch

安装jupyter notebooks 创建一个pytorch的环境 conda create -n pytorch python3.10 conda activate pytorch安装jupyter notebook&#xff0c;运行命令 conda install jupyter notebook启动jupyter 运行命令 jupyter notebook或者 notebook查看pyhton版本 import sys p…

C++ 环境设置

不好意思&#xff0c;最近有点事&#xff0c;没更新。 C 环境设置 本地环境设置 如果您想要设置 C 语言环境&#xff0c;您需要确保电脑上有以下两款可用的软件&#xff0c;文本编辑器和 C 编译器。 文本编辑器 这将用于输入您的程序。文本编辑器包括 Windows Notepad、O…

QT - 20230710

练习&#xff1a;实现一个简易闹钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDateTime> #include <QDebug> #include <QTextToSpeech>namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpubl…

【数据挖掘】时间序列教程【十】

5.4 通用卡尔曼滤波 上一节中描述的状态空间模型作为观测方程的更一般的公式 和状态方程 这里是一个p1 向量

win系统电脑在线打开sketch文件的方法

自Sketch诞生以来&#xff0c;只有Mac版本。Windows计算机如何在线打开Sketch文件&#xff1f; 即时设计已经解决了你遇到的大部分问题&#xff0c;不占用内存也是免费的。 您可以使用此软件直接在线打开Sketch文件&#xff0c;完整预览并导出CSS、SVG、PNG等&#xff0c;还具…

pycharm的一些常用设置

pycharm的一些常用设置 1、最新安装pycharm ,怎么设置解释器如图&#xff1a; 2、可通过鼠标放大缩小配置&#xff1a; 进入setting>Editor>File and Code Templates&#xff0c;点击python script&#xff0c;进行设置&#xff1a; """Author : A Tim…

探索图像处理的利器——OpenCV

目录 引言&#xff1a; 一、OpenCV简介&#xff1a; 二、OpenCV的特点&#xff1a; 三、OpenCV的应用领域&#xff1a; 四、实际案例&#xff1a; 结论&#xff1a; 引言&#xff1a; 在当今信息化的时代&#xff0c;图像处理已经成为了日常生活中不可或缺的一部分。从社…

【开源与项目实战:开源实战】84 | 开源实战四(上):剖析Spring框架中蕴含的经典设计思想或原则

在 Java 世界里&#xff0c;Spring 框架已经几乎成为项目开发的必备框架。作为如此优秀和受欢迎的开源项目&#xff0c;它是我们源码阅读的首选材料之一&#xff0c;不管是设计思想&#xff0c;还是代码实现&#xff0c;都有很多值得我们学习的地方。接下来&#xff0c;我们就详…

Matlab使用S函数

什么是S函数&#xff1f; S-函数是系统函数&#xff08;System Function&#xff09;的简称&#xff0c;在 Simulink 中用非图形化的方式来描述一个模块。一个完整的S-函数结构体系包含了描述一个动态系统所需要的全部能力。使用S-函数用户可以向 Simulink 模型中添加自己的模块…

rust 自动化测试、迭代器与闭包、智能指针、无畏并发

编写测试可以让我们的代码在后续迭代过程中不出现功能性缺陷问题&#xff1b;理解迭代器、闭包的函数式编程特性&#xff1b;Box<T>智能指针在堆上存储数据&#xff0c;Rc<T>智能指针开启多所有权模式等&#xff1b;理解并发&#xff0c;如何安全的使用线程&#x…

Mac矢量绘图工具 Sketch

Sketch是一款适用于 UI/UX 设计、网页设计、图标制作等领域的矢量绘图软件&#xff0c; 其主要特点如下&#xff1a; 1. 简单易用的界面设计&#xff1a;Sketch 的用户界面简洁明了&#xff0c;使得用户可以轻松上手操作&#xff0c;不需要复杂的学习过程。 2. 强大的矢量绘图功…

静态路由介绍

目录 静态路由配置方法&#xff08;基本配置&#xff09;&#xff1a; 静态路由的拓展配置 负载均衡 1.环回接口——测试 2.手工汇总——子网汇总 3.路由黑洞&#xff08;黑洞路由) 4.缺省路由 5.空接口——NULL 0 6.浮动静态路由 静态路由配置方法&#xff08;基本配置&#x…

基于matlab使用部分或较低分辨率图像快速处理阻塞图像(附源码)

一、前言 此示例展示了如何使用两种策略快速处理阻塞图像&#xff0c;这两种策略可以对高分辨率图像的较小代表性样本进行计算。 处理被阻止的图像可能非常耗时&#xff0c;这使得算法的迭代开发成本过高。有两种常见的方法可以缩短反馈周期&#xff1a;迭代较低分辨率的图像…

分布式服务高可用实现:复制

大家好&#xff0c;我是 方圆。本文的内容大多数来自于《数据密集型应用系统设计》&#xff0c;也夹杂着一些我个人对复制的理解&#xff0c;原文收录在我的 Github: enthusiasm 中&#xff0c;欢迎Star和获取原文。 1. 为什么需要复制 我们可以考虑如下问题&#xff1a; 当数…

安装Nodejs、NPM、Vue脚手架详细教程

一、安装Nodejs 查看自己电脑是否安装nodejs node --version我这里已经下载过了&#xff0c;没有下载过的会提示该命令不存在 可以到官网下载一下 https://nodejs.org/en/download/ 不要安装在中文路径下 二、安装NPM 如果你安装了nodejs–默认会安装NPM. npm --version…

运营规模突破5万台,绿色慧联启动「望岳计划」!

狙击冲锋问鼎&#xff01;7月7日&#xff0c;绿色慧联“望岳计划”在杭州正式启动。远程新能源商用车集团副总裁兼绿色慧联总经理杨东及运营平台各职能部门、区域运营中心负责人共同参加了会议。 今年绿色慧联正面临更加多变的内外部市场环境&#xff0c;电池原材料价格下滑和整…