初识-Servlet (第一个 Servlet 程序详解)

news2025/1/12 11:57:26

Servlet 是什么?

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

静态页面就只是单纯的 html
动态页面则是 html + 数据


第一个 Servlet 程序

我们写一个 hello world
预期写一个 Servlet 程序, 部署到 Tomcat 上
通过浏览器访问得到 hello world

下面我们就开始史上最难 hello world

这个程序分为7个步骤

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

1. 创建项目

创建一个 maven 项目
>maven 是个"工程管理"工具
1. 规范目录结构
2. 管理依赖(使用啥第三方库,都给处理好)
3. 构建
4. 打包
5. 测试

我们现在主要使用 管理依赖和打包功能
首先打开 IDEA 创建项目
在这里插入图片描述
创建 maven 项目
在这里插入图片描述

在这里插入图片描述

2. 引入依赖

servlet 对应的 jar包

meven 仓库

在这里插入图片描述
在这里插入图片描述
这里使用 3.1.0 版本, 和 tomcat 8 是匹配的.

在这里插入图片描述
把 Meven 标签页下的代码 复制粘贴到 pom.xml 中

在顶级便签下, 创建一个 dependencies 便签, 把代码粘贴到 dependencies 便签下.
如果有多个依赖, 都往便签里依次粘贴即可

在这里插入图片描述

我们首次粘贴的话, 可见上面的代码有红的, 红色说明还没下载完.
一般只要你粘贴进来, idea 的 Meven 就会自动触发依赖的下载, 下载完毕就不红了(下载只需一次)
如果粘贴进来, 半天没动, 我们可以手动刷新一下.

在这里插入图片描述

到红色消失, 这个依赖就引入完成了.

3. 创建目录

虽然 maven 已经帮我们自动创建了一些目录, 但是还不够, 此处是需要使用 maven 开发一个 web 程序, 还需要别的目录

  1. 在 main 目录下(和java, resources 并列) 创建一个 webapp 目录
    在这里插入图片描述
    在这里插入图片描述
  2. 在 webapp 下创建 WEB-INF 目录

在这里插入图片描述

  1. 再在 WEB-INF 目录下创建一个 web.xml 文件
    在这里插入图片描述
    一定注意这里的目录名字和结构, 都不能错

  2. 给 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>

我们写的这些代码没有main方法, 这个程序就相当于是车厢, tomcat 是车头, 我们把写好的 servlet 程序扔到 webapps 目录下, 就相当于把车厢挂在车头上了.
tomcat 如何识别呢?
webapps 目录下,判断哪些是要拉着跑的车厢, 哪些是不需要拉着跑的目录,就是靠目录下的 WEB_INF / web.xml

4. 编写代码

首先在 java 目录下, 创建一个类.
在这里插入图片描述

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // 这个代码一定要删掉, 父类的这个方法只是返回一个错误页面.
       // super.doGet(req, resp);
    }
}

继承的这个类是 Servlet api 里提供的现成的类, 写 Servlet 代码一般都是继承这个 HttpServlet.

在这里插入图片描述

我们写的这个 doGet 方法, 不需要我们手动调用, 而是要交给 Tomcat 来调用, Tomcat 收到 get 方法, 就会触发doGet 方法.
Tomcat 会构造好两个参数, req 和 resp , req 是 TCP Socket 中读出来的字符串, 按照 HTTP 协议解析得到的对象, 这个对象里的属性就是和 HTTP 请求报文格式相对应的, 这个req 是个空的对象.
程序员就需要在 doGet 根据 req 结合自己的业务逻辑构造出一个 resp 对象来.

resp就相当于一个"输出型参数"

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 这个代码一定要删掉, 父类的这个方法只是返回一个错误页面.
        // super.doGet(req, resp);
        //这个打印是在 tomcat 的控制台打印
        System.out.println("hello would");
        // 要想把 Hello world 返回到客户端, 就需要使用以下代码
        // getWriter 会得到一个 writer 对象
        resp.getWriter().write("hello world");
    }
}

