当前位置: 首页 > news >正文

JavaEE——手把手教你实现简单的 servlet 项目

文章目录

  • 一、什么是 Servlet
  • 二、创建一个简单的 Servlet 程序
    • 1. 创建项目
    • 2.引入依赖
    • 3. 创建目录
    • 4.编写代码
    • 5. 打包程序
    • 6. 部署
    • 7.验证
    • 整体过程总结
  • 三、使用 Smart Tomcat 插件简化项目创建
  • 四、创建项目时可能遇到的几个问题。

一、什么是 Servlet

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

网页分为两类:
静态页面:页面的内容是固定不变的。(一个单纯的 HTML 页面)
动态页面:页面内容随输入的参数的不同而改变。(是 HTML + 数据 组成)

二、创建一个简单的 Servlet 程序

这里,我们使用 Servlet 程序实现出一个 Hello world 打印。将其部署到 Tomcat 上。通过 使用浏览器访问 ,的形式得到 Hello world 字符串。

这里的实现相对于直接使用某一种语言进行打印而言,还是比较复杂的。这里大致分为 7 个步骤。

  1. 创建项目
  2. 引入依赖
  3. 创建目录结构
  4. 编写代码
  5. 打包程序
  6. 部署程序
  7. 验证

下面,我会就上面的 7 个步骤依次进行详细的解释。

1. 创建项目

此处创建的项目被称之为 Maven 项目
maven 是一个 “工程管理” 工具。

所谓 “工程管理” 管理的是下面的几个内容

  1. 规范目录结构
  2. 管理依赖 (使用什么第三方库,都会进行处理)
  3. 构建
  4. 打包 等。。。

要完成这里的工作,主要使用的就是上面所标注的两点。

在这里插入图片描述
如上图所示,创建一个新的项目,选择 maven 之后选择好存储目录,最后直接点击 完成 即可。

此处需要注意,如果是第一次创建 maven 项目,需要从 中央仓库加载一些 maven 依赖,可能需要等待较长的时间。

当成功创建项目后,在左侧的文件区域,会出现下图的内容 (大致了解其中不同文件夹的含义):
在这里插入图片描述

2.引入依赖

在上面我们提到,Servlet 代码,是基于 Tomcat 的 API 来实现的。所以,这里需要通过第三方库进行引入。

这里的第三方库是 maven 官网,相关链接如下:maven网站

进入网站,在搜索框输入 Servlet 会得到下面的页面:
在这里插入图片描述
如图,罗列出的第一个就是我们要选择的。
点击进入,这里会有多个版本的选择。根据需要,选择合适的版本。(ps:本人在这里使用的 Tomcat 8 对应的版本选择 3.1.0)

点击进入
在这里插入图片描述
如图所示,页面向下滑动,我们会看到这段字符。

在这里,我们将不会使用以往的方式下载 jar 包进行引入。而是直接将这段文字复制导入即可。(其实也就是该依赖在 maven 仓库的坐标)

在这里插入图片描述
如图所示,这里标记了两处标签。
需要注意的是:

  • 绿色 标记的 “dependencies” 是自己先写上去的。属于 project 顶级标签的子标签。
  • 红色 标记的 “dependency” 是其中的一个依赖。如果需要有多个依赖加入。以一组 “denpendency” 为单位添加即可。

3. 创建目录

虽然 maven 已经帮助我们创建出了一些目录,但是仍然有欠缺。
此处是使用 maven 开发一个 web 程序,还要有别的目录。

所需要创建的目录:

  1. 在 main 目录下创建出一个 webapp 目录。
  2. 在 webapp 目录下创建 WEB-INF 目录
  3. 在 WEB-INF 目录下创建一个 web.xml 文件。

如图:
在这里插入图片描述

解释 web.xml 在这里的作用

当前,我们实现的是 Servlet 程序,相较于之前的代码,此处是没有 main 方法的。

我们知道,main 方法就是让程序启动的一个关键。就好比是汽车的发动机。

