【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…

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.直接插…

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

黄金交易平台的介绍 黄金交易平台是一个提供方便、安全的方式进行黄金交易的网上平台。 投资者可以通过这些平台进行黄金的买卖&#xff0c;参与黄金市场的投资活动。 这些平台提供了一个简单易用的界面&#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…

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/…

A股市场风云!深圳开股票账户交易佣金费用最低是多少?

最近A股市场表现出色&#xff0c;呈现出风云状态&#xff01;投资者纷纷涌入股市&#xff0c;推动股指不断攀升。一方面&#xff0c;政府出台了一系列政策来稳定市场&#xff0c;如加强监管力度、推动资本市场改革等&#xff0c;为投资者提供了更多机会和便利条件。另一方面&am…

“情暖寒冬 温暖相伴”关爱慰问

岁末寒冬&#xff0c;春节将至&#xff0c;为持续巩固脱贫攻坚成果&#xff0c;扎实助力乡村振兴&#xff0c;市融媒体中心开展“情暖寒冬 温暖相伴”慰问活动。 1月25市融媒体中心联合我市志愿者协会在南村镇忽树庄村开展“情暖寒冬 温暖相伴”慰问活动&#xff0c;为脱贫户送…

Spark3学习笔记

文章目录 一、Spark 基础1、Spark概述1.1 Spark简介1.2 Spark VS Hadoop1.3 Spark特点1.4 Spark入门Demo 2、Spark 运行模式2.1 概述2.2 Local模式2.3 Standalone 模式2.4 配置高可用&#xff08; Standalone HA&#xff09;2.5 Yarn 模式2.6 K8S & Mesos 模式2.7 Windows …

Vue基础知识

Vue Vue基础知识 v-bind:动态绑定属性值 Vue 修改&#xff0c;标签内也修改 在methods 中可以定义很多函数 在 data 中可以定义很多变量 v-if / v-show&#xff1a;对符合条件的元素进行展示 v-for:把数据遍历出现在网页中 案例 <!DOCTYPE html><html lang"e…

postman自动化测试如何设置环境变量教程

在接口测试中&#xff0c;我们经常会用到一些通用请求参数&#xff0c;或者需要使用某个接口的返回参数作为另一个接口的请求参数&#xff0c;静态的参数还好&#xff0c;如果是经常变动的参数&#xff0c;那么操作起来&#xff0c;就特别的麻烦&#xff0c;这时候&#xff0c;…

如何利用监管工具有效防止员工私单飞单?

在今天的商业社会中&#xff0c;企业必须保持高度的监管和控制力度&#xff0c;以确保员工遵守公司的规章制度和道德准则。尤其在微信成为了日常工作中不可或缺的沟通工具的情况下&#xff0c;如何有效防止员工进行私单飞单成为了每个企业亟需解决的问题。 而微信管理系统通过…