此时的 write 操作其实是往 resp 的 body 部分进行写入, 等 resp 对象整个构造好了, Tomcat 会统一转成 HTTP 响应的格式, 再写 Socket

@WebServlet(“/hello”) 这个注解的作用是把当前类, 和一个 HTTP 请求的路径关联起来.

doGet 是 Tomcat 收到 GET 请求的时候就会调用, 具体要不要调用 doGet 还得看当前 GET 请求的路径是啥, 不同的路径可以触发不同的代码(关联到不同的类上)

一个Servlet 程序中, 可以有很多 Servlet 类, 每个 Servlet 类都可以关联到不同的路径(对应到不同的资源)
因此此处的多个 Servlet 类就可以实现不同的功能.

5.打包程序

把程序编译好(得到一些 .class 文件), 再把这些.class 打成压缩包(war 包),

jar 包 只是一个普通的 java 程序
war 包是 Tomcat 专属的用来描述 webapp 的程序

一个 war 包就是一个webapp 程序
在这里插入图片描述
借助 meven 一点击即可

在这里插入图片描述

默认情况下, meven 打的是 jar 包, 我们需要的是 war 包, 需要微调一下 pom.xml.

在这里插入图片描述

在这里插入图片描述

这个便签描述了 打的 war 包的名字, 然后在进行打包就能得到我们要的 war 包

在这里插入图片描述

6. 部署程序

把 war 包拷贝到 Tomcat 的 webapps 目录下.

在这里插入图片描述

7. 验证程序

启动服务器
在这里插入图片描述

此时通过浏览器访问 http://127.0.0.1:8080/hello_servlet/hello

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

注意: URL 中的 PATH 分成两个部分, 其中 hello_servlet 为 Context Path, hello 为 Servlet Path

在这里插入图片描述

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

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

相关文章

图论12-无向带权图及实现

文章目录 带权图1.1带权图的实现1.2 完整代码 带权图 1.1带权图的实现 在无向无权图的基础上&#xff0c;增加边的权。 使用TreeMap存储边的权重。 遍历输入文件&#xff0c;创建TreeMap adj存储每个节点。每个输入的adj节点链接新的TreeMap&#xff0c;存储相邻的边和权重 …

时间序列预测实战(十二)DLinear模型实现滚动长期预测并可视化预测结果

官方论文地址->官方论文地址 官方代码地址->官方代码地址 个人修改代码->个人修改的代码已经上传CSDN免费下载 一、本文介绍 本文给大家带来是DLinear模型&#xff0c;DLinear是一种用于时间序列预测&#xff08;TSF&#xff09;的简单架构&#xff0c;DLinear的核…

Leetcode刷题详解—— 目标和

1. 题目链接&#xff1a;494. 目标和 2. 题目描述&#xff1a; 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可…

【计算机网络笔记】IP分片

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

有没有实时检测微信聊天图片的软件,只要微信收到了有二维码的图片就把它提取出来?

10-2 如果你有需要自动并且快速地把微信收到的二维码图片保存到指定文件夹的需求&#xff0c;那本文章非常适合你&#xff0c;本文章教你如何实现自动保存微信收到的二维码图片到你指定的文件夹中&#xff0c;助你快速扫码&#xff0c;比别人领先一步。 首先需要准备好的材料…

19 异步通知

一、异步通知 1. 异步通知简介 阻塞和非阻塞两种方式都是需要应用程序去主动查询设备的使用情况。 异步通知类似于驱动可以主动报告自己可以访问&#xff0c;应用程序获取信号后会从驱动设备中读取或写入数据。 异步通知最核心的就是信号&#xff1a; #define SIGHUP 1 /* 终…

openssl研发之base64编解码实例

一、base64编码介绍 Base64编码是一种将二进制数据转换成ASCII字符的编码方式。它主要用于在文本协议中传输二进制数据&#xff0c;例如电子邮件的附件、XML文档、JSON数据等。 Base64编码的特点如下&#xff1a; 字符集&#xff1a; Base64编码使用64个字符来表示二进制数据…

UPLAOD-LABS2