对于此处的程序,我们可以将其类比为一列火车。
这里的 Servlet 程序是基于 Tomcat 来实现的。
Servlet 在这里就是没有动力的车厢。
Tomcat 在这里就是一节火车头。
需要注意的是,要成为一列火车,是需要将车头与车厢进行连接的。
此时,目录下的 WEB-INF / 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 中的代码是固定的,直接引用即可

4.编写代码

首先,我们需要在 Java 文件夹中创建出一个 class 类,来写入后续的代码。

这里先直接展示起手的代码:

public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doGet(req, resp);  }
}

代码分析:
在这里插入图片描述
这里重写的 doGet 方法被 Tomcat 调用时,当收到一个 get 请求时,就会触发这个方法

对于 req (请求):由 Tomcat 解析并构造。
对于 resp (响应):默认是一个空对象。
(这里不是 null,只是 new 了一个对象,其中的属性没有设置)
所以此时,就需要程序员根据需要设定响应

此时代码就需要进行修改

@WebServlet("/test")
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 这个代码必须被注释掉,在父类中,这个方法只是返回了一个错误页面//super.doGet(req, resp);// 这个是在服务器的控制台进行打印System.out.println("hello world");//想要将 hello world 返回到客户端,就需要使用下面的代码// getWriter 会得到一个 Write 对象resp.getWriter().write("hello world");}
}

代码分析:
在这里插入图片描述
到这里,我们还需要注意代码最上面的一个注解,如图:

在这里插入图片描述

注解在这里的作用,就是针对方法进行额外的 “解释说明” 对这个方法赋予额外的含义

这里的作用就是将类与 HTTP 的请求路径关联起来。

5. 打包程序

将程序编译好后,再讲这些 .class 文件构成压缩包,但是此处要打的是一个 war 包,不是jar 包
(war 是 Tomcat 专属的用来描述 webapp 的程序,一个 war 就是一个 webapp)

这里直接使用 maven 就可以直接打包,如图:
在这里插入图片描述
在这里插入图片描述
当出现上图中的情况时,就表明打包成功。

注意事项:
这里需要注意的是,在默认情况下 maven 打的是一个 jar 包
对此,就需要在 .xml 文件中进行调整,如图:
在这里插入图片描述

打包完成后,在 target 文件中,就可以找到我们打出来的包。
在这里插入图片描述

6. 部署

这一步的操作非常简单,只需要直接将 war 包拷贝到 Tomcat 的 webapp 中即可。

之后启动 Tomcat 即可。

7.验证

将压缩好的 war 包放入 webapp 中后,启动 Tomcat。

在这里插入图片描述

运行结果:

  • 在网页页面
    在这里插入图片描述
  • 在 Tomcat 服务器端口
    在这里插入图片描述
    如图,我们发现出现了多个结果。

出现这样的结果,原因是,只要访问一次页面,就会在控制台出现一次

整体过程总结

  • 首先,在浏览器中输入对应的 URL 后,浏览器就会构造一个 HTTP GET 请求,发送给 Tomcat。
  • 第二,Tomcat 就会根据第一路径,确定具体的 webapp
  • 第三,又会根据具体的 第二级路径 ,确定了调用的类
  • 第四,就会通过 GET / POST 方法来确定要调用 HelloServlet 中的哪一个方法 (doGet , doPost)
  • 最后,Tomcat 就会执行对应的代码完成对应的工作。

三、使用 Smart Tomcat 插件简化项目创建

在上面的介绍中,我们已经知道要创建出一个 servlet 项目,一共有 7 个步骤。

为了简化创建的过程, IDEA 为我们提供了一个 关于 Tomcat 插件
可以省去 手动打包、手动部署 这两个过程。

图示插件查找、安装过程。

在这里插入图片描述

