【Servlet】如何编写第一个Servlet程序

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【Servlet】
本专栏旨在分享学习Servlet的一点学习心得,欢迎大家在评论区交流讨论💌

Servlet是Java编写的服务器端程序,主要用于处理客户端请求和生成响应。它可以接收来自客户端(通常是Web浏览器)的请求,执行特定的任务,并返回响应给客户端。

目录

  • 一、创建项目
  • 二、引入依赖
  • 三、创建必要的目录和文件
  • 四、代码编写
  • 五、打包程序
  • 六、程序部署
  • 七、验证程序
    • 注意事项

重要的事情放前面:Servlet程序运行时,一定要保证Tomcat处于运行状态

一、创建项目

在这里插入图片描述

什么是Maven
Maven是Java中的一个构建工具。
一个程序在编写过程中往往会涉及到第三方库的依赖,同时需要对写好的程序进行一个打包部署。
Maven存在的意义就是为了能够方便的进行依赖管理打包部署
IntelliJ是Java中默认的构建工具,Gradle(安卓中会用到)同样是是Java中常见的构建工具。

在这里插入图片描述

我们来带看一下pom.xml文件
在这里插入图片描述
后续我们会根据需要会继续向pom.xml文件中放新的内容。
在这里插入图片描述

好了,以上就是创建项目的步骤,接下来我们来到下一步,即引入依赖。

二、引入依赖

当前的代码要使用Servlet开发,而Servlet并不是Java标准库自带的,所以我们需要Maven把Servlet的依赖获取到。所以我们需要找到Maven的中央仓库,然后从中央仓库中找到我们想要获取到的依赖。

中央仓库地址:https://mvnrepository.com/

来到中央仓库后,直接搜索servlet即可。
在这里插入图片描述
如上图,点击Java Servlet API后来到如下页面
在这里插入图片描述
找到3.1.0的版本,因为Tomcat和Servlet是有对应关系的:如果Tomcat使用8版本的话,那么Servlet就需要使用3.1版本。
在这里插入图片描述
在这里插入图片描述
此时IDEA就会自动的通过Maven从中央仓库下载到这里的依赖。
我们可以看到上面报红了,有可能还没有下载完(第一次使用一般会比较慢,因为要从中央仓库中下载很多的依赖),这种情况稍微等一下就好了。
但是如果等了很长时间都没有解决的话,我们就需要点击下面的刷新按钮:
在这里插入图片描述

好了,以上就是引入依赖的全过程。

三、创建必要的目录和文件

Tomcat对于Servlet项目是有一些额外的要求的。

Maven最为一个通用的工具,不仅仅可以管理Servlet项目,还可以管理其它的项目。再此基础上还需要按照Servlet项目的要求来创建出特定的目录和文件。

  • 在main目录下创建webapp目录
  • webapp目录中创建一个目录WEB-INF
  • WEB-INF目录中创建web.xml文件,web.xml文件的作用就是告诉Tomcat我这个目录中的内容是一个webapp,需要把我加载起来。

整个目录结构如下:
在这里插入图片描述
上述创建的目录结构(包括目录的名字)和文件都是固定的。

另外,我们需要在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的作用是指定了该 Web 应用程序的基本信息和配置参数,例如,控制应用程序如何处理请求、响应、会话管理等(具体细节我们这里暂时跳过)。

上述的配置文件可能会出现如下报错,请看:
在这里插入图片描述
爆红不是我们的原因,这里直接忽略即可(并不影响程序的运行)。
解释一下:爆红的部分即"http://java.sun.com/dtd/web-app_2_3.dtd"是一个schema文件,该文件描述了xml文件的格式是怎样的(哪些标签是合法的,哪些是不合法的,以及标签之间如何进行嵌套)。

好了,以上就是创建目录结构及文件的全部内容。接下来开始正式的代码编写。

四、代码编写

  • 第一步:创建类HelloServlet,然后让该类继承HttpServlet(此类是Servlet的jar包提供的,编写Servlet程序一般都需要继承这个类——HttpServlet),如下图:

