servlet开发-通过Tomcat部署一个简单的webapp

news2024/10/6 18:27:27

        首先我们得下载安装Tomcat,推荐看Tomcat(HTTP服务器)下载以及认识,

我们将通过打印一个hello word的方式来熟悉servlet开发,通过Tomcat部署一个webapp的流程

servlet的含义

        Tomcat提供了一系列的api接口,这些api背后已经把一些基础工作都做好了(比如像处理HTTP协议这样的重复性工作)

        Java程序员,只需要调用已经提供好的api,通过少量的代码,就可以完成基本http服务器的核心功能,Tomcat给这组 api 起了个名字,就是 servlet 

一.创建项目

        1.我们要在idea中创建一个JAVA项目

        要注意Build system要选择Maven


        Maven

        Maven是Java中一个常用的构建工具,一个程序在运行的过程中,往往需要涉及到一些第三方库的依赖,另外还需要针对这个写好的程序进行打包部署

        Maven存在的意义,就是为了更好的进行依赖管理和打包


        2.创建好项目以后我们将看到项目的目录位置

        

        main目录下要写的就是业务代码,resources文件夹放置的是一些依赖资源,test目录下放的是测试代码,pom.xml 这个文件是maven项目最主要的配置文件(maven主要用来管理依赖和打包)

        此时我们看到main目录下的java目录中,编译器以及给我们写好了一些代码,我们是不需要的,直接将 org.example 这个文件删除掉,删除以后就是这样

        3.删除好以后,我们在java目录下创建一个HelloWord类

二.引入依赖

        当前的代码要使用 servlet 开发,而 servlet 并不是Java标准库自带的,就需要让 maven 把servlet 的依赖给获取到

        要使用 servlet 中的 api 就需要引入依赖,我们要到中心仓库https://mvnrepository.com/中找到 servlet 的依赖

        进入中心仓库后,搜索 servlet 找到 java servlet api

        选择3.1.0版本,servlet 的版本和 tomcat 的版本是有对应关系的,tomcat 的版本使用8,servlet 就是3.1,如果不匹配就可能会出现问题

        复制Maven处的代码

        此时就需要引入依赖

        在pom.xml 文件(maven中最主要的配置文件)中创建一个dependencies标签(注意dependencies标签要创建在project标签内部),将复制的代码粘贴到标签中

三.创建目录

        创建目录的操作是固定的,不能有区别的,我们要按照 servlet 项目的要求,创建出一些特定的目录和文件

        要在main目录下创建一个webapp包,在其内部创建一个WEB-INF包,在其内部创建一个web.xml文件。

        web.xml 就是告诉 tomcat,我现在这个目录里的东西就是一个 webapp,就需要 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>

        将上述的代码粘贴到 web.xml 中,不要修改任何格式哦,要不然就会出现问题

四.编写代码

         此时我们终于可以编写代码了,要想打印一个 hello word 实际上要编写的代码没有多少,但有很多细节,当前提供纯代码以及带注释的代码

纯代码

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

        resp.getWriter().write("hello word");
    }
}

带注释的代码

//要在Servlet类上加这个注解
//这个注解,就把当前这个Servlet类,和一个请求的路径关联起来了(配置路由)
//Tomcat会在合适的时机,自动调用doGet
//合适的时机:
//1.HTTP请求的方法,是否是GET
//2.请求的路径(url后面带有层次结构的路径)是否符合参数的要求
//一个Servlet程序里,可能有多个Servlet类,这些Servlet类就需要在不同的情况下被执行到
//我们所加注解中的参数是"/hello",表示当前请求的路径中带有“hello”的时候,我们这个HelloServlet类的代码才会被执行
@WebServlet("/hello")
//在利用Servlet开发时通常都需要继承HttpServlet
//HttpServlet来源于导入到pom.xml中Servlet的依赖,依赖导入成功就能成功继承HttpServlet
//继承HttpServlet不是目的,目的是为了重写这个父类中的方法
public class HelloServlet extends HttpServlet {
    /**
     * HttpServletRequest类型的req代表这次请求的HTTP内容
     * HttpServletResponse类型的resp代表这次请求要返回的HTTP响应
     * */
    //doGet方法本质上是一个回调函数,不需要我们手动调用
    //我们将这个方法定义好以后,就会交给Tomcat
    //Tomcat在收到一个合适的Get请求以后就会自动调用doGet
    //调用doGet时,Tomcat就会自动解析这次的HTTP请求,生成一个空的HttpServletResponse对象resp(这个对象的属性都是和HTTP协议格式匹配的)
    //把空的对象(没有初始化)resp传给doGet
    //doGet要做的事情,就是根据传入的HTTP请求,计算出响应
    //doGet里的代码,就是根据req里不同参数的细节,生成一个具体的resp对象(往空对象中设置属性)
    //Tomcat就会根据resp响应对象,转换成符合HTTP协议的响应报文
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //这段代码是编译器自动添加的,一定要删除掉,要不然会出现问题
        //super.doGet(req, resp);

