初识-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 {
    @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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC简介及使用

文章目录 前言一、WebRTC 简介1、webrtc 是什么2、webrtc 可以做什么3、数据传输需要些什么4、SDP 协议5、STUN6、TURN7、ICE 二、WebRTC 整体框架三、WebRTC 功能模块1、视频相关①、视频采集---video_capture②、视频编解码---video_coding③、视频加密---video_engine_encry…

【ElasticSearch】学习使用DSL和RestClient编写查询语句

文章目录 DSL和RestClient的学习前言1、DSL查询文档1.1 查询分类1.2 全文检索查询1.21 全文检索概述1.2.2 基本使用 1.3 精确查询1.3.1 term查询1.3.2 range查询 1.4 地理坐标查询1.4.1 geo_bounding_box查询1.4.2 geo_distance查询 1.5 复合查询1.5.1 常见相关性算法1.5.2 算分…

ArcGIS进阶:栅格计算器里的Con函数使用方法

本实验操作为水土保持功能重要性评价&#xff1a; 所用到的数据包括&#xff1a;土地利用类型数据&#xff08;矢量&#xff09;、植被覆盖度数据&#xff08;矢量&#xff09;和地形坡度数据&#xff08;栅格&#xff09;。 由于实验数据较少&#xff0c;其思路也较为简单&a…

讯飞录音笔误删除WAV录音文件恢复成功案例

讯飞录音笔删除恢复的难点 难点一&#xff0c;电脑无法识别为普通电脑盘符。这个是厂家系统设计上的问题&#xff0c;本博文不涉及。 难点二&#xff0c;一般恢复后播放有间隙性噪音问题。这个是数据碎片问题&#xff0c;是本博文的关注点。 大多数情况下&#xff0c;讯飞录…

钉钉统计部门个人请假次数go

前言 最近小组需要统计部门各种请假次数&#xff0c;写了一个方法&#xff0c;第一次实战中用到递归函数&#xff0c;简单记录一下。 效果展示 这些数据不需要返回json&#xff0c;这里这样是为了方便测试。可以通过这些数据完成其它的操作。 功能实现 钉钉服务端调试工具A…

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

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

【论文笔记】Denoising Diffusion Probabilistic Models

Pre Knowledge 1.条件概率的一般形式 P ( A , B ) P ( B ∣ A ) P ( A ) P(A,B)P(B|A)P(A) P(A,B)P(B∣A)P(A) P ( A , B , C ) P ( C ∣ B , A ) P ( B , A ) P ( C ∣ B , A ) P ( B ∣ A ) P ( A ) P(A,B,C)P(C|B,A)P(B,A)P(C|B,A)P(B|A)P(A) P(A,B,C)P(C∣B,A)P(B,A)P…

[游戏中的图形学实时渲染技术] Part1 实时阴影技术

原理篇&#xff1a; 常见的渲染方程如下&#xff1a; 在不考虑自发光项与考虑阴影对于着色结果的影响之后可以将方程变化为如下形式&#xff1a; 如果射线在到达光源前击中了其他物体时&#xff0c;就认为这条来自光源的光线对着色点没有贡献。 利用上述渲染方程进行正确的着…

使用MybatisPlus时出现的java.lang.NullPointerException异常~

错误描述如下所示&#xff1a; 错误原因&#xff1a;Junit的导包错误 单元测试的包有如下所示两个 我们应该根据springboot的版本进行选择&#xff0c; 在Spring Boot 2.2.X以后使用import org.junit.jupiter.api.Test Junit5 在Spring Boot 2.2.x之前使用import org.junit.T…

基于SSM的校园二手物品交易平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

高防IP是什么?有什么优势?

一.高防IP的概念 高防IP是指高防机房所提供的IP段&#xff0c;一种付费增值服务&#xff0c;主要是针对网络中的DDoS攻击进行保护。用户可以通过配置高防IP&#xff0c;把域名解析到高防IP上&#xff0c;引流攻击流量&#xff0c;确保源站的稳定可靠。 二.高防IP的原理 高防I…

k8s 裸金属集群部署metalLB软负载均衡 —— 筑梦之路

metalLB 官方网站 Repo&#xff1a;https://github.com/metallb/metallb 官网&#xff1a;https://metallb.universe.tf/installation metalLB解决什么问题&#xff1f; MetalLB 是一个用于裸机 Kubernetes 集群的负载均衡器实现&#xff0c;使用标准路由协议。 k8s 并没有为裸…

CSS特效006:绘制不断跳动的心形

css实战中&#xff0c;怎么绘制不断跳动的心形呢&#xff1f; 绘图的时候主要用到了transform: rotate(-45deg); transform-origin: 0 100%; transform: rotate(45deg); transform-origin: 100% 100%; 动画使用keyframes 时间上为infinite。 效果图 源代码 /* * Author: 大剑…

两数之和问题

题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺…

[头歌]第1关:动态学生信息管理

题目&#xff1a; C 面向对象 _ STL 的应用 (educoder.net) 考点&#xff1a; 1.自定义排序 bool cmp 2.如何使用find和erase来找到学生类里面的指定姓名的人并将其从动态数组中删除。 3.find要找的是学生类里面的成员变量而非单纯的直接找值&#xff0c;应如何实现 &…

dcat admin 各种问题

样式问题 如何根据条件给表格数据栏添加背景色 use Illuminate\Support\Collection;protected function grid(){return Grid::make(new BookArticle(), function (Grid $grid) {... 其他代码// Collection的完整路径&#xff1a;Illuminate\Support\Collection;$grid->row…

Python 使用tkinter复刻Windows记事本UI和菜单功能(二)

上一篇&#xff1a;Python tkinter实现复刻Windows记事本UI和菜单的文本编辑器&#xff08;一&#xff09;-CSDN博客 下一篇&#xff1a;敬请耐心等待&#xff0c;如发现BUG以及建议&#xff0c;请在评论区发表&#xff0c;谢谢&#xff01; 相对上一篇文章&#xff0c;本篇文…

数字化仪的超声波应用

超声波是频率大于人类听觉范围上限的声学声压&#xff08;声学&#xff09;波。超声波设备的工作频率为 20 kHz 至几千 MHz。表 1 总结了一些更常见的超声波应用的特征。每个应用中使用的频率范围都反映了实际情况下的平衡。提高工作频率可以通过提高分辨率来检测较小的伪影&am…

JAVA集合学习

一、结构 List和Set继承了Collection接口&#xff0c;Collection继承了Iterable Object类是所有类的根类&#xff0c;包括集合类&#xff0c;集合类中的元素通常是对象&#xff0c;继承了Object类中的一些基本方法&#xff0c;例如toString()、equals()、hashCode()。 Collect…

时间序列预测实战(九)PyTorch实现LSTM-ARIMA融合移动平均进行长期预测

一、本文介绍 本文带来的是利用传统时间序列预测模型ARIMA(注意&#xff1a;ARIMA模型不属于机器学习)和利用PyTorch实现深度学习模型LSTM进行融合进行预测&#xff0c;主要思想是->先利用ARIMA先和移动平均结合处理数据的线性部分&#xff08;例如趋势和季节性&#xff09…