Servlet —— Tomcat, 初学 Servlet 程序

news2024/9/21 2:38:30
JavaEE传送门

JavaEE

HTTP —— HTTP 响应详解, 构造 HTTP 请求

HTTPS —— HTTPS的加密方式


目录

  • Tomcat
  • Servlet
    • hello world
    • 创建项目
    • 引入 Servlet 依赖
    • 创建目录结构
    • 编写代码
      • doGet
    • 打包程序
    • 部署程序
    • 验证程序


Tomcat

Tomcat 是一个 HTTP 服务器

HTTP 客户端, 就是大家平时用到的浏览器.

HTTP 服务器, 需要开发实现一个服务器, 搭建网站的 “后端部分”.

开发实现一个服务器, 本质上就是写个 TCP socket 服务器. 但是比较麻烦, 有很多重复性工作.

业界就有一些大佬实现了一些现成的 HTTP 服务器, 我们进行开发网站, 就不必从头去写了, 只需要基于这些 HTTP 服务器, 进行二次开发即可.

下载Tomcat

简单介绍

webapps 中放的是我们想要部署的网站

就可以把前端和后端的代码拷贝到这个目录中.

每个目录都可以视为是一个 webapp (网站)

ROOT 目录

ROOT 目录里放的就是欢迎页面

启动 Tomcat, 双击 startup.bat

看到这个信息, 说明启动成功!

如果有问题, 可以把 bat 拖到 cmd 中运行, 查看报错信息是什么.

在浏览器上输入 127.0.0.1:8080

如果出现这样的页面, 说明 Tomcat 启动正常 (Tomcat 默认端口: 8080)

我们写一个 .html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <style>
        div {
            font-size: 40px;
            color: hotpink;
            font-weight: 500;
        }
    </style>
    <div>Gujiu ! !</div>
</body>
</html>

将其移动到 ROOT 中

在 127.0.0.1:8080 后面加上 /gujiu.html

这个页面就是通过 Tomcat 这个 http 服务器来获取到的.

既然都可以双击本地打开, 为什么还要通过 Tomcat 折腾一下?

  • 本地打开只能访问你自己电脑的.

  • 使用 Tomcat 可以通过网络访问到别人电脑的网页.

# 注意事项 #

我们如果把所有文件都直接放到 ROOT 里, 就会弄得很乱, 一般我们都会新建一个文件夹.

gujiu.html 放到 Gujiu 下. 输入如下地址.


Servlet

Servlet 就是 Tomcat 给程序员提供的进行二次开发的 API, 学了这些 API 就可以比较方便的写出一个网站的后端程序了.

动态页面 vs 静态页面

  • 静态页面: 页面的内容, 是固定 (以文件的形式, 静静的躺在你的硬盘的指定目录中).

    无论什么时候, 无论谁来访问,得到的页面效果, 都一样.

  • 动态页面: 不是一个真实的硬盘的文件, 而是通过代码在内存中构造出一个 “虚拟的资源”.

    就可以根据你访问的时间的不同, 访问的人的不同, 访问时带有的参数不同, 就可以构造出不同的页面来了.

  • 静态页面部分拷贝到 webapps 里就行; 动态页面就需要基于 servlet.


hello world

写一个 Servlethello world

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

这里和 JDBC 差不多, 都是固定套路


创建项目

创建一个 maven 项目

目录结构

小知识:

maven 是一个构建工具 (build,包括不限于: 编译, 打包, 部署)

# 之前写代码,都是直接在 idea 中, 点击 main 方法前的 三角号, 就自动编译程序

# 这种方式针对一些比较简单的程序还好, 如果是一些更复杂的程序, 尤其是有多个模块, 并且互相依赖. 这时我们直接点运行就没有那么容易了.

比如 A 依赖 B, B 依赖 C.

此时你要想编译运行 A, 就必须先编译运行 B, 要想编译运行 B, 就需要先编译运行 C.

# 构建工具, 就是为了解决这个问题, 使我们在开发比较复杂的项目的时候, 也可以比较方便的进行编译和打包操作

# 我们这里使用 maven 主要就是借助 maven 进行编译, 打包, 管理依赖…


引入 Servlet 依赖

Servlet 不是 Java 标准库自带的, 要想使用, 就需要额外的下载安装, 并引入到项目中.

maven 的一个核心功能, 就是能够自动的管理依赖, 就会把咱们使用的库中依赖的东西, 自动从中央仓库中下载下来