在这里插入图片描述
如果HttpServlet报红的话,可能是之前的pom.xml中的依赖没有正确引入。这是我们只需要刷新一下pom.xml文件即可。
在这里插入图片描述
在这里插入图片描述

  • 第二步:重写父类HttpServlet中的方法(doGet方法

在这里插入图片描述
在解释doGet方法之前,我们先来回顾下服务器典型的三步走流程:
①读取请求并解析请求
②根据请求计算响应
③把响应写回到客户端

好了接下来解释doGet方法:
在这里插入图片描述

doGet方法要做的事情就是根据请求(req)计算出响应(resp),所以对应的doGet方法中的代码就是根据req请求中不同的参数细节从而生成一个具体的resp对象(即往空对象中设置属性)。

然后,Tomcat就会根据这个resp响应对象转换成符合HTTP协议的响应报文并返回给浏览器。

注解(配置路由):
在这里插入图片描述
我们已经知道Tomcat会在合适的时机自动调用doGet方法,体现在两个方面:
第一个方面:根据请求方法的不同来调用不同的方法。举例:如果请求方法是GET,那么Tomcat就会在合适的时机自动调用doGet;如果请求的方法是PUT,那么Tomcat就会在合适的时机自动调用doPost。
第二个方面:请求的路径中,url后面带有层次结构的路径。一个Servlet程序中可能有多个Servlet类,这些Servlet类需要在不同的情况下被执行到。比如当请求的路径中有hello的时候,才能执行到HelloServlet的代码。当然,不同的Servlet类可以关联到不同的路径
总结:Tomcat在合适的时机自动调用Servlet的方法,根据请求的方法类型和请求的路径进行匹配,以调用对应的Servlet方法来处理请求。这样可以实现不同Servlet类在不同情况下的执行(不同的代码应用到不同的场景)。

总而言之,doGet方法就是根据请求算出响应(即服务器典型三步走的第二步,第一步和第三步由Tomcat来完成)。

以上就是代码的编写,现在问题来了,为什么没有出现main方法。
解释:Servlet程序不需要main方法。上述写的代码并不是独立的程序,而是放到Tomcat上去执行的。而main方法在Tomcat,我们写的代码比如说doGet之类的方法都是让Tomcat来调用的

五、打包程序

这里写的程序是放到Tomcat上运行,所以需要对程序进行打包。
打包成一个Tomcat能识别的包的格式,此时代码才会被Tomcat给加载起来。
打包的过程是借助Maven来完成。

在这里插入图片描述

看到如下图就说明已经打包好了。在这里插入图片描述
在这里插入图片描述
在Maven中默认打包生成的是jar包(jar包是java中常用的打包方式,jar包中就是一些.class文件),但是Tomcat需要的并不是jar包,而是war包(war包本质上和jar包差不多,war包中会包含一些前端的代码,如html、css等,以及一些Tomcat的配置(web.xml))。
所以我们需要修改配置项来让Maven打包出来的是一个war包
pom.xml文件中插入<packaging>war</packaging>即可,如下图:
在这里插入图片描述

另外,除了在pom.xml中添加packaging标签外,我们还可以添加其它标签,如下:

<build><finalName>java_servlet</finalName>
</build>

在这里插入图片描述
通过finalName标签可以设置打包出来的war包的名字(不是必须的,也可以使用默认的名字)。

好了,修改了上述的配置之后,接下来我们重新打包:
在这里插入图片描述
在这里插入图片描述
可以看到上图中target目录中新打成的war包。
在这里插入图片描述
这个war包就是我们想要向Tomcat中部署的内容。

至此,打包完成,我们就可以把war包放到Tomcat中了。

六、程序部署

程序部署就是把我们刚刚打包生成的war包放到Tomcat上,具体来说就是把这个war包拷贝到Tomcat中的webapps目录中。

在这里插入图片描述
把war包复制到Tomcat中的webapps目录后,Tomcat就会识别到有新的webapp到来了,然后就会自动对这个war包进行解压缩。

下面就到了最后一步——验证程序。

七、验证程序

通过浏览器发起http get请求,触发刚刚的servlet的代码。

在这里插入图片描述
第一点:通过第一级路径(称为context path/application path)来确认要访问哪个webapp(这个路径就是war包的名字);第二点:然后通过第二级路径(称为servlet path)来访问哪一个servlet代码;第三点:然后通过方法来确定执行servlet中哪个方法。

结合上面三点就定位到了要执行的代码时doGet方法

最后,程序成功执行。

在这里插入图片描述

注意事项

如果我们要对代码进行修改的话,我们需要重复上述的五、六、七步骤。

好了,以上就是本文的全部内容了。希望各位友友可以一键三连哈!!!

在这里插入图片描述

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

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

相关文章

5.【SpringBoot3】文件上传

1. 文件上传到本地 需求分析 在用户更换头像或发布文章时&#xff0c;需要携带一个图片的 url 地址&#xff0c;该 url 地址是当用户访问文件上传接口&#xff0c;将图片上传成功后&#xff0c;服务器返回的地址。所以&#xff0c;后台需要提供一个文件上传接口&#xff0c;用…

Android HIDL概述与绑定模式的实现

一、前言 Android O(8.0) 版本之后&#xff0c;底层实现有了比较大的变化&#xff0c;最显著的一个方面就是 HIDL 机制的全面实施。本文对于理解系统源码中 Gnss、Usb、Camera 等模块的工作原理有极大帮助。 二、HIDL 设计目的 在 Android O(8.0) 之前系统的升级牵扯多方协作…

Python tkinter (5) 选项按钮与复选框

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 目录 CheckButton 简单示例 获取选中 Ra…

RBD —— Visualizing fractured geometry

RBD Exploded View&#xff08;与Exploded View SOP类似&#xff09;从中心炸开几何体&#xff0c;以更好查看被破碎和约束的碎块&#xff1b; 可视化高精度和低精度几何体的不同&#xff0c;Show Proxy Geometry显示代理几何体&#xff1b; Show Constraints显示约束&#xff…

深入了解 Spring ImportBeanDefinitionRegistrar

Spring Framework 提供了许多灵活的扩展机制&#xff0c;其中之一就是ImportBeanDefinitionRegistrar接口。这个接口允许我们在Spring的配置类中动态注册额外的Bean定义&#xff0c;为我们的应用程序提供更高度的灵活性。在这篇文章中&#xff0c;我们将深入探讨ImportBeanDefi…

6.jmeter非GUI命令及Beanshell组件

一、非GUI&#xff08;界面&#xff09;命令详解 1. -n 使用非gui方式&#xff0c;不能单独使用&#xff0c;必须和-t&#xff08;指定jmeter的脚本&#xff09;一起用。 #cmd命令行模式下&#xff0c;进入存放测试jmx文件的目录下 jmeter -n -t hello.jmx只会生成一个log日…

数据结构实验八:排序的应用

目录 一、实验目的 二、实验原理 1.直接插入排序 2.快速排序 三、实验内容 实验1 代码 截图 实验2 代码 截图 一、实验目的 1、掌握排序的基本概念&#xff1b; 2&#xff0e;掌握并实现以下排序算法&#xff1a;直接插入排序、快速排序。 二、实验原理 1.直接插…

深入了解 Spring BeanPostProcessor 的应用

Spring框架的强大之处在于其提供了丰富的扩展点&#xff0c;其中之一是BeanPostProcessor接口。这个接口允许我们在Spring容器实例化bean之后、在调用初始化方法之前和之后对bean进行一些自定义的处理。在这篇文章中&#xff0c;我们将深入研究BeanPostProcessor的使用场景&…

Vue3基础:pnpm是什么?npm和pnpm的区别?如何使用pnpm?

pnpm 是一个流行的 JavaScript 包管理器&#xff0c;类似于 npm 和 yarn。它是 performant npm 的缩写&#xff0c;意在表明它是一个更高效的 npm 替代品。pnpm 的主要特点和优势包括&#xff1a; 高效的存储空间使用 pnpm 使用称为“内容寻址存储”的机制来存储 npm 包。这意…

如何选择便捷安全的黄金交易平台?

黄金交易平台的介绍 黄金交易平台是一个提供方便、安全的方式进行黄金交易的网上平台。 投资者可以通过这些平台进行黄金的买卖&#xff0c;参与黄金市场的投资活动。 这些平台提供了一个简单易用的界面&#xff0c;让投资者可以方便地进行交易操作。 选择合适的黄金交易平台…

【运维】Ubuntu,如何在Ubuntu系统中编译和安装OpenCV, apt安装OpenCV

文章目录 编译安装apt安装OpenCV 在C开发中&#xff0c;使用OpenCV是一个常见的需求。您可以选择使用conan构建包&#xff0c;或者直接将OpenCV安装到系统中。官方文档提供了详细的教程&#xff0c;可以在这里找到&#xff1a;OpenCV官方文档 编译安装 然而&#xff0c;在这里…

小土堆pytorch学习笔记002

1、TensorBoard的使用 &#xff08;1&#xff09;显示坐标&#xff1a; from torch.utils.tensorboard import SummaryWriter import numpy as np from PIL import Imagewriter SummaryWriter("logs") # 写入的位置 log_dir logs # writer.add_image() "…

【LeetCode: 148. 排序链表 + 链表 + 归并排序】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

今天来看看工商业储能收益模式有哪些

安科瑞武陈燕acrelcy 2023 年有望成为工商业储能的发展元年&#xff0c;主要原因2023年工商业储能的经济性有望大幅提升。工商业储能下游主要为工商业企业&#xff0c;投资是否具有经济性是工商业需求的核心因素之一&#xff0c;而2023年工商业储能经济性或将显著提升&#xf…

shared_ptr 与 unique_ptr 的转换 笔记

推荐B站文章&#xff1a; 6.shared_ptr与unique_ptr_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p6&vd_sourcea934d7fc6f47698a29dac90a922ba5a3我的往期文章&#xff1a; 独占指针&#xff1a;unique_ptr 与 函数调用-CSDN博客https://blog.csdn.n…

【Docker】构建镜像

一般来说我们不需要自己构建镜像&#xff0c;这些镜像在docker hub上面已经有现成的了&#xff0c;比如常用的数据库、应用软件等。 某些情况我们还是需要自己来构建: 找不到现成的镜像&#xff0c;比如自己开发的应用程序 需要在镜像中加入特定的功能/软件 Docker提供了两种…

C++入门学习(十五)运算符

算术运算符&#xff1a;用于处理四则运算赋值运算符&#xff1a;用于将表达式的值赋给变量比较运算符&#xff1a;用于表达式的比较&#xff0c;并返回一个真值或假值逻辑运算符&#xff1a;用于根据表达式的值返回真值或假值 一、加减乘除 #include <iostream> #incl…

vue和react的运行机制

Vue和React都是现代的前端框架&#xff0c;它们提供了丰富的特性和工具&#xff0c;帮助开发者构建复杂的用户界面。虽然它们有很多相似之处&#xff0c;但也有一些重要的区别&#xff0c;特别是在运行机制方面。 Vue的运行机制 Vue.js是一个渐进式JavaScript框架&#xff0c…

Ubuntu20.04 安装 ROS noetic + MAVROS

本文在 AlphaCatOvO【ROS】在 Ubuntu 20.04 安装 ROS 的详细教程 基础上&#xff0c;根据实际安装经验&#xff0c;稍微进行补充。 一、安装Ubuntu20.04 假设已经正确安装。 二、安装 ROS noetic 2.1 换源 执行 sudo apt update sudo mv /etc/apt/sources.list /etc/apt/…

ijkj4a作用

ijkj4a是一个用于在Android平台上与Java和JNI进行交互的库。它提供了一些方便的函数和宏&#xff0c;用于在JNI层面上访问Java类和方法。通过使用ijkj4a&#xff0c;开发人员可以更轻松地在JNI代码中调用Java方法&#xff0c;以及在Java代码中调用JNI函数。 ijkj4a的作用主要有…