首次使用的简单配置

  1. 需要先新增一个运行配置
    在这里插入图片描述
    点击 “添加配置”。

  2. 点击 + 并选择 Smart Tomcat
    在这里插入图片描述
    1. 首次配置创建需要选择 Tomcat 的安装路径
    2. 需要注意的是,这里代码执行的目录,必须到 webapp 文件夹处!(与将打好的 war 包存放到 webapp 由异曲同工之处。)

使用 Smart Tomcat 创建项目

在完成上面的添加操作后,我们就可以直接在 idea 中点击绿色三角号进行运行了。

在这里插入图片描述
但是,这里需要注意的是,此处的链接是不能直接点的,直接点击,触发的肯定是 404

这是因为此处没有包含 servlet path,即就是代码中 注释 提供的路径

在这里插入图片描述
如上图所示,在此处添加 “/test” 就可以成功访问。

简单解释 Smart Tomcat 工作原理。
Tomcat 的工作方式有两种:

  • 第一种,就是直接将要使用的 war 拷贝到 webapps 中进行访问执行。
  • 第二种,就是在启动时,显示指定一个特定的 webapp,让 Tomcat 单独加载当前的项目。(Smart Tomcat 就使用的这一种)

四、创建项目时可能遇到的几个问题。

  1. 404
    在这里插入图片描述
    可能的问题是:
    web.xml 内容错了、路径写错了、文件的位置错误。。。

  2. 405
    在这里插入图片描述
    可能的问题是:
    没有写 doGet 方法、
    super.doGet 没有删掉,如图:
    在这里插入图片描述

  3. 500
    遇到这个就可以很明显的说明代码中出现了错误,直接看报错信息就可以解决大部分问题。

相关文章:

JavaEE——手把手教你实现简单的 servlet 项目

文章目录 一、什么是 Servlet二、创建一个简单的 Servlet 程序1. 创建项目2.引入依赖3. 创建目录4.编写代码5. 打包程序6. 部署7.验证整体过程总结 三、使用 Smart Tomcat 插件简化项目创建四、创建项目时可能遇到的几个问题。 一、什么是 Servlet Servlet 是一种实现 动态页面…...

X年后,ChatGPT会替代底层程序员吗?

能不能替代&#xff0c;真的很难说&#xff0c;因为机器换掉人&#xff0c;这其实是一个伦理问题。 其实说白了&#xff0c;任何行业在未来都会被AI或多或少的冲击到&#xff0c;因为ChatGPT做为一个可以持续提升智能的AI&#xff0c;在某些方面的智能程度超过人类并不是什么难…...

OpenAI 推出新网络爬虫GPTBot,为GPT-5做准备

目录 一、GPTBot是什么&#xff1f;它是如何工作的&#xff1f;二、GPTBot 与 Google Bot 等搜索引擎网络爬虫有何不同&#xff1f;三、GPTBot 与 Perplexity AI 的网络爬虫有何不同&#xff1f;四、允许 GPTBot 爬取有哪些风险和好处&#xff1f;4.1 允许 GPTBot 的好处4.2 允…...

【Easy云盘 | 第二篇】后端统一设计思想

文章目录 4.1后端统一设计思想4.1.1后端统一返回格式对象4.1.2后端统一响应状态码4.1.3后端统一异常处理类4.1.4StringUtils类4.1.5 RedisUtils类 4.1后端统一设计思想 4.1.1后端统一返回格式对象 com.easypan.entity.vo.ResponseVO Data public class ResponseVO<T> …...

c语言:模拟字符串拷贝功能(strcpy),面试题

面试题&#xff1a;优化中的优化&#xff08;10分满分&#xff09; 字符串拷贝:是将一个字符串的内容复制到另一个字符串中的操作。 运用函数模拟字符串拷贝&#xff1a;&#xff08;5分&#xff09; 模拟字符串拷贝 #include <stdio.h> void my_strcpy(char* dest, c…...

信创环境ES索引管理脚本:close, delete