中央仓库链接

选择 3.1.0 版本.

# 注意 # servlet 3.1.0 和 Tomcat 8.5 和 jdk 8 是配套的.

选择 maven 把 maven 中的这段内容复制出来, 然后粘贴到 pom.xml 的 <project> 中

复制的内容, 粘贴到 \<dependencies> 这个标签中

<dependencies>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

# 注意事项 #

拷贝过来, 可能是标红的.

当我们把他拷贝过来, idea 就会自动根据你这里写的内容, 从中央仓库上下载依赖.

在这个依赖下载好之前, 这里都是标红的, 在下载过程中, 我们需要耐心等待.

如果等了很久, 还是标红的, 就可以尝试手动刷新一下. (在 idea 的最右侧边边上, 有一个 maven, 鼠标点击 maven )



创建目录结构

虽然 maven 已经给我们创建出了一些目录了, 但是还不够

我们需要搞得是一个 符合 Tomcat 要求的目录结果

我们还需要再 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 中的动态资源.

这里的作用: 验证 + 补全

这里标红, 只是影响到 idea 对于 web.xml 的验证和补全

可以 alt + enter 使其不再标红.


编写代码

# 要把代码放到 java 目录下, 我们创建一个 helloServlet

# 我们先要 extends HttpServlet 这个类, 但是这里有时会标红.

这个类来自于, 刚才通过 maven 下载的那个 servletjar 包. 报红的原因可能有:

  1. 之前下载的有问题
  2. 没有正确的导入到

解决方法: 点击刷新按钮尝试

doGet

# 重写 doGet 方法

public class helloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //注意, 自动生成的这个调用父类方法的代码, 一定一定要注释掉, 不然会出问题!!
        //super.doGet(req, resp);
    }
}

doGet 方法 就是 HttpServlet 父类里已经包含的方法了, 此处是需要 Overide 父类的方法

doGet 表示: 当前 Tomcat 在收到某些 GET 请求的时候, 会调用这个 doGet 方法.

此处 doGet 做的工作, 就是 “根据请求, 计算响应”.

doGet 就需要根据 req 里的一些数据 + 业务逻辑构造生成一个完整的 resp 对象.

再进一步, tomcat 就把 resp 对象转成一个 HTTP 响应报文.

典型的服务器要做三件事:

  1. 读取请求并解析
  2. 根据请求计算响应
  3. 把响应结果返回给客户端

1 和 3 都是固定的套路, 2 则是我们需要实现的业务逻辑 (可能比较简单, 也可能非常复杂)

# 编写如下代码

@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");
        // 还可以给客户端返回这个 hello
        resp.getWriter().write("hello");
    }
}

当我们发送的请求是 GET 路径是 /hello .此时 Tomcat 才会调用到这里的 doGet 方法.

Tomcat 可以让你关联上很多路径.

可以给请求中的不同路径, 关联上不同的类, 也就是执行了不同的方法了.

小知识:

/hello 其实就是一个 “虚拟的资源”.

硬盘上目录中是没有这个 /hello 文件,浏览器访问这个路径的资源, 就通过 servlet 代码, 直接返回了一个 hello 字符串.


打包程序

当前写的 Servlet 代码, 没有 main 方法. 我们要想程序运行, 就需要 打包 + 部署程序.

单击右侧的 maven, 双击 package 打包.

打包:

  1. 把缺失的依赖给下载好
  2. 然后编译所有 .java 文件得到一堆 .class 文件
  3. 再把这些 .class 给打包到一个压缩包中

当我们看到 BUILD SUCCESS 这个提示, 就是打包成功了.

这时我们可以看到这里多了一个 .jar 文件.

# 注意事项 #

虽然我们打出来 jar 包, 但是 Tomcat 不认! !

Tomcat 要求的压缩包格式, 是 war 包

最主要的区别, war 包, 会把整个 webapp 目录都给打进去, 包括 web.xml ,以及未来放的一些静态 html, css ...

这时我们需要修改 pom.xml , 在 <project> 中写入这样一段代码:

<packaging>war</packaging>
<build>
    // war 包的名字
    <finalName>helloServlet</finalName>
</build>

这时再次双击 package, 打包完毕后, 我们再看左侧, 多了一个 helloServlet.war 文件

在这里插入图片描述


部署程序

war 包, 拷贝到 Tomcat 的 webapps 中.