        //此时打印的 hello word 是打印到服务器日志中的
        System.out.println("hello word");

        //要想把 hello word 返回给客户端,还需要进一步使用下列代码
        //resp是未初始化过的空的响应对象,doGet的目的就是为了把这个对象给设置好
        //通过getWriter可以获得resp内置的输出流对象
        //使用write方法,就可以把一个字符串写到resp对象中(把数据写入到了HTTP响应的body中)
        //浏览器拿到HTTP响应后body的内容就可以显示到页面上了
        resp.getWriter().write("hello word");
    }
}
//此时代码就写完了,或许会有人疑惑,难道不需要有一个main方法吗?没有main方法程序怎么运行呢?
//Servlet程序是不需要main方法的,因为我们写的代码并不是独立的程序,而是放到Tomcat上执行的
//main方法其实是在tomcat里的,我们写的doGet等方法就是给tomcat调用的

五.对程序进行打包

        在maven中,默认打包生成的是 .jar 包(常用的 Java 打包方式,jar里面就是一些 .class文件)但是 tomcat 需要的并不是 jar 包而是 war 包(本质上和 jar 包差不多,这里会包含一些前端代码,以及一些tomcat的配置)

        我们就需要在 maven 主要的配置文件 pom.xml 中添加一些标签,要添加的标签如下:

  <packaging>war</packaging>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.0</version>

                <!--要在下面添加以下配置-->
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>

            </plugin>
        </plugins>
        <finalName>hello_servlet</finalName>
    </build>

packaging 标签代表要打包的类型,是 war 包

在build标签中的finalName标签代表打包好以后的 war 包的名称

        加好代码以后我们就找到 idea 右边的 maven 中的 package 选项,双击即可打包

        打包好以后,我们能看到目录中多出来了几个文件

六.部署,把打好的war包放到tomcat的webapps目录中

        对目录中打包好的 war 包,我们右键 选择Open in ,点击Explorer,找到 war 包所在的文件夹

        

        将 war 包复制到 tomcat 的webapps 目录下,然后运行 tomcat 

        此时我们就在 tomcat 上部署好了一个 webapp

七.验证

         通过浏览器去发送一个 http 请求给我们在 tomcat 上部署好了的 webapp,我们访问的 url 是127.0.0.1:8080/hello_servlet/hello url 的结构和我们编写代码时的命名是对应的

        127.0.0.1是回显IP,代表我们本机的IP地址

        8080是 tomcat 默认的端口号

        hello_servlet 是我们部署的 webapp 的名称,tomcat 上可能会部署多个 webapp 通过hello_servlet 这个路径可以准确找到我们要访问的 webapp

        /hello 和我们在代码中写的注解的参数相对应,因为一个 webapp 中可能会有多个 servlet 的类,通过注解中的参数,我们可以准确的找到我们要访问的 servlet 的类

        我们重写的是doGet 方法,这样要是HTTP请求是 Get 类型,就会调用 doGet 方法来处理HTTP请求

        输入 api 访问,我们就能得到如下的页面

        这就大功告成了!

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

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

相关文章

dfs力扣1993树上的操作