背景 elastic-curator在信创环境无现成安装包&#xff0c;且现成一般无法联网&#xff0c;此时通过脚本管理es索引是最佳选择。 1, 脚本内容: es-close-del.sh [rootmyprojtest001 ]# cat es-close-del.sh #/bin/bash#elastic地址 ELASTIC_URL127.0.0.1:9200 #默认的删除时间…...

torch-v1.3.1-build

编译pytorch-v1.3.1 python版本>3.8会收到报错 error: cannot convert ‘std::nullptr_t’ to ‘Py_ssize_t’ {aka ‘long int’} in initialization, 参见: https://github.com/pytorch/pytorch/issues/28060 简单办法是用python3.7 wget https://mirrors.tuna.tsingh…...

C语言宏定义笔记

把宏名全部大写&#xff0c;函数名不要全部大写。注意宏定义表示数据类型和用 typedef 定义数据说明符的区别。宏定义只是简单的字符串替换&#xff0c;由预处理器来处理&#xff1b; typedef 是在编译阶段由编译器处理的&#xff0c;它并不是简单的字符串替换&#xff0c;而给…...

设计模式:生活中的观察者模式

想象你在社交媒体上关注&#xff08;订阅&#xff09;了一个名人或新闻频道&#xff08;主题&#xff09;。一旦他们发布新内容&#xff0c;所有关注者&#xff08;观察者&#xff09;都会收到通知。这个过程就很像观察者模式的工作原理。 生活场景类比 主题&#xff08;Subj…...

Qt实现Kermit协议(四)

3 实现 3.3 KermitRecvFile 该模块实现了Kermit接收文件功能。 序列图如下&#xff1a; 3.3.1 KermitRecvFile定义 class QSerialPort; class KermitRecvFile : public QObject, public Kermit {Q_OBJECT public:explicit KermitRecvFile(QSerialPort *serial, QObject *…...

苏州金龙助力旅游客运加速蜕变

近日&#xff0c;北京铭悦旅游客运有限公司又迎来一批苏州金龙海格纯电动客车。&#xff08;以下简称北京铭悦旅游&#xff09;总经理郭保生在车辆交付时说到&#xff0c;“为迎接强劲复苏的旅游市场&#xff0c;要求旅游客运向绿色客运转型&#xff0c;以及人民对品质生活、美…...

头盔检测 | 基于Caffe-SSD目标检测算法实现的建筑工地头盔检测

项目应用场景 面向建筑工地头盔检测场景&#xff0c;使用深度学习 Caffe SSD 目标检测算法&#xff0c;基于 C 实现。 项目效果 项目细节 > 具体参见项目 README.md (1) 安装 Caffe SSD(2) 执行训练 sh examples/Hardhat/SSD300/train_SSD300.sh (3) 部署算法 项目获取 h…...

Stable diffusion 加载扩展列表报错解决方法

项目场景&#xff1a; 在使用Stable diffusion webui时&#xff0c;使用扩展列表出现错误 问题描述 点击loadfrom后&#xff0c;出现加载扩展列表报错 原因分析&#xff1a; 下载的扩展的时候&#xff0c;都是github 的url&#xff0c;需要科学上网&#xff0c;如果不能科学…...

Git(8)之分支间同步特定提交

Git(8)之分支间同步特定提交 Author&#xff1a;Once Day Date&#xff1a;2024年4月7日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSDN博客 文章目录 Git(8)之分支间同步特定提交1. 分支间同步提交2. cherry-pick同步分支间的特定提交…...

万得AI算法工程师一面面试题6道|含解析

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天…...

蓝桥杯23年第十四届省赛-异或和之和|拆位、贡献法

题目链接&#xff1a; 蓝桥杯2023年第十四届省赛真题-异或和之和 - C语言网 (dotcpp.com) 1.异或和之和 - 蓝桥云课 (lanqiao.cn) 参考题解&#xff1a; 蓝桥杯真题讲解&#xff1a;异或和之和 &#xff08;拆位、贡献法&#xff09;-CSDN博客 洛谷P9236 [蓝桥杯 2023 省 A]…...

