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

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 {@Overrideprotected 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 {@Overrideprotected 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.rhkb.cn/news/189606.html

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

相关文章

基于SpringBoot+Vue的在线学习平台系统

基于SpringBootVue的在线学习平台系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 用户界面 登录界面 管理员界面 摘要 本文设计并实现了一套基于Spri…

计算机毕业设计选题推荐-校园交流平台微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

什么是代理IP池?如何判断IP池优劣?

代理池充当多个代理服务器的存储库&#xff0c;提供在线安全和匿名层。代理池允许用户抓取数据、访问受限制的内容以及执行其他在线任务&#xff0c;而无需担心被检测或阻止的风险。代理池为各种在线活动&#xff08;例如网页抓取、安全浏览等&#xff09;提高后勤保障。 读完…

ubuntu下tensorrt环境配置

文章目录 一、Ubuntu18.04环境配置1.1 安装工具链和opencv1.2 安装Nvidia相关库1.2.1 安装Nvidia显卡驱动1.2.2 安装 cuda11.31.2.3 安装 cudnn8.21.2.4 下载 tensorrt8.4.2.4 二、编写CMakeLists.txt三、TensorRT系列教程 一、Ubuntu18.04环境配置 教程同样适用与ubuntu22.04…

2023.11.13 hive数据仓库之分区表与分桶表操作,与复杂类型的运用

目录 0.hadoop hive的文档 1.一级分区表 2.一级分区表练习2 3.创建多级分区表 4.分区表操作 5.分桶表 6. 分桶表进行排序 7.分桶的原理 8.hive的复杂类型 9.array类型: 又叫数组类型,存储同类型的单数据的集合 10.struct类型: 又叫结构类型,可以存储不同类型单数据的集合…

按键编程 pal库和标准库

按钮的电路设计 电路的搭建 原理与编程 创建了两个变量 用来捕捉按键的状态 先让两个变量都为1 previous和current都为1 &#xff08;按键没按下&#xff09; 然后让current去捕捉按键的状态通过读gpioA的pin0 如果为0就是按键按下 如果为1就是按键没按下 然后赋值给current …

asp.net core weapi 结合identity完成登录/注册/角色/权限分配

1.安装所需要的nuget包 <PackageReference Include"Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version"6.0.24" /><PackageReference Include"Microsoft.EntityFrameworkCore" Version"6.0.24" /><PackageR…

layui 表格(table)合计 取整数

第一步 开启合计行 是否开启合计行区域 table.render({elem: #myTable, url: ../baidui/, page: true, cellMinWidth: 100,totalRow:true,cols: [[ //表头//{ type: checkbox },{ type: checkbox,totalRowText: "合计" },//合计行区域{ field: id, align: center,…

改进YOLO系列 | YOLOv5/v7 引入Super Token Sampling ViT | 《CVPR 2023 最新论文》

论文地址:https://arxiv.org/abs/2211.11167 代码地址:https://github.com/hhb072/STViT 视觉变换器已经在许多视觉任务中取得了令人印象深刻的性能。然而,它在捕捉浅层的局部特征时可能会受到高度冗余的影响。因此,引入了局部自注意力或早期卷积,这些方法牺牲了捕捉长距…

js案例:打地鼠游戏(打灰太狼)

效果预览图 游戏规则 当灰太狼出现的时候鼠标左键点击灰太狼加10分&#xff0c;小灰灰出现的时候鼠标左键点小灰灰击减10分&#xff0c;不点击不减分不加分。 整体思路 1.把获取背景图片中每个地洞的位置&#xff0c;把所有位置放到一个数组中。 2.封装随机数函数&#xff0c;随…

CnosDB 在最近新发布的 2.4.0 版本中增加对时空函数的支持。

CnosDB 在最近新发布的 2.4.0 版本中增加对时空函数的支持。 概述 时空函数是一种用于描述时空结构和演化的函数。它在物理学、数学和计算机科学等领域中都有广泛的应用。时空函数可以描述物体在时空中的位置、速度、加速度以及其他相关属性。 用法 CnosDB 将使用一种全新的…

【ATTCK】MITRE Caldera - 测试数据泄露技巧

CALDERA是一个由python语言编写的红蓝对抗工具&#xff08;攻击模拟工具&#xff09;。它是MITRE公司发起的一个研究项目&#xff0c;该工具的攻击流程是建立在ATT&CK攻击行为模型和知识库之上的&#xff0c;能够较真实地APT攻击行为模式。 通过CALDERA工具&#xff0c;安全…

几种解决mfc140.dll文件缺失的方法,电脑提示mfc140.dll怎么办

电脑提示mfc140.dll缺失&#xff0c;如果你不去处理的话&#xff0c;那么你的程序游戏什么都是启动不了的&#xff0c;如果你想知道有什么方法可以解决那么可以参考这篇文章进行解决&#xff0c;今天给大家几种解决mfc140.dll文件缺失的方法。电脑提示mfc140.dll也不用担心解决…

Redis Java 开发简单示例

文章目录 一、概述二、Jedis 开发示例2.1 导入 maven 依赖2.2 使用连接池读写2.3 使用集群读写2.4 完整示例代码2.5 测试集群的搭建 三、Lettuce 开发示例3.1 导入 maven 依赖3.2 读写数据 四、Spring Boot Redis 开发示例4.1 导入 maven 依赖4.2 配置Redis服务地址4.3 基于 Re…

智慧城市数据中台建设方案:PPT全文51页,附下载

关键词&#xff1a;智慧城市解决方案&#xff0c;数据中台解决方案&#xff0c;智慧城市建设&#xff0c;数据中台技术架构&#xff0c;数据中台建设 一、智慧城市数据中台建设背景 智慧城市数据中台是在城市数字化转型和智能化升级的背景下提出的&#xff0c;旨在实现城市数…

WebSocket网络协议

二十六、WebSocket 26.1 介绍 WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并进行双向数据传输。 HHTP协议和WebSocket协议对比&#xff…

基于LDA主题分析的《老友记》情景喜剧数据集的建模分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

外星人笔记本键盘USB协议逆向

前言 我朋友一台 dell g16 购买时直接安装了linux系统&#xff0c;但是linux上没有官方的键盘控制中心&#xff0c;所以无法控制键盘灯光&#xff0c;于是我就想着能不能逆向一下键盘的协议&#xff0c;然后自己写一个控制键盘灯光的程序。我自己的外星人笔记本是m16&#xff…

Django(三、数据的增删改查、Django生命周期流程图)

文章目录 一、 基于ORM进行的CURDuser_list&#xff1a;作为主页使用路由文件urls.py配置如下&#xff1a;add.html&#xff1a;用于新增用户的数据页add页面视图函数如下:edit.html&#xff1a;修改数据的页面那么来总结一下上序所操作所用到的内容。 导入已存在的表其方式有两…

Unity 使用INI文件存储数据或配置参数预设

法1&#xff1a;调用外部Capi库 具体使用&#xff1a; public class Ini{//读取INI文件需要调用C的APP[System.Runtime.InteropServices.DllImport("kernel32")]private static extern long WritePrivateProfileString(string section, string key, string val, st…