文章目录 dfs力扣1993树上的操作题目示例提示做题历程做题思路数组定义编写代码 完整代码 dfs力扣1993树上的操作 题目 题目链接 给你一棵 n 个节点的树&#xff0c;编号从 0 到 n - 1 &#xff0c;以父节点数组 parent 的形式给出&#xff0c;其中 parent[i] 是第 i 个节点…

Java多线程篇(5)——cas和atomic原子类

文章目录 CASAtomic 原子类一般原子类针对aba问题 —— AtomicStampedReference针对大量自旋问题 —— LongAdder CAS 原理大致如下&#xff1a; 在java的 Unsafe 类里封装了一些 cas 的api。以 compareAndSetInt 为例&#xff0c;来看看其底层实现。 可以发现&#xff0c;最…

基于abaqus的非等速生长Voronoi晶体模型生成插件

1. 非等速生长晶体模型简介 对于标准Voronoi而言&#xff0c;每个晶粒的生长速率是相同的&#xff0c;任意两个晶粒的交界线为其形核点连线的垂直平分线&#xff0c;交界线为一条直线&#xff0c;如图1.1所示。 图1.1 标准Voronoi晶粒交界线 而对于非等速生长Voronoi晶体而言…

项目篇——java文档搜索引擎

Java 文档搜索引擎 文章目录 Java 文档搜索引擎一、分词二、完成parser 类2.1、排除非html文件2.2、解析html以下是解析 HTML 标题的方法以下是解析 对应的 URL以下是解析 HTML的正文&#xff1a; 补充&#xff1a;倒序索引 三、实现 index 类3.1、实现索引结构3.2、索引中新增…

学会使用Git 和 GitHub

Git 和 GitHub 都是程序员每天都要用到的东西 —— 前者是目前最先进的 版本控制工具&#xff0c;拥有最多的用户&#xff0c;且管理着地球上最庞大的代码仓库&#xff1b;而后者是全球最大 同性交友 代码托管平台、开源社区。 在没有这两个工具时&#xff0c;编程可能是这样的…

Go环境搭建

下载 官网地址 选择Download 根据自己的请选择对应的版本进行下载(我这里使用windos go.1.21.1版本) 我这里选择zip类型进行下载免安装版(你也可以选择mis类型进行下载,安装版一步一步next就行)。 安装 解压安装包 目录说明 配置环境变量 验证是否安装成功 完成上述配置…

通过插件去除Kotlin混淆去除 @Metadata标记

在Kotlin中&#xff0c;Metadata是指描述Kotlin类的元数据。它包含了关于类的属性、函数、注解和其他信息的描述。Metadata的作用主要有以下几个方面&#xff1a; 反射&#xff1a;Metadata可以用于在运行时获取类的信息&#xff0c;包括类的名称、属性、函数等。通过反射&…

【功能设计】数据分发功能设计

文章目录 设计脑图功能性非功能性 功能设计文档1. 需求分析1.1、功能性需求1.2、非功能性需求 2. 功能设计2.1 业务流程图2.2 数据流图2.3 表结构设计2.4 接口设计2.5 功能点 3.非功能性设计3.1 性能3.2 可用性3.3 并发性3.4 安全性 设计脑图 功能性 非功能性 功能设计文档 1…

国庆中秋特辑(三)使用生成对抗网络(GAN)生成具有节日氛围的画作,深度学习框架 TensorFlow 和 Keras 来实现

要用人工智能技术来庆祝国庆中秋&#xff0c;我们可以使用生成对抗网络&#xff08;GAN&#xff09;生成具有节日氛围的画作。这里将使用深度学习框架 TensorFlow 和 Keras 来实现。 一、生成对抗网络&#xff08;GAN&#xff09; 生成对抗网络&#xff08;GANs&#xff0c;…

FFMpeg zoompan 镜头聚焦和移动走位

案例 原始图片 # 输出帧数&#xff0c;默认25帧/秒&#xff0c;25*4 代表4秒 # s1280x80 # 输出视频比例&#xff0c;可以设置和输入图片大小一致 # zoom0.002 表示每帧放大的倍数&#xff0c;下面代码是25帧/每秒 * 4秒&#xff0c;共1000帧 # 最终是 0.002*25*4 0.2&…