重新启动 Tomcat 服务器. Tomcat 就会加载这里的 war 包.

我们看到这里多了一个 helloServlet 文件. 加载操作就是把这个 war 解压缩成目录了.


验证程序

通过浏览器, 构造一个HTTP 请求, 访问 Tomcat 服务器.

我们打开一个浏览器, 在地址栏上输入 http://127.0.0.1:8080/helloServlet/hello

此时在浏览器的页面上, 和 Tomcat 日志中, 都出现了 hello 这个字符串.

  • 第一级目录来指定 webapps 中的目录
  • 第二级目录来指定 第一级目录下的文件

浏览器发送一个 HTTP 请求给 Tomcat 服务器. (GET /helloServlet/hello)

Tomcat 服务器就会解析请求

  1. 获取到 URL 中的第一级路径, /helloServlet 确定一个 webapp

  2. Tomcat 找到 helloServlet 目录之后, 就会加载里面的类, 尤其是重点去识别出 @WebServlet 注解修饰的类

    就会取出 URL 中的第二级路径 /hello .

    然后就在 @WebServlet 注释中, 找到名字为 /hello 的类.

    找到类之后, 创建实例 (只会创建一次. 如果之前创建过了, 就直接复用上次的实例)

  3. 再解析出 HTTP 请求的方法 “GET”, 取出 GET 之后, 就可以根据 HTTP 方法来调用对应的 servlet 中的方法:

    GET 请求就调用 doGet 方法

    POST 请求就调用 doPost 方法

    PUT 请求就调用 doPut 方法

    DELETE 请求就调用 doDelete 方法 …

    同时 Tomcat 还会构造出 HttpServletRequest 对象和 HttpServletResponse 对象


🌷(( ◞•̀д•́)◞⚔◟(•̀д•́◟ ))🌷

以上就是今天要讲的内容了,希望对大家有所帮助,如果有问题欢迎评论指出,会积极改正!!

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

这里是Gujiu吖!!感谢你看到这里🌬
祝今天的你也
开心满怀,笑容常在。

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

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

相关文章

大数据hadoop_HDFS概述(1)

文章目录1. HDFS概述1.1 HDFS背景1.2 定义2. HDFS优缺点2.1 优点2.2 缺点3. HDFS架构4. HDFS文件块大小1. HDFS概述 1.1 HDFS背景 面对今天的互联网公司&#xff0c;每天都会有上亿次的用户访问量&#xff0c;用户每进行一次操作&#xff0c;都会产生数据&#xff0c;面对传统…

Android入门第41天-Android中的Service(bindService)

介绍 在前一天我们介绍了Android中有两种启动Service的方法。并擅述了startService和bindService的区别。同时我们着重讲了startService。 因此今天我们就来讲bindService。bindService大家可以认为它是和Android的一个共生体。即这个service所属的activity如果消亡那么bindS…

Docker涉及的Linux命名空间、CGroups

概述 Linux的NameSpace介绍 很多编程语言都包含了命名空间的概念&#xff0c;我们可以认为命名空间是一种封装&#xff0c;封装本身实现了代码的隔离。在操作系统中命名空间提供的是系统资源的隔离&#xff0c;其中系统资源包括了&#xff1a;进程、网络、文件系统…实际上li…

《模拟电子技术》半导体原理部分笔记

《模拟电子技术》笔记绪论第一章 常用半导体器件第二章 基本放大电路绪论 有的人把三极管的出现作为电子技术工业革命的开始标志学习架构&#xff1a;半导体器件&#xff08;二极管、三极管、场效应晶体管&#xff09;、基于上述管的放大电路、集成运算放大器、放大电路的频率…

第11章 初识IdentityServer4

