第一个Servlet程序

目录

一、Servlet是什么

二、第一个Servlet项目

2.1 创建Maven项目

2.2 引入Servlet依赖

2.3 创建目录

三、Servlet启动

3.1 编写代码

3.2 打包程序

3.3 部署程序

四、更便捷的部署方式

4.1 安装Smart Tomcat插件


一、Servlet是什么

Servlet 是一种实现动态页面的技术。是一组 Tomcat 提供的 API,实现简单高效的开发一个 web app。Servlet主要做的工作:

  • 允许注册一个类,在 Tomcat 收到某个特定的 HTTP 请求的时候,执行这个类中的一些代码。
  • 解析 HTTP 请求,把 HTTP 请求从一个字符串解析成一个 HttpRequest 对象。
  • 构造 HTTP 响应。程序猿只要给指定的 HttpResponse 对象填写一些属性字段, Servlet就会自动的按照 HTTP 协议的方式构造出一个 HTTP 响应字符串,并通过 Socket 写回给客户端。

简而言之,Servlet 是一组 Tomcat 提供的 API,让程序猿自己写的代码能很好的和 Tomcat 配合起来,从而更简单的实现一个 web app。而不必关注 Socket,HTTP协议格式,多线程并发等技术细节,降低了 web app 的开发门槛,提高了开发效率。也就相当于一个小框架。

二、第一个Servlet项目

要使用Servlet的话就需要先创建一个Maven项目,Maven项目可以快速导入依赖,也能快速打包,

这里使用IDEA(2021版)来创建一个Maven项目,对于其他版本应该是差不多的方式

2.1 创建Maven项目

1) 菜单 -> 文件 -> 新建项目 -> Maven

2) 选择项目要存放的目录

3)点击Finish,一般右下角会弹出以下对话框。选择 Enable Auto-Import,第一次创建Maven项目时,是需要引入许多依赖文件的,可能会有点耗时。如果引入失败建议多尝试两次,如果还是不行的话建议更换国内镜像源!

2.2 引入Servlet依赖

项目创建完成之后,会自动生成一个pom.xml文件,我们需要在这个文件中引入Servlet的相关依赖文件,也就是Servlet API依赖的jar包

1)在中央仓库搜索“Servlet”,选择第一个点击进入

对于版本的选择是很重要的,Servlet的版本是要和Tomcat相匹配的,如果不知道使用什么版本建议上官网查询http://tomcat.apache.org/whichversion.html(不要问为什么知道,问就是版本没搞对拜拜浪费一天时间)这里Tomcat如果是8.几版本的话直接选择这个3.1.0

2)点击进入之后,不要再去下载jar包了,这里直接使用Mevean导入依赖,将依赖复制到pom.xml文件中

3)导入依赖的时候要注意先建立一个<dependencies>,以后所有的依赖都放入这里就行了

<dependencies> 标签内部放置项目依赖的 jar 包。maven 会自动下载依赖到本地。

2.3 创建目录

当项目创建好的时候,其实IDEA会自动创建一些目录。例如:

这些目录在实现一个web app还不够,这时还需要创建一些新的目录/文件

1)main目录下新建一个webapp(注意名字不可错)目录与java目录并列,右键点击main目录选择创建新目录

2)在webapp目录下创建新的目录 WEB-INF 目录(注意名字不可错)

3) 在WEB-INF目录中创建文件web.xml这是必须的

4)将以下代码复制到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>
  • webapp 目录就是未来部署到 Tomcat 中的一个重要的目录。当前我们可以往 webapp 中放一些静态资源,比如 html ,css 等.
  • 在这个目录中还有一个重要的文件 web.xml。Tomcat 找到这个文件才能正确处理 webapp 中的动态资源

三、Servlet启动

3.1 编写代码

在java目录下创建一个类,这个类继承自HttpServlet,如果这里的HttpServlet爆红的话可能是依赖还没有完全导入,这时需要刷新一下Maven

  • 在这个类上方加上 @WebServlet("/hello") 注解,表示 Tomcat 收到的请求中,路径为 /hello的请求才会调用 HelloServlet 这个类的代码。 (这个路径未包含 Context Path)
  • 重写 doGet 方法。doGet 的参数有两个,分别表示收到的 HTTP 请求和要构造的 HTTP 响应。这个方法会在 Tomcat 收到 GET 请求时触发
  • HttpServletRequest 表示 HTTP 请求。Tomcat 按照 HTTP 请求的格式把 字符串格式 的请求转成了一个 HttpServletRequest 对象。后续想获取请求中的信息(方法,url,header,body 等) 都是通过这个对象来获取。
  • HttpServletResponse 表示 HTTP 响应。代码中把响应对象构造好(构造响应的状态码,header,body 等)
  • resp.getWriter() 会获取到一个流对象,通过这个流对象就可以写入一些数据,写入的数据会被构造成一个 HTTP 响应的 body 部分,Tomcat 会把整个响应转成字符串,通过 socket 写回给浏览器