Unity进阶之路(1)回顾与思考

首先呢&#xff0c;博主在这里先反思一下自己这几个月&#xff0c;其实并没有多少进步。 在寒假中&#xff0c;博主几乎是独立编写了一个小程序的完整UI和一个Uniapp的雏形。那段时间是博主生产力最高的时间段。几乎是每天8点起来开始编写代码&#xff0c;晚上一直忙到很晚。 …...

【C语言】——指针八:指针运算笔试题解析

【C语言】——指针八&#xff1a;指针运算笔试题解析 一、题一二、题二三、题三四、题四五、题五六、题六七、题七 一、题一 //程序输出结果是什么 int main() {int a[5] { 1,2,3,4,5 };int* ptr (int*)(&a 1);printf("%d, %d", *(a 1), *(ptr - 1));return…...

JVM字节码与类的加载——class文件结构

文章目录 1、概述1.1、class文件的跨平台性1.2、编译器分类1.3、透过字节码指令看代码细节 2、虚拟机的基石&#xff1a;class文件2.1、字节码指令2.2、解读字节码方式 3、class文件结构3.1、魔数&#xff1a;class文件的标识3.2、class文件版本号3.3、常量池&#xff1a;存放所…...

小程序如何通过公众号发送新订单提醒

当客户在小程序上下单后&#xff0c;公众号会发送订单通知&#xff0c;这可以让管理员及时获知用户下单情况&#xff0c;方便及时处理订单和提供服务。下面是具体介绍如何设置公众号来发送订单服务通知。 方式一&#xff1a;通过采云公众号发送订单通知 此种方式是默认的通知…...

聊聊公众号最让我不爽的两个痛点

本文首发于 Python猫 微信公众号最让我不爽的地方有两个&#xff0c;而且有很多人虽然也不爽&#xff0c;却不知道原因。 本文想聊聊公众号的两个痛点&#xff0c;因为我经常收到私信问这两个问题&#xff0c;本文算是一次集中的回复吧。 第一个不爽的点是公众号会屏蔽外链&…...

【leetCode】2810. 故障键盘