什么是深度学习?最易懂的机器学习入门文章

1. 什么是深度学习? 深度学习是机器学习领域中一个新的研究方向&#xff0c;它被引入机器学习使其更接近于人工智能。 原文&#xff1a;【科普&实践】超详细&#xff01;一文带你玩转深度学习 - 飞桨AI Studio星河社区 深度学习是机器学习领域中一个新的研究方向&#xff…

折腾LINUX复古终端

这个复古终端是cool-retro-term&#xff0c;先来图 点击GITHUB地址 开始用docker运行&#xff0c;报错。后来用x11docker&#xff0c;因为我要远程通过SSH的x11转发&#xff0c;但实际x11docker的默认backbone就说docker&#xff0c;也就说要先用docker下载镜像&#xff0c…

[maven] 实现使用 plugin 及 properties 简述

[maven] 实现&使用 plugin 及 properties 简述 这章内容&#xff0c;我个人感觉可看可不看……&#xff1f; 不过课都上了&#xff0c;笔记 &#x1f4d2; 补完才对得起自己嘛 plugins 主要讲一下 maven 的 plugin 时怎么实现的&#xff0c;以及项目中怎么调用自己实现…

成集云 | 用友T+集成聚水潭ERP(用友T+主管供应链)| 解决方案

源系统成集云目标系统 方案介绍 用友T是一款由用友畅捷通推出的新型互联网企业管理系统&#xff0c;它主要满足成长型小微企业对其灵活业务流程的管控需求&#xff0c;并重点解决往来业务管理、订单跟踪、资金、库存等管理难题。 聚水潭是一款以SaaS ERP为核心&#xff0c;集…

mysql事务测试

mysql的事务处理主要有两种方法1、用begin,rollback,commit来实现 begin; -- 开始一个事务 rollback; -- 事务回滚 commit; -- 事务提交 2、直接用set来改变mysql的自动提交模式 mysql默认是自动提交的&#xff0c;也就是你提交一个sql&#xff0c;它就直接执行&#xff01;我…

微信管理系统可以解决什么问题?

微信作为一款社交通讯软件&#xff0c;已经成为人们日常生活中不可缺少的工具。不仅个人&#xff0c;很多企业都用微信来联系客户、维护客户和营销&#xff0c;这自然而然就会有很多微信账号、手机也多&#xff0c;那管理起来就会带来很多的不便&#xff0c;而微信管理系统正好…

基于径向基神经RBF的空调功率预测,RBF神经网络的详细原理,RBF回归预测代码

目录 完整代码和数据下载链接&#xff1a;基于MATLAB的RBF的空调能耗预测_模糊空调matlab资源-CSDN文库 https://download.csdn.net/download/abc991835105/87833598 RBF的详细原理 RBF的定义 RBF理论 易错及常见问题 RBF应用实例&#xff0c;基于rbf的空调功率预测 代码 结果…

C语言大佬的必杀技---宏的高级用法

C语言大佬的必杀技—宏的高级用法 目录: 字符串化标记的拼接宏的嵌套替换多条语句防止一个文件被重复包含宏和函数的区别 可能大家在学习的时候用得比较少&#xff0c;但是在一些代码量比较大的时候&#xff0c;这样使用&#xff0c;可以大大的提高代码的可读性&#xff0c;…

minio报错should be less than or equal解决方案

minio报错should be less than or equal解决方案 问题背景解决方案Lyric&#xff1a; 当作你的请求 问题背景 在进行minio扩容时&#xff0c;报错 parity validation returned an error: parity 4 should be less than or equal to 2 <- (4, 4), for pool(2nd解决方案 mi…

ModbusTCP 转 Profinet 主站网关控制汇川伺服驱动器配置案例

ModbusTCP Client 通过 ModbusTCP 控制 Profinet 接口设备&#xff0c;Profinet 接口设备接入 DCS/工控机等 兴达易控ModbusTCP转Profinet主站网关&#xff08;XD-ETHPNM20&#xff09;采用数据映射方式进行工作。 使用设备&#xff1a;兴达易控ModbusTCP 转 Profinet 主站网关…