如何部署项目到Tomcat + 第一个Servlet程序

news2024/10/6 8:25:58

  • 博主简介:想进大厂的打工人
  • 博主主页:@xyk:
  • 所属专栏: JavaEE初阶

目录

文章目录

一、Tomcat

1.1 Tomcat是什么

1.2 下载安装

1.3 部署项目

二、第一个Servlet程序

2.1 Servlet是什么

2.2 创建Maven项目

2.3 引入依赖

2.4 创建目录

2.5 编写类方法

2.6 打包代码

2.7 部署项目

2.8 验证程序

三、Smart Tomcat部署方式

四、Servlet程序中常见的问题

4.1 404

4.2 出现405

4.3 出现500

4.4 出现空白页面


一、Tomcat

1.1 Tomcat是什么

Tomcat 这个单词很容易让大家想到“汤姆猫”,大家可能会想到小时候看的动画片~~

事实上, Java 世界中的 "汤姆猫" 完全不是一回事, 但是同样大名鼎鼎

Tomcat 是一个 HTTP 服务器.在Java圈子中,最出名的 HTTP 服务器就是Tomcat,是apache社区开源的 http 服务器~~~

1.2 下载安装

下载官网:Apache Tomcat® - Apache Tomcat 8 Software Downloads

最新的版本不一定好用,我推荐下载 Tomcat8 版本的,因为大部分企业都在使用~~

点击即可~

 

 大版本是 8 系列即可,小版本由差别,无所谓~~

 目录结构:

  • 这就是一个绿色软件,连双击安装都不需要~

 bin 表示binary,里面包含了一下可执行的二进制脚本

启动成功是这个界面:乱码没关系的,不影响使用

 查看Tomcat的端口号是否绑定成功

打开命令行输入:

netstat -ano | findstr 8080
  • netstat -ano:获得所有端口情况
  • findstr 8080:找包含8080的字符串

两个的话,一个是ipv4,一个是ipv6,出现这样的界面就代表绑定成功了~~~

.bat后缀的为 Windows的批处理文件

.sh后缀的为 linux / mac 的shell脚本

如果启动失败怎么办?

最常见的启动失败原因是端口号被占用,Tomcat 启动的时候默认会绑定 8080 和 8005 端口,如果有其他进程已经绑定了这两个端口中的任意一个, 都会导致 Tomcat 不能启动.把对方进程干掉,再重新启动 Tomcat 一般就可以解决问题.

 conf 表示config,配置文件

  • 一个复杂的软件,通常会有配置,开启不同的功能~

 logs表示运行日志

webapps 放webapp,即放我们写的代码压缩包,一个Tomcat上可以同时部署多个网站

1.3 部署项目

  • 我们自己电脑内打开html当然简单,但是别人不行呀
  • 部署到Tomcat上面,别人也能访问才能我们的网站

我把我写过的项目拷贝到 webapps目录下面:

 再次启动Tomcat,就可以看见这个 war包 被自动解压缩了,然后我们进行访问

可以看到,我们访问成功了,证明我们已经成功部署到Tomcat服务器上面~~

但是由于 NAT机制,在外网的设备,还是不能访问我部署的项目,后续我会在云服务器上部署,外网就可以访问了~~

二、第一个Servlet程序

2.1 Servlet是什么

Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app.

Servlet 主要做的工作:

  1. 允许程序猿注册一个类, 在 Tomcat 收到某个特定的 HTTP 请求的时候, 执行这个类中的一些代码.
  2. 帮助程序猿解析 HTTP 请求, 把 HTTP 请求从一个字符串解析成一个 HttpRequest 对象.
  3. 帮助程序猿构造 HTTP 响应. 程序猿只要给指定的 HttpResponse 对象填写一些属性字段, Servlet就会自动的安装 HTTP 协议的方式构造出一个 HTTP 响应字符串, 并通过 Socket 写回给客户端.

简而言之, Servlet 是一组 Tomcat 提供的 API, 让程序猿自己写的代码能很好的和 Tomcat 配合起来, 从而更简单的实现一个 web app.
而不必关注 Socket, HTTP协议格式, 多线程并发等技术细节, 降低了 web app 的开发门槛, 提高了开发效率.
 

2.2 创建Maven项目

使用 IDEA 创建一个 Maven 项目

首次使用maven项目,会从互联网上加载很多依赖,所以要保持网络通畅!

2.3 引入依赖

在Maven中央仓库中搜索servlet

Maven中央仓库官方网站:Maven Repository: Search/Browse/Explore (mvnrepository.com)

 

点击3.1.0,选择3.1.0是跟我们的Servlet版本匹配的,不能乱选

复制下来,粘贴进pom.xml

    <dependencies>
        <!-- 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>
    </dependencies>