文章目录 [2810. 故障键盘](https://leetcode.cn/problems/faulty-keyboard/)思路一&#xff1a;模拟代码&#xff1a;思路二&#xff1a;双端队列代码&#xff1a; 2810. 故障键盘 思路一&#xff1a;模拟 用StringBuilder来拼贴字符遍历字符串&#xff0c;如果遇到i,对拼贴好…...

xshell7连接ubuntu18.04

&#x1f3a1;导航小助手&#x1f3a1; 1.查看ubuntu IP2.开启openssh-server3.静态IP设置4.Xshell连接 1.查看ubuntu IP 输入下面命令查看IP ifconfig -a可以看到网卡是ens33&#xff0c;IP为192.168.3.180。 2.开启openssh-server 1、执行下句&#xff0c;下载SSH服务 s…...

真正的力量:实力与人际关系的平衡艺术

在当今社会&#xff0c;人们常常在追求个人发展和建立良好人际关系之间寻找平衡。有一种观点认为&#xff0c;“没有实力&#xff0c;就不要对别人好。不然&#xff0c;很容易被定义为讨好。”这句话在一定程度上揭示了实力与人际关系之间的微妙联系。本文将探讨这一观点的深层…...

Acwing.1388 游戏(区间DP对抗思想)

题目 玩家一和玩家二共同玩一个小游戏。 给定一个包含 N个正整数的序列。 由玩家一开始&#xff0c;双方交替行动。 每次行动可以在数列的两端之中任选一个数字将其取走&#xff0c;并给自己增加相应数字的分数。&#xff08;双初始分都是 0分&#xff09; 当所有数字都被…...

Numpy数组转换为csv文件

参考&#xff1a;Converting Numpy Array to CSV 在数据分析和处理中&#xff0c;经常会涉及到将数据从一个形式转换为另一个形式的操作。 其中&#xff0c;将Numpy数组转换为csv文件是一种常见的操作&#xff0c;因为csv文件是一种通用的数据存储格式&#xff0c;方便与其他软…...

替代安全指标(Surrogate Safety Measures (SSM) )

替代安全措施&#xff08;Surrogate Safety Measures (SSM) &#xff09;用于从数据中寻找接近碰撞&#xff0c;或可能发生&#xff08;但实际没有发生&#xff09;的碰撞事件。 SSM的两个合格标准&#xff1a; &#xff08;1&#xff09;它应该来自与碰撞直接相关的交通冲突&…...

usb_camera传输视频流编码的问题记录!

前言&#xff1a; 大家好&#xff0c;今天给大家分享的内容是&#xff0c;一个vip课程付费的朋友&#xff0c;在学习过程中遇到了一个usb采集的视频数据流&#xff0c;经过ffmpeg编码&#xff0c;出现了问题&#xff1a; 问题分析&#xff1a; 其实这个问题不难&#xff0c;关键…...

Linux安装nginx保姆级教程

文章目录 前言一、nginx安装&#xff08;保姆级教程&#xff09;1.安装nginx依赖2.安装wget3.创建nginx安装目录4.下载nginx5.查看下载好的nginx6.解压缩7.查看当前目录下的文件→进入nginx-1.8.0目录→查看当前目录下的文件8.安装nginx9.查看nginx安装目录并启动nginx10.网络请…...

leetcode-判断二分图

. - 力扣&#xff08;LeetCode&#xff09; 存在一个 无向图 &#xff0c;图中有 n 个节点。其中每个节点都有一个介于 0 到 n - 1 之间的唯一编号。给你一个二维数组 graph &#xff0c;其中 graph[u] 是一个节点数组&#xff0c;由节点 u 的邻接节点组成。形式上&#xff0c…...

网站留言功能/百度大搜

随机数的产生在一些代码中很常用&#xff0c;也是我们必须要掌握的。而java中产生随机数的方法主要有三种&#xff1a; 第一种&#xff1a;new Random() 第二种&#xff1a;Math.random() 第三种&#xff1a;currentTimeMillis() 因为random的随机数在0-1之间&#xff0c;所…...

wordpress切换语言/北京seo推广

文 | 科技有意思&#xff0c;编辑 | 猫叔其实&#xff0c;苹果iOS14.2测试版出现故障的问题&#xff0c;我早就发现了。只是&#xff0c;一开始并不像目前一样频繁&#xff0c;所以起初我也就没太在意。具体情况是这样的&#xff1a;此前&#xff0c;给大家说过我手里的iPhone8…...

企业网站建设的重要性和必要性/腾讯企点怎么注册

CentOS 下添加新硬盘并分区格式化1.先添加一块硬盘&#xff0c;并建立分区&#xff0c;格式化&#xff0c;然后挂载使用用 Fdisk &#xff0d;l 来查看当前状态下磁盘情况[rootlinux1 ~]# fdisk -lDisk/dev/hda: 5368 MB, 5368709120 bytes255heads, 63 sectors/track, 652 c…...

网站建设需要服务器空间/seod的中文意思

这个错其实很简单&#xff0c;只是。。。 前几天客户端的程序员告诉我&#xff0c;Unity在iOS机型上有个问题&#xff0c;Socket在息屏后&#xff0c;如果之前连接了服务器&#xff0c;再次连接就没有问题&#xff0c;但是如果之前没有连接服务器&#xff0c;尝试去连接的话&am…...

大数据 做网站流量统计/百度咨询电话 人工

今天在整合jar包时候&#xff0c;出现了 这是我导入的jar坐标 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.14</version> </dependency> 然后查看了它的相关依赖&#xff0c;果然…...

注释网站开发/广州百度seo代理

sudo apt-get undate sudo apt-get install exfat-utils 转载于:https://www.cnblogs.com/raina/p/11129140.html...