3.2 打包程序

1)使用 maven 进行打包。打开 maven 窗口 (一般在 IDEA 右侧就可以看到 Maven 窗口,如果看不到的话,可以通过 菜单 -> View -> Tool Window -> Maven 打开)然后展开 Lifecycle ,双击 package 即可进行打包。

打包成功,就会显示一个 build success

 打包成功后可以发现这个项目的右边出现了一个target目录,并且生成了一个jar包

2)但是这个jar包不是我们需要的(项目打包需要的是war包),并且这个名字也有点复杂。通过在pom.xml文件中修改依赖,来达到需要的效果。添加完了依赖之后再重复1)过程打包

再次打包就可以得到想要的了

3.3 部署程序

1)将war包拷贝到Tomcat的webapps中,启动Tomcat时会自动解压缩war包

这里就会发现Tomcat自动解压了war包

2)启动Tomcat,并验证程序,访问127.0.0.1:8080/HelloServlet/hello ,这里就可以看到结果了

注意: URL 中的 PATH 分成两个部分,其中 HelloServlet 为 Context Path,hello 为 Servlet Path(其中Context Path是打包的文件名)

四、更便捷的部署方式

我们发现如果每次进行代码更改都要重新打包的话,那这样未免也太麻烦了,所以这里在项目编写的过程中推荐使用IDEA中的插件,但是最后在部署的时候还是要进行打包

4.1 安装Smart Tomcat插件

1) 菜单 -> 文件 -> Settings

2)安装好之后,最后只要配置一下就可以使用了

3)配置完成之后,就可以在IDEA中一键运行项目了(这里开始运行之前要先关闭之前的Tomcat)

没有报错的就说明已经运行成功了

访问 localhost:8080/test/hello,这里我没有更改Context path,所以默认的是文件名test,这里如果更改了的话就需要写成自己更改的路径

到这里Servlet的第一个程序就已经完成了 

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

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

相关文章

LeetCode 75-02:字符串的最大公因子

前置知识&#xff1a;使用欧几里得算法求出最大公约数 func gcdOfStrings(str1 string, str2 string) string {if str1str2 ! str2str1 {return ""}return str1[:gcd(len(str1), len(str2))] }func gcd(a, b int)int{if b 0{return a}return gcd(b, a%b) }

【C语言精髓 之 指针】指针*、取地址、解引用*、引用