1 构建IdentityServer4 服务 1.1 通过配置类配置类(Config)实例化IdentityServer4中间件 using IdentityServer4.Models; namespace BuilderServer { /// <summary> /// 【配置--类】 /// <remarks> /// 摘要&#xff1a; /// 通过该中类的方法成员&#xff…

如何给firefox和google chrome鼠标手势

背景 已经习惯了有鼠标手势&#xff0c;因为一天到晚都在浏览器上查询资料&#xff0c;所以必须把这个鼠标手势设置好。 firefox 搜索Foxy Gestures然后安装 google chrome crxMouse Chrome 点击google浏览器上的扩展程序图标&#xff0c;然后点击管理扩展程序&#xff1a…

游泳耳机哪个牌子好、分享几款游泳听音乐最好的耳机推荐

如今,水上运动爱好者越来越多了,无论是游泳,还是冲浪早已成为了我们很多人经常参加的运动项目。不过他们都抱怨过类似的问题——可以在水上运动中使用的无线耳机实在是太少了。防水性能达不到可游泳级别,不带内存需要配备手机使用,这些都是造成耳机无法在水上使用的原因。今天小…

【matplotlib】1-使用函数绘制图表

文章目录使用函数绘制图表1.绘制matplotlib图表组成元素的主要函数2.准备数据3.函数用法3.1函数plot()--展现变量的趋势变化3.2函数scatter()--寻找变量之间的关系3.3函数xlim()--设置x轴的数值显示范围3.4函数xlabel()--设置x轴的标签文本3.5 函数grid()--绘制刻度线的网格线3…

Kong(三)Konga UI安装和使用

一 konga 的github地址 konga安装参考 ① Kong 可视化UI 选择 官方kong-dashboard 1&#xff09;收费&#xff1a;当前kong的社区版是没有dashboard的,但是付费的企业版是有带的2&#xff09;kong-dashboard最新版本v3.6.0,只支持到kongv0.14.x,对于更高的kong版本,功能支…

SpringBoot整合RabbitMQ,实现单机抢票系统

MQ全称为Message Queue, 消息队列&#xff08;MQ&#xff09;是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表&#xff0c;一端往消息队列中不断写入消息&#xff0c;而另一端则可以读取队列中的消息。 消息中间件最主要的作用是解耦&#xff0c;中间…

C与C++中的常用符号与标点用法详解及实例

C与C中的常用符号与标点符号有&#xff1a;“”、“-”、“*”、 “/”、“%”、“&”、“\”、“|”、“~”、“^”、“&”、“|”、“&#xff01;”、“>”、“<”、""、“#”、“&#xff1f;”、“&#xff0c;”、“.”、“&#xff1a;”、单引…

d3rlpy离线强化学习算法库安装及使用

GitHub - takuseno/d3rlpy: An offline deep reinforcement learning library d3rlpy&#xff0c;离线强化学习算法库 我装在windows下用anaconda&#xff0c;按照官网教程 conda install -c conda-forge d3rlpy 第一次安装报错CondaSSLError: OpenSSL appears to be unavaila…

Kubernetes的service详解

文章目录Service介绍Service类型Service使用ClusterIP类型的ServiceHeadLiness类型的ServiceNodePort类型的ServiceLoadBalancer类型的ServiceExternalName类型的ServiceIngress介绍Service介绍 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的i…

程序人生 | 与足球共舞的火柴人(致敬格拉利什,赋予足球更深的意义)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

从0开始学游戏开发

对于开发而言&#xff0c;了解一下如何从零开始做游戏是一个非常有趣且有益的过程(并不)。这里我先以大家对游戏开发一无所知作为前提&#xff0c;以一个简单的游戏开发作为.从0开始学游戏开发。 写在最前面 对于开发而言&#xff0c;了解一下如何从零开始做游戏是一个非常有趣…

Twice-JavaSE01

狂神学习路线&#xff1a; 今天又重头开始复习Java了&#xff0c;不顾一切往前冲吧。 空常量null不能直接输出。其他几种基本数据类型可以直接输出。 定义变量时要给赋值才行&#xff0c;浮点型默认为double,float类型后要加f. 注意&#xff1a;byte和short不能直接跟char做…

【强化学习论文合集 | 2019年合集】一. ICML-2019 强化学习论文

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

C++-容器:string使用介绍(非常全面,详细)

string的初始化 1.常见初始化方式 string对象的初始化和普通类型变量的初始化基本相同&#xff0c;只是string作为类&#xff0c;还有类的一些特性&#xff1a;使用构造函数初始化。如下表&#xff0c;第2 4 6条是作为类才有的初始化方式&#xff1a; 当然&#xff0c;也可以…

MySQL数据库之事务

MySQL数据库之事务一、事务的概念二、事务的ACID特点2.1 原子性&#xff08;保证事务的整体性&#xff09;2.2 一致性&#xff08;保证数据的完整性&#xff09;2.3 隔离性2.4 持久性三、事务控制语句3.1 测试begin和commit&#xff08;开始事务和提交事务&#xff09;begin开启…

毕业设计-基于机器视觉的车型识别系统

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…