2.4 创建目录

要跟我一模一样哦!!!

这些目录中:

  1. src 表示源代码所在的目录
  2. main/java 表示源代码的根目录. 后续创建 .java 文件就放到这个目录中.
  3. main/resources 表示项目的一些资源文件所在的目录
  4. test/java 表示测试代码的根目录. 
     

我们要在main包下面,创建webapp包,webapp包下创建WEB-INF包,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>

2.5 编写类方法

在java包下创建HelloServlet

继承HttpServlet,并重写doGet方法,并在类上面写上注解@WebServlet(“....”)表示 Tomcat 收到的请求才会调用 HelloServlet 这个类的代码.

@WebServlet(),括号里面写的路径跟我们后续访问网页有很大关系,所以一定要记住!!!

@WebServlet("/hello")
public class helloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello world");

        resp.getWriter().write("hello world");
    }
}
  • doGet方法的工作就是,根据请求计算响应

而我们之前做的TCP回显服务器的基本流程就是:

  1. 读取请求并解析
  2. 根据请求计算响应
  3. 把响应写回客户端

但是Tomcat已经帮我们把1,3步都做好了,所以我们只需要做好第二步即可~~

为什么不用写main方法??

这是因为Tomcat内部帮我们实现了,它在合适的时机调用了我们重写的代码去计算响应~

伪码:

main {
    HttpServlet servlet = new HelloServlet();//触发重写
    
    HttpServletRequest req = ...;//获取请求的一系列操作
    HttpServletResponse resp = new HttpServletResponse();//空响应
    
    servlet.doGet(req, resp);//调用我们重写的方法,这个响应就被构造好了
}

如果我们不重写doGet方法,那么就会出现405错误:

我们随便写个类都能被 Tomcat 调用嘛? 满足啥样条件才能被调用呢?
主要满足三个条件:

  1. 创建的类需要继承自 HttpServlet
  2. 这个类需要使用 @WebServlet 注解关联上一个 HTTP 的路径
  3. 这个类需要实现 doXXX 方法

这三个条件都满足之后, Tomcat 就可以找到这个类, 并且在合适的时机进行调用

2.6 打包代码

我们的程序不能独立运行,必须部署(放置)到Tomcat上才能运行,而Tomcat服务器只认识 war包,只能解析 war包!!

  • 对于一个规模很大的项目,就会有很多很多的java文件和class文件,所以我们是需要将这些class文件打成一个压缩包,再进行拷贝,是比较科学的~
  • java中使用的压缩包,就是jar、war
  • jar:普通java程序,打成jar包
  • war:部署到Tomcat上的压缩包

我们要在pom.xml里面加下面代码才能打成war包:

    <packaging>war</packaging>
    <build>
        <finalName>hello_servlet</finalName>
    </build>

接下来打war包:

双击package,就会自动生成war包

 

 可见我们已经生成了war包~~~

2.7 部署项目

把 war 包拷贝到 Tomcat 的 webapps 目录下,启动 Tomcat , Tomcat 就会自动把 war 包解压缩.

看到这个日志说明 Tomcat 已经正确识别了 ServletHelloWorld 这个 webapp.

2.8 验证程序

此时通过浏览器访问 http://127.0.0.1:8080/ServletHelloWorld/hello
就可以看到结果了.

注意: URL 中的 PATH 分成两个部分, 其中 HelloServlet 为 Context Path, hello 为 Servlet Path

Context Path是war包名,Servlet Path 是我们之前在类上面写的路径

 

三、Smart Tomcat部署方式

 

  • 其他操作没办法简化,这也很好理解
  • 而5和6则需要点击package去打包,还有拷贝部署到对应目录,太麻烦了,不简化的话,每次调整代码,都要重新打包,重新拷贝部署替换原来的那个war包

我们只需要通过IDEA的插件(plugin)来完成这个工作(一键式完成5和6)

点击下载,我这里已经下载好了,不再下载~~

 

使用Smart Tomcat插件

首次使用比较麻烦,需要配置:

点击 + 号 

 

配置完之后,点击运行

这样就运行起来啦!!!

  • 那个地址就是提示你的路径是什么,localhost == 127.0.0.1 
  • 点了一定404,因为这个路径没有第二级目录:/hello(注解里的字符串)

我们加上hello之后,再次访问 

可见,访问成功了!!! 

Smart Tomcat的运行方式和之前拷贝到webapps是存在区别的~

smart tomcat其实是使用了tomcat的另外一种运行方式,在运行tomcat的时候,通过特定的参数,来指定tomcat加载某个特定目录中的webapp

因此,上述过程既不会打包,也不会拷贝!!!是开发和调试阶段,使用的方式,如果是部署到生产环境,还是得打war包!!!

