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
    遇到这个就可以很明显的说明代码中出现了错误,直接看报错信息就可以解决大部分问题。

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

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

相关文章

12、最小覆盖子串

如何想到这个解法 问题的特点&#xff1a; 首先&#xff0c;认识到这是一个关于子串的问题&#xff0c;而且需要考虑子串的最小长度。这提示我们可能需要使用一种方式来逐步探索不同的子串。滑动窗口的适用性&#xff1a;滑动窗口是处理子串问题的常用技巧&#xff0c;特别是当…

【图像分割】nnUnetV1与V2的Linux部署与应用命令

以前觉得麻烦&#xff0c;一直没用过nnunet&#xff0c;虽然知道它很火&#xff0c;最近一个契机&#xff0c;部署使用了一下nnunet&#xff0c;记录一下其部署和使用的方法与命令。 1、部署 首先&#xff0c;我有一个环境&#xff0c;这个环境可以是以前就有的&#xff0c;也可…

1.c++入门(命名空间、缺省参数、函数重载、引用、内联函数、for循环、auto关键字、指针空值nullptr)

1.c的第一个程序 // 方法一 #include<iostream>// namespace为命名空间的关键字&#xff0c;std为空间名&#xff1b; C标准库的东西放进std命名空间 using namespace std; int main() {cout << "hello world" << endl;return 0; }// 方法二 #in…

YOLOv8的多分类模型如何计算准确率(Accuracy)、精确率(Precision)、召回率(recall)和F1-Score模型评估参数

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【Linux】 OpenSSH_9.3p1 升级到 OpenSSH_9.6p1(亲测无问题,建议收藏)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

【leetCode】2810. 故障键盘

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

注解,自定义注解和元注解

1.注解 1.1.注解概述、作用 注解&#xff08;Annotation&#xff09;&#xff0c;也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性&#xff0c;与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面&#xff0…

《深入浅出多模态》:多模态经典模型CLIP

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职…

逆向案例14——cnki学术翻译AES加密分析,涉及保持会话和获取token值

python代码&#xff1a; import execjs import requests UA "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" token_url "https://dict.cnki.net/fyzs-front-api/getToken" url …

图像分割-RSPrompter

文章目录 前言1. 自动化提示器1.1 多尺度特征增强器1.2 RSPrompterAnchor-based PrompterQuery-based Prompter 2. SAM的扩展3. 结果WHU数据集NWPU数据集SSDD数据集 前言 《RSPrompter: Learning to prompt for remote sensing instance segmentation based on visual foundati…

一文读懂Memory consistency model (内存模型)

Memory consistency model又称Memory model (内存模型)&#xff0c;定义了使用Shared memory(共享内存)执行多线程(Multithread)程序所允许的行为规范。Memory model定义了软硬件接口规范&#xff0c;以便程序员预料硬件会有什么行为&#xff0c;而硬件实现者知道可以使用什么样…

牛客NC181 单词拆分(一)【中等 动态规划,前缀树 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/c0d32c1ce5744472a01b2351a2c2767f 思路 前缀树动态规划参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规…

OpenCV4.9处理平滑图像

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;使用OpenCV4.9的随机生成器和文本 下一篇&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何使用 OpenCV …

助力瓷砖生产智造,基于YOLOv5全系列参数【n/s/m/l/x】模型开发构建瓷砖生产制造场景下1280尺寸瓷砖表面瑕疵检测识别系统

砖生产环节一般经过原材料混合研磨、脱水、压胚、喷墨印花、淋釉、烧制、抛光&#xff0c;最后进行质量检测和包装。得益于产业自动化的发展&#xff0c;目前生产环节已基本实现无人化。而质量检测环节仍大量依赖人工完成。一般来说&#xff0c;一条产线需要配数名质检工&#…

【三十三】【算法分析与设计】回溯(1),46. 全排列,78. 子集,没有树结构,但是依旧模拟树结构,回溯,利用全局变量+递归函数模拟树结构

46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1&#xff0c;2&#xff0c;3] 输出&#xff1a;[[1&#xff0c;2&#xff0c;3]&#xff0c;[1&#xff0c;3&a…

缺陷检测项目 | 使用OpenCV实现纺织品表面缺陷检测

项目应用场景 面向纺织品表面缺陷检测场景&#xff0c;使用 OpenCV 来实现&#xff0c;因此无需深度学习复杂的训练流程&#xff0c;实现起来会更加便捷。 项目效果&#xff1a; 项目细节 > 具体参见项目 README.md 项目采用 VisualStudio C# 开发&#xff0c;所以用 Visua…

AcWing---转圈游戏---快速幂

太久没写快速幂了... 这是一道数学题orz&#xff0c;能看出来的话答案就是 &#xff0c;但是很大&#xff0c;同时还要mod n&#xff0c;直接用快速幂即可。 快速幂模版&#xff1a; long long int power(long long int a,long long int b,long long int mod){long long int r…

pandas(day6 图表)

一. 计算效率 1. 测量代码运行时间 %%time %%timeit 单纯计算 代码块执行的时长 %%time _sum(np.arange(6)) CPU times: total: 0 ns Wall time: 1.66 ms用于多次运行代码块并计算平均执行时间 %%timeit _sum(np.arange(6))738 ns 10.7 ns per loop (mean std. dev. of 7…

java流式计算Stream

java流式计算Stream 流(Stream)到底是什么呢? 是数据渠道&#xff0c;用于操作数据源&#xff08;集合、数组等&#xff09;所生成的元素序列。 “集合讲的是数据&#xff0c;流讲的是计算! ” 特点&#xff1a; Stream自己不会存储元素。 Stream不会改变源对象。相反&#x…

金三银四面试题(十六):MySQL面试都问什么(1)

在开发岗位面试中&#xff0c;MySQL基本是必考环节。所以接下来我们就进入MySQL八股文环节&#xff0c;看看都有哪些高频考题。 MySQL 中有哪些不同的表格&#xff1f; 在MySQL中&#xff0c;可以创建多种不同类型的表格&#xff0c;其中一些常见的类型包括&#xff1a; InnoD…