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

        首先我们得下载安装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 {@Overrideprotected 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协议的响应报文@Overrideprotected 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.rhkb.cn/news/139552.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【进阶C语言】字符串与内存库函数认识与模拟实现

本章内容大致目录&#xff1a; 1.strlen函数 2.strcpy函数 3.strcmp函数 4.strcat函数 5.strstr函数 6.strtok函数 7.strerror与perror函数 8.字符操作函数 9.内存操作函数 10.总结 以上函数均属于库函数&#xff0c;有的函数则会介绍如何模拟实现。 一、strlen函数…

【DDPM论文解读】Denoising Diffusion Probabilistic Models

0 摘要 本文使用扩散概率模型合成了高质量的图像结果&#xff0c;扩散概率模型是一类受非平衡热力学启发的潜变量模型。本文最佳结果是通过根据扩散概率模型和朗之万动力学的去噪分数匹配之间的新颖联系设计的加权变分界进行训练来获得的&#xff0c;并且本文的模型自然地承认…

UE 虚幻引擎 利用LOD,Nanite技术优化场景性能

目录 0 引言1 LOD1.1 LOD定义1.2 UE5中的LOD技术1.3 HLOD&#xff08;Hierarchical Level of Detail&#xff09; 2 Nanite2.1 UE5的Nanite技术2.2 Nanite介绍2.2.1 Nanite的优势2.2.2 Nanite网格体与传统静态网格体的不同2.2.3 Nanite支持的类型2.2.4 在地形中使用Nanite 0 引…

递归,搜索与回溯

1.汉诺塔问题 在经典汉诺塔问题中&#xff0c;有 3 根柱子及 N 个不同大小的穿孔圆盘&#xff0c;盘子可以滑入任意一根柱子。一开始&#xff0c;所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动…

VOP —— Noise

目录 Turbulent Noise —— 计算1D/3D类型的Noise Anti-Aliased Flow Noise —— 生成抗锯齿噪波 Anti-Aliased Noise —— 生成抗锯齿噪波 Curl Noise —— 创建divergence-free 3D噪波 Curl Noise 2D —— 创建divergence-free 2D噪波 Flow Noise —— 生成1D/3D Perli…

人力资源HR 怎么选择在线人才测评工具

测评已经是普及度很好了&#xff0c;不仅仅是大企业&#xff0c;中小企业也都在启用人才测评&#xff0c;也有叫素质测评等等&#xff0c;内容多样化。但是根本形式是一样的&#xff0c;那就是在线测评&#xff0c;目的也是一样的&#xff0c;就是为了招来最适合的职员。 而市…

以太坊智能合约的历史里程碑: 从DAO到数据隐私的技术演进

文章目录 系列文章目录前言一、时间线 项目介绍总结 前言 在短短的几年内&#xff0c;以太坊不仅成为了去中心化应用和智能合约的主导平台&#xff0c;而且也见证了区块链技术和应用的多次重大革命。本文详细回顾了自2016年至今&#xff0c;以太坊生态所经历的几个关键时刻与技…

阿里云产品试用系列-容器镜像服务 ACR

阿里云容器镜像服务&#xff08;简称 ACR&#xff09;是面向容器镜像、Helm Chart 等符合 OCI 标准的云原生制品安全托管及高效分发平台。 ACR 支持全球同步加速、大规模/大镜像分发加速、多代码源构建加速等全链路提效&#xff0c;与容器服务 ACK 无缝集成&#xff0c;帮助企业…

Windows 基于Visual Studio 开发Qt 6 注意事项

前提条件&#xff1a; 1、Visual Studio 2022 社区版(免费版) 2、Qt-6.5.1版本 Qt Vistual Studio Tools下载 先打开Visual Studio 2022 社区版 &#xff1a; 点击扩展-》管理拓展按钮后&#xff0c;在搜索框中输入Qt&#xff0c;点击这里第一个扩展安装。 Qt Visual Stud…

iterator和generator

iterator和generator iterator es6: let/const ...展开 迭代器 是一种机制&#xff0c;比如在控制台输出Iterator是没有这个类的&#xff0c;为不同的数据结构提供迭代循环的机制。 迭代器对象&#xff1a;具备next方法&#xff0c;next能够对你指定的数据进行迭代循环&#x…

gogs git 服务器极速搭建

背景 小型团队合作中&#xff0c;需要代码托管在内网&#xff0c;gitlab 等搭建比较复杂&#xff0c;经过一番搜寻发现gogs满足需求 基本用户管理后台管理面板&#xff0c;能在web端查看管理安装配置极简 安装配置 gogs是支持多个平台&#xff0c;这里我们选择ubuntu 1.下载git…

2023-9-23 合并果子

题目链接&#xff1a;合并果子 #include <iostream> #include <algorithm> #include <queue>using namespace std;int main() {int n;cin >> n;priority_queue<int, vector<int>, greater<int>> heap;for(int i 0; i < n; i){in…

Tomcat部署、优化、以及操作练习

一.Tomcat的基本介绍 1.1.Tomcat是什么&#xff1f; Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;T…

BUUCTF:[MRCTF2020]套娃

查看源码发现 PHP非法参数名传参问题&#xff0c;详细请参考我的这篇文章&#xff1a;谈一谈PHP中关于非法参数名传参问题 正则这里绕过使用%0a换行符绕过&#xff0c;payload: /?b.u.p.t23333%0a 得到下一步信息&#xff1a;secrettw.php 注释中的是JsFuck&#xff0c;用这…

【李沐深度学习笔记】数据操作实现

课程地址 数据操作实现p2 数据操作 首先导入PyTorch包&#xff08;import torch)&#xff0c;虽然叫PyTorch&#xff0c;但实际上要导入torch。 import torch张量 张量表示的是一个数值组成的数组&#xff0c;这个数组可以有很多个维度。 # 生成0-11的顺序序列构成的一维…

一篇文章让你学会什么是哈希

一篇文章让你学会什么是哈希 哈希概念哈希冲突哈希函数1. 直接定址法2. 除留余数法3. 平方取中法4. 折叠法5. 随机数法6. 数学分析法 哈希冲突解决1. 闭散列1.1 线性探测1.2 二次探测 2. 开散列 开散列和闭散列对比 哈希概念 哈希在C中有广泛的应用&#xff0c;它是一种用于快…

【算法与数据结构】JavaScript实现十大排序算法(二)

文章目录 关于排序算法快速排序堆排序计数排序桶排序基数排序 关于排序算法 稳定排序&#xff1a; 在排序过程中具有相同键值的元素&#xff0c;在排序之后仍然保持相对的原始顺序。意思就是说&#xff0c;现在有两个元素a和b&#xff0c;a排在b的前面&#xff0c;且ab&#xf…

外包干了2个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

竞赛选题 基于深度学习的行人重识别(person reid)

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的行人重识别 该项目较为新颖&#xff0c;适合…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS基础(四)

开始吧&#xff0c;做时间的主人&#xff01; 把时间分给睡眠&#xff0c;分给书籍&#xff0c;分给运动&#xff0c; 分给花鸟树木和山川湖海&#xff0c; 分给你对这个世界的热爱&#xff0c; 而不是将自己浪费在无聊的人和事上。 思维导图 函数 为什么需要函数 <!DO…