四、Servlet程序中常见的问题

4.1 404

404 表示用户访问的资源不存在. 大概率是 URL 的路径写的不正确.

错误实例1: 少写了 Context Path
通过 /hello 访问服务器

错误实例2: 少写了 Servlet Path
通过 /ServletHelloWorld 访问服务器

错误实例3: Servlet Path 写的和 URL 不匹配
修改 @WebServlet 注解的路径

错误实例4: web.xml 写错了
清除 web.xml 中的内容

 

4.2 出现405

405 表示对应的 HTTP 请求方法没有实现

错误实例: 没有实现 doGet 方法

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
}

在浏览器地址栏直接输入 URL , 会发送一个 HTTP GET 请求.
此时就会根据 /ServletHelloWorld/hello 这个路径找到 HelloServlet 这个类. 并且尝试调用
HelloServlet 的 doGet 方法.

4.3 出现500

往往是 Servlet 代码中抛出异常导致的.

错误实例:修改代码

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String s = null;
resp.getWriter().write(s.length());
}
}

异常信息里已经提示了出现异常的代码是 HelloServlet.java 的第 13 行

resp.getWriter().write(s.length());

4.4 出现空白页面

错误实例:修改代码, 去掉 resp.getWritter().write() 操作

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("hello");
}
}

 抓包可以看到, 响应 body 中的内容就是 "空数据"

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

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

相关文章

进程(三)

进程三 2.11 进程同步、进程互斥2.11.1 进程同步2.11.2 进程互斥2.11.3 总结 2.12 进程互斥和软件实现方法2.12.1 单标志法2.12.2 双标志先检查法2.12.3 双标志后检查法2.12.4 Peterson 算法2.12.5 总结 2.13 进程互斥和硬件实现方法2.13.1 中断屏蔽方法2.13.2 TestAndSet 指令…

vue 阻止事件冒泡常用的方法

在 Vue 中&#xff0c;阻止事件冒泡有两种常用方法&#xff1a; 1. 使用 event.stopPropagation() 方法&#xff1a; 在事件处理函数中&#xff0c;可以通过调用事件对象的 stopPropagation() 方法来阻止事件冒泡。例如&#xff1a; html <template> <div click"…

ChatGPT研究框架(2023)

摘要 ChatGPT市场反应热烈&#xff0c;国内外巨头纷纷入场 据统计&#xff0c;ChatGPT日活跃用户数的增速远超Instagram&#xff0c;1月份平均每天有超过1300万名独立访问者使用ChatGPT&#xff0c;是去年12月份的 两倍多&#xff1b;国内外科技巨头都非常重视ChatGPT引发的科…

牛客网DAY2(编程题)

圣诞节来啦&#xff01;请用CSS给你的朋友们制作一颗圣诞树吧~这颗圣诞树描述起来是这样的&#xff1a; 1. "topbranch"是圣诞树的上枝叶&#xff0c;该上枝叶仅通过边框属性、左浮动、左外边距即可实现。边框的属性依次是&#xff1a;宽度为100px、是直线、颜色为gr…

房地产行业IT运维安全就用行云管家堡垒机!

对于房地产行业而言&#xff0c;安全TI运维是构建数字化企业的核心&#xff0c;是推动其业务发展的信息化支撑体系。所以一个靠谱的IT运维安全软件非常重要。不仅可以省时省力&#xff0c;还能保障网络安全&#xff01;这里我给推荐行云管家堡垒机&#xff01; 行云管家公司介…

枚举、反射

枚举 jdk1.5之前&#xff0c;需要自己实现枚举 自己实现枚举 public class StatusEnum {private final String id;private final String code;private final String name;private StatusEnum(String id, String code, String name){this.id id;this.code code;this.name …

使用预训练的 ImageNet 模型进行图像分类

在这篇文章中,我们将学习如何使用预训练的 ImageNet 模型来执行图像分类。我们已经看到了如何训练一个简单的神经网络来对 CIFAR-10 数据集中的图像进行分类,但这是一个相对简单的任务,因为只有十个类别。另一方面,对大量对象类型进行分类将需要包含数百万个参数的更大网络…

华为OD机试真题B卷 Java 实现【字符统计】,附详细解题思路

一、题目描述 输入一个只包含小写英文字母和数字的字符串&#xff0c;按照不同字符统计个数由多到少输出统计结果&#xff0c;如果统计的个数相同&#xff0c;则按照ASCII码由小到大排序输出。 数据范围&#xff1a;字符串长度满足 1≤len(str)≤1000 。 二、输入描述 一个…

图像算法工程师岗位的基本职责范围(合集)