/*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff1a;转载需获得博主本人同意&#xff0c;且需标明转载源* language …

【postgresql 】 ERROR: “name“ is not supported as an alias

org.postgresql.util.PSQLException: ERROR: "name" is not supported as an alias 错误&#xff1a;不支持将“name”作为别名 SELECT real_name name FROM doc_user 加上 在关键词上加上 “” 示例&#xff1a; SELECT real_name "name" FROM do…

“Vue进阶:深入理解插值、指令、过滤器、计算属性和监听器“

目录 引言&#xff1a;Vue的插值Vue的指令Vue的过滤器Vue的计算属性和监听器vue购物车案例总结&#xff1a; 引言&#xff1a; Vue.js是一款流行的JavaScript框架&#xff0c;它提供了许多强大的功能来简化前端开发。在本篇博客中&#xff0c;我们将深入探讨Vue的一些高级特性…

Java项目:SSM的网上书城系统

作者主页&#xff1a;Java毕设网 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 一、相关文档 1、关于雅博书城在线系统的基本要求 &#xff08;1&#xff09;功能要求&#xff1a;可以管理个人中心、用户管理、图书分类管理、图书信息管理、…

Java 函数式编程思考 —— 授人以渔

引言 最近在使用函数式编程时&#xff0c;突然有了一点心得体会&#xff0c;简单说&#xff0c;用好了函数式编程&#xff0c;可以极大的实现方法调用的解耦&#xff0c;业务逻辑高度内聚&#xff0c;同时减少不必要的分支语句&#xff08;if-else&#xff09;。 一、函数式编…

clickhouse学习之路----clickhouse的特点及安装

clickhouse学习笔记 反正都有学不完的技术&#xff0c;不如就学一学clickhouse吧 文章目录 clickhouse学习笔记clickhouse的特点1.列式存储2. DBMS 的功能3.多样化引擎4.高吞吐写入能力5.数据分区与线程级并行 clickhouse安装1.关闭防火墙2.CentOS 取消打开文件数限制3.安装依…

Python 运行代码

一、Python运行代码 可以使用三种方式运行Python&#xff0c;如下&#xff1a; 1、交互式 通过命令行窗口进入 Python 并开始在交互式解释器中开始编写 Python 代码 2、命令行脚本 可以把代码放到文件中&#xff0c;通过python 文件名.py命令执行代码&#xff0c;如下&#xff…

机器学习——pca降维/交叉验证/网格交叉验证

1、pca降维&#xff1a;目的是提升模型训练速度 定义&#xff1a; 使用方法&#xff1a;给训练数据或者测试数据进行降维处理 给训练数据降维 给测试数据降维&#xff1a;这里1就要用transform&#xff0c;而不是fit_transform&#xff0c;因为之前训练数据降维时特征已经确定…

构建基于neo4j知识图谱、elasticsearch全文检索的数字知识库

前言&#xff1a; 在数字化时代&#xff0c;知识库的建设正逐渐成为企业、学术机构和个人的重要资产。本文将介绍如何使用neo4j和elasticsearch这两种强大的数据库技术来构建知识库&#xff0c;并对其进行比较和探讨。 技术栈&#xff1a; springbootvueneo4jelasticsearch…

【每日一题】1993. 树上的操作

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;深度优先搜索 写在最后 Tag 【深度优先搜索】【树】【设计数据结构】【2023-09-23】 题目来源 1993. 树上的操作 题目解读 本题是一个设计类的题目&#xff0c;对于设计类的题目就一步步的实现题目要求的成员方法即可…

【ACDC数据集】:预处理ACDC心脏3D MRI影像数据集到VOC数据集格式,nii转为jpg,label转为png

【Segment Anything Model】做分割的专栏链接&#xff0c;欢迎来学习。 【博主微信】cvxiaoyixiao 本专栏为公开数据集的预处理&#xff0c;持续更新中。 文章目录 1️⃣ ACDC数据集介绍2️⃣ ACDC数据集样例 3️⃣ 预处理ACDC目标 4️⃣ 处理结果样图 5️⃣ 代码 6️⃣ 划分测…

Maven高级---分模块设计,继承(继承关系/版本锁定/自定义属性)

目录 分模块设计 继承与聚合 继承关系 ​案例​ 版本锁定 自定义属性/引用属性 分模块设计 把一个项目拆分成不同的模块 我们可以把原来一个项目包中的东西单独提出来作为一个模块,也是解耦的思想 然后我们可以通过引入依赖的方式将这两个模块引入,如下 继承与聚合 继…

xxe攻击(XML外部实体)

1.定义 XML用于标记电子文件使其具有结构性的标记语言&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义&#xff08;可选&#xff09;、文档元素。 http://www.w3school.com.…

初识操作系统

目录 一.操作系统的概念 二.正确理解“管理” 三.操作系统对硬件进行管理 四.系统调用接口 五.用户操作接口 一.操作系统的概念 操作系统是一款进行软硬件资源管理的软件 现在我们知道了操作系统的概念了&#xff0c;那么为什么要有操作系统呢&#xff1f; 操作系统将软…

李宏毅hw-9:Explainable ML

——欲速则不达&#xff0c;我已经很幸运了&#xff0c;只要珍惜这份幸运就好了&#xff0c;不必患得患失&#xff0c;慢慢来。 ----查漏补缺&#xff1a; 1.关于这个os.listdir的使用 2.从‘num_文件名.jpg’中提取出数值&#xff1a; 3.slic图像分割标记函数的作用&#xf…

光电探测器怎么选

光电探测器&#xff0c;也称为PD&#xff08;photodetector&#xff09; 基本原理是&#xff0c;光信号进入光电探测器转换为电压信号&#xff0c;这个电压信号会很弱&#xff0c;微伏或者毫伏级别。 所以PD分为带放大和不带放大 带放大呢&#xff0c;是因为信号太弱&#xf…

Vue系列(二)之 基础语法上篇【插值,指令,过滤器,计算属性监听属性】以及购物车实现

目录 一. 插值 1.1 文本 1.2 原始HTML 1.3 属性 1.4 表达式 二. 指令 2.1 v-if/v-else-if/v-else指令 2.2 v-show指令 2.3 v-for指令 2.4 下拉框/复选框 2.5 动态参数 三. 过滤器 3.1 局部过滤器基本应用 3.2 局部过滤器串行使用 3.3 局部过滤器传参 3.4 全局过…

QT学习之创建项目

1、添加快捷键到桌面 找到所在安装路径Qt5.14.1\Tools\QtCreator\bin添加至桌面 双击后打开 2、创建项目 点击下一步 再点击下一步 下一步 当前暂时选择32位&#xff0c;之后点击完成 3、进入编辑页面并运行 运行快捷键&#xff1a;CtrlR 运行界面点击按钮&#xff1a; 运行…