less7 任务 拿到一个shell服务器 提示 禁止上传所有可以解析的后缀 发现所有可以解析的后缀都被禁了 查看一下源代码 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists($UPLOAD_ADDR)) {$deny_ext array(".php",".php5&quo…

password game

目录 password game &#xff08;1-2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff09; &#xff08;5&#xff09; &#xff08;6&#xff09; &#xff08;7&#xff09; &#xff08;8&#xff09; &#xff08;9&#xff09; &#xff08;10&am…

CCF ChinaSoft 2023 论坛巡礼|机器人大模型与具身智能挑战赛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

第一百六十九回 如何修改NavigationBar的形状

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"如何修改按钮的形状"相关的内容&#xff0c;本章回中将介绍NavigationBar组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

【java进阶】集合的三种遍历(迭代器、增强for、Lambda)

目录 一、先谈集合&#xff1a; 二、单列集合的三种遍历方式 迭代器遍历 增强for遍历 Lambda表达式遍历 一、先谈集合&#xff1a; &#x1f525;那我们平常用for循环依赖下标遍历不行嘛&#xff0c;这就与集合的分类有关了。 集合的体系结构&#xff1a; collection是单…

我的前端笔记JS

js介绍 js是编程语音&#xff0c;之前学的html和css是标记语言 百度搜索mdn官网就可以 语法 输出、对话框、控制台日志、输入对话框 字面量 简单理解就是看到的内容是属于什么类型&#xff0c;例如1232&#xff0c;这个是属于数字字面量

【C++】this指针讲解超详细!!!

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

如何用 GPTs 构建自己的知识分身?(进阶篇)

&#xff08;注&#xff1a;本文为小报童精选文章&#xff0c;已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 有了这些改进&#xff0c;你可以快速判断 GPT 助手给出的答案是真实还是「幻觉」了。 问题 在《如何用自然语言 5 分钟构建个人知识库应用&am…

【Git】Git使用Gui图形化界面,Git中SSH协议,Idea集成Git

一&#xff0c;Git使用Gui图形化界面 1.1 Gui的简介 Gui &#xff08;Graphical User Interface&#xff09;指的是图形用户界面&#xff0c;也就是指使用图形化方式来协同人和计算机进行交互的一类程序。它与传统的命令行界面相比&#xff0c;更加直观、易用&#xff0c;用户…

MATLAB的编程与应用,匿名函数、嵌套函数、蒙特卡洛法的掌握与使用

目录 1.匿名函数 1.1.匿名函数的定义与分类 1.2.匿名函数在积分和优化中应用 2.嵌套函数 2.1.嵌套函数的定义与分类 2.2.嵌套函数彼此调用关系 2.3.嵌套函数在积分和微分中应用 3.微分和积分 4.蒙特卡洛法 4.1.圆周率的模拟 4.2.计算N重积分&#xff08;均匀分布&am…

Python与ArcGIS系列(一)ArcGIS中使用Python

目录 0 简述1 arcgis中的python窗口2 开始编写代码 0 简述 按照惯例&#xff0c;作为本系列专栏的第一篇&#xff0c;先简单地介绍下本系列文章的内容&#xff1a;通过python语言创建arcgis环境脚本、将脚本以工具箱形式存放在arcgis中、通过脚本自动执行地理处理、数据修复、…

Benchmarking Large Language Models in Retrieval-Augmented Generation-学习翻译

提检索增强生成中大型语言模型的基准测试文献学习 作者将在https://github.com/chen700564/RGB上发布本文的代码和RGB。 y ˇ \check{y} yˇ​ 文章目录 摘要IntroductionRelated workRetrieval-Augmented Generation BenchmarkRAG所需能力数据构建评估指标 ExperimentsSetting…

kubeadm部署k8s及高可用

目录 CNI 网络组件 1、flannel的功能 2、flannel的三种模式 3、flannel的UDP模式工作原理 4、flannel的VXLAN模式工作原理 5、Calico主要组成部分 6、calico的IPIP模式工作原理 7、calico的BGP模式工作原理 8、flannel 和 calico 的区别 Kubeadm部署k8s及高可用 1、…