图像算法工程师岗位的基本职责范围 图像算法工程师岗位的基本职责范围1 职责&#xff1a; 图像内容识别、图像纹理优化方面的算法基础研发; 三维模型内容识别、三维模型优化方面的算法研发; 遥感影像处理、内容理解方面的算法研发; 以上1,2,3方面的内容可选择某一项或者多项; 可…

CodeForces..翻转魔术.[简单].[找规律]

题目描述&#xff1a; 题目解读&#xff1a; 给定由0&#xff0c;1组成的长度为n的字符串&#xff0c;执行翻转操作&#xff0c;即0变1&#xff0c;1变0&#xff1b; 判断执行一次翻转之后是否为回文。 解题思路&#xff1a; 寻找规律&#xff1a;如果翻转前已经是回文&…

这里有一个源码调试方法,短小精悍,简单粗暴,但足够好用。

文章中有这样的一段描述&#xff1a; 然后有个读者来问我&#xff1a; 是怎么把 JDK 源码中的一行代码给注释掉的&#xff1f; 这个问题确实不错&#xff0c;属于一个偶尔用一下能起到奇效的源码调试技巧。所以我决定写个文章来说明一下这个问题。 但是这个技巧确实非常的简单…

VS输出路径和生成事件

在生成时&#xff0c;常常希望输出文件夹整洁&#xff0c;因此需要设置dll或exe输出位置&#xff0c;同时也希望对一些文件做一些特殊操作 VS的 UI 常用缩写 “./”&#xff1a;代表目前所在的目录。 " . ./"代表上一层目录。 “/”&#xff1a;代表根目录。 生成…

【图像分割】SAM:Segment Anything论文学习V1

论文:2304.Segment Anything 代码&#xff1a; https://github.com/facebookresearch/segment-anything 官网与demo&#xff1a;https://segment-anything.com/ 概要&#xff1a;SAM是什么&#xff1f; 是通用的分割模型 可以通过 模糊的点选择、文字输入、标注框对图片进行标…

Scala学习(十一)---集合高阶

文章目录 1.集合常用方法2.衍生集合3.集合的常用函数 1.集合常用方法 class Test_Func {} object Test_Func{def main(args: Array[String]): Unit {val list List(1, 2, 3, 4, 5)//定义一个List集合val set Set(6, 7, 8, 9)//定义一个Set集合//1.获取集合长度&#xff0c;…

Spring Boot如何与其他技术进行集成,如Spring Cloud、Spring Security、Spring Data等?

Spring Boot与其他技术集成 Spring Boot 是一个快速构建 Spring 应用程序的框架&#xff0c;它提供了自动配置和快速开发的特性&#xff0c;使得开发人员可以更加专注于业务逻辑的实现而不是搭建框架。Spring Boot 可以轻松集成其他 Spring 生态系统中的技术&#xff0c;例如 …

pnpm无法加载文件 (解决方法 )

例如&#xff1a;我现在要运行一个TS的项目&#xff0c;我的电脑上没有安装pnpm&#xff0c;导致我的vscode一直报错无法加载 Pnpm安装 npm install -g pnpm pnpm : 无法加载文件 pnpm : 无法加载文件 C:\Users\HP\AppData\Roaming\npm\pnpm.ps1&#xff0c;因为在此系统上禁…

微念“跌倒”,李子柒也吃不饱

文 | 螳螂观察 作者 | 青月 “共有从前&#xff0c;各有未来。” 杨幂官宣与嘉行传媒结束合作关系的微文&#xff0c;同样适用于现在的微念与李子柒。 李子柒与微念之间的这场MCN机构与网红IP之间由于利益分配的矛盾&#xff0c;经过500多天的博弈后&#xff0c;最终以李子柒…

2.6. Java内存管理与垃圾回收

2.6.1. Java内存模型 在Java中&#xff0c;内存被划分为以下几个区域&#xff1a; 堆&#xff08;Heap&#xff09;&#xff1a;存储对象实例和数组&#xff0c;是垃圾回收的主要区域。栈&#xff08;Stack&#xff09;&#xff1a;存储局部变量和方法调用。每个线程有自己的…

Python scapy二层、三层发送接收数据包

环境&#xff1a; Linux环境&#xff1a;安装scapy&#xff0c; 执行scapy 安装scapy yum install python3-pip (安装python3 pip) pip3 install --upgrade pip yum remove python-pip&#xff08;删除pip&#xff09; pip3 install scapy (安装scapy) 简介&#xff1a; …

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月29日论文合集)

文章目录 一、检测相关(12篇)1.1 Linear Object Detection in Document Images using Multiple Object Tracking1.2 Hybrid Energy Based Model in the Feature Space for Out-of-Distribution Detection1.3 BEV-IO: Enhancing Birds-Eye-View 3D Detection with Instance Occu…