Tomcat 学习之 Servlet

目录

1 Servlet 介绍

2 创建一个 Servlet

3 web.xml 介绍(不涉及 filter 和 listener 标签)

3.1 display-name

3.2 welcome-file-list

3.3 servlet

3.4 session-config

3.5 error-page

4 Tomcat 如何根据 URL 定位到 Servlet

5 执行 Servlet

5.1 Servlet 接口(规范)

5.2 Servlet 生命周期

5.3 执行 init 初始化方法

5.4 执行 service 方法


最近学习 Servlet 的时候,不是那么认真,认为它已经过时了,可以不用学。直到学习 SpringMVC 看到 DispatcherServlet 的时候,才发现自己错了,JavaWeb 三大组件 (Servlet、Filter、Listener)值得学习。

1 Servlet 介绍

        互联网兴起之初,当时的 Sun 公司(后来被 Oracle 收购)已然看到了这次机遇,为了使 Java 进军 Web 编程领域,推出了 Applet 支持 Web 应用,但是效果并不如预想的那般美好,Applet 并没有给业界带来多大影响。之后,Sun 公司的大佬潜心专研,推出了 Servlet(Server Applet,全称 Java Servlet)实现动态网页。Tomcat 的前身为 Catalina,Catalina 是一个轻量级的 Servlet 容器,提供了运行 Servlet 的环境和服务。

       

上图是一个粗略的 Servlet 执行过程表示图,从 Servlet 容器(Tomcat)启动到运行 Servlet 的过程非常复杂,本文只介绍 Servlet 是如何使用的。那么 Servlet 是用来干什么的呢?

Servlet 主要用来处理客户端的请求并生成响应,分为以下几点:(来自 GPT)

  1. 接收和处理客户端的 HTTP 请求:Servlet 可以接收来自客户端的各种类型的 HTTP 请求,例如 GET、POST、PUT、DELETE 等,并根据请求的类型和参数生成相应的响应。

  2. 生成动态内容:Servlet 可以根据请求的参数和服务器端的数据生成动态的 HTML 页面、XML 文档、JSON 数据等响应内容,从而实现动态网页的效果。

  3. 处理表单数据:Servlet 可以接收和处理客户端提交的表单数据,例如用户注册、登录、查询等操作。

  4. 实现会话管理:Servlet 可以通过 HTTP 会话(Session)来跟踪和管理客户端与服务器之间的会话状态,例如存储用户登录信息、购物车信息等。

  5. 实现安全控制:Servlet 可以通过验证用户身份、授权访问权限等方式实现安全控制,保护服务器和客户端的数据安全。

  6. 与其他 Web 组件交互:Servlet 可以与其他 Web 组件(如 JSP、Filter、Listener 等)进行交互,实现复杂的 Web 应用程序。

2 创建一个 Servlet

创建一个 JavaWeb 工程

        创建过程请参考:IDEA 2023.2 配置 JavaWeb 工程-CSDN博客

导入 Servlet-api.jar 包

        Maven 中通过配置 pom.xml 导入

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

        非 Maven 导入 Servlet-api.jar

点击 File,再点击 Project Structrue

选择 Libraries,点击 + 号,选择 Java

找到 Tomcat 中 lib 目录下的 servlet-api.jar,点击 OK

先点击 Apply,再点击 OK

工程目录

在 src 目录下创建一个 com.test 包,在其中创建 TestServlet 类

package com.test;


import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class TestServlet implements Servlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        // 接口 HttpServletRequest 实现 servletRequest 接口
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
        // 获得请求方法
        if (method.equals("GET")) {
            this.doGet();
        } else if (method.equals("POST")) {
            this.doPost();
        }
    }

    public void doGet(){
        System.out.println("GET 请求");
    }

    public void doPost(){
        System.out.println("POST 请求");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
}

修改 web.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 配置 Servlet 程序 -->
    <servlet>
        <!-- 设置 Servlet 程序名称 -->
        <servlet-name>TestServlet</servlet-name>
        <!-- 设置 Servlet 程序所在路径(位置) -->
        <servlet-class>com.test.TestServlet</servlet-class>
    </servlet>

    <!-- 设置 Servlet 映射-->
    <servlet-mapping>
        <!-- Servlet 程序名称 -->
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
</web-app>

启动 Tomcat

哈哈,404 ,这时因为没有设置“首页文件”

输入 localhost:8080/servlettest/test 啥也没有

在 IDEA 中可以看到服务器已经收到了请求并响应了

在浏览器按 F12、刷新网页、查看网络,可以看到请求的消息,至此 Servlet 学习结束了

3 web.xml 介绍(不涉及 filter 和 listener 标签)

3.1 display-name

<display-name> 元素常用于配置 servlet、过滤器或其他 Web 组件的显示名称。这个显示名称主要用于在管理界面或日志中标识该组件,以方便识别和管理

     <!-- <display-name> 元素常用于配置 servlet、过滤器或其他 Web 组件的显示名称。
    这个显示名称主要用于在管理界面或日志中标识该组件,以方便识别和管理。 -->
    <!-- 标识项目名 -->
    <display-name>ServletTest</display-name>

3.2 welcome-file-list

welcome-file-list 用来定义首页文件,也就是用户直接输入域名时跳转的页面(如http://localhost:8080/)

        在 tomact 的 conf 目录下,web.xml 使用了该标签,所以我们在 web 目录下创建的 index.jsp 文件在 Tomcat 服务器启动时会被执行。此外,成功执行了第一个首页文件,后面的首页文件不会执行,如果没有定义首页文件,则显示 404

    <!-- 定义首页文件,也就是用户直接输入域名时跳转的页面(如http://localhost:8080/)-->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>test.jsp</welcome-file>
    </welcome-file-list>

3.3 servlet

    <!-- 配置 Servlet 程序 -->
    <servlet>
        <!-- 放在第一句不会报错 -->
        <display-name>TestServlet</display-name>
        <!-- 设置 Servlet 程序名称 -->
        <servlet-name>TestServlet</servlet-name>
        <!-- 设置 Servlet 程序所在路径(位置) -->
        <servlet-class>com.test.TestServlet</servlet-class>
        <!-- 设置 Servlet 初始化参数
        可以通过 ServletConfig.getInitParamenter(String name) 方法访问初始化参数 -->
        <init-param>
            <param-name>driver</param-name>
            <param-value>com.mysql.jdbc.Driver</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/study</param-value>
        </init-param>
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>passwd</param-name>
            <param-value>123456</param-value>
        </init-param>
        <!-- load-on-startup 指定一个 servlet 的加载顺序
         当值为 0 或者大于 0 时,表示容器在应用启动时就加载这个 servlet
         当值是一个负数时或者没有指定时,表示容器在该 servlet 被选择时才加载
         正数的值越小,启动该servlet的优先级越高-->
        <load-on-startup>1</load-on-startup>
        <!--支持异步处理-->
        <async-supported>true</async-supported>
    </servlet>

其中我觉得最重要的点是 url-pattern

参考文档:tomcat关于配置servlet的url-pattern的问题详解 - sogeisetsu - 博客园 (cnblogs.com)

精确匹配(具体的某个文件)

如通过 http://localhost:8080/servlettest/img/2.jpg 访问工程 servlettest 中的 img 目录中的 2.jpg 图片,会使用 TestServlet 处理,不会正常访问该图片

    <!-- 设置 Servlet 映射-->
    <servlet-mapping>
        <!-- Servlet 程序名称 -->
        <servlet-name>TestServlet</servlet-name>
        <!-- 如访问 img 目录中的 2.jpg 图片 -->
        <url-pattern>/img/2.jpg</url-pattern>
    </servlet-mapping>

模糊匹配 *

使用 * 进行模糊匹配,表示 0 ~ n 个的任意字符

如果通过 http://localhost:8080/servlettest/img/5.jpg 访问该图片不会成功。。。

    <!-- 设置 Servlet 映射-->
    <servlet-mapping>
        <!-- Servlet 程序名称 -->
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/img/*</url-pattern>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>

默认匹配 /

何为默认匹配,是该路径得不到 “其他 Servlet” 的处理 ,最终会由 <url-pattern>/</url-pattern> 的 Servlet 处理, 如默认的 “default” Servlet 无奈接手 “其他 Servlet” 不处理的请求

访问 http://localhost:8080/servlettest/  ,“其他 Servlet” 不处理,“default Servlet” 会加载首页文件,如果没有文件,显示 “404” 

    <servlet-mapping>
        <!-- Servlet 程序名称 -->
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

以下代码来自 Tomcat 中的 conf 目录下的 web.xml 文件,我们可以了解到 Tomcat 自定义了许多 Servlet 处理各种访问

    <!-- The mapping for the default servlet -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- The mappings for the JSP servlet -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>

3.4 session-config

设置 Session 超时时间,单位为分钟

    <!-- 设置 Session 超时时间,单位为分钟 -->
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

3.5 error-page

设置错误页,当 404 或 500 或 发生异常时可以跳转至指定页面,有三个子标签

  • <error-code></error-code>:用来设置错误码,例如 404, 500等
  • <exception-type></exception-type>:用来设置异常类型,例如 java.lang.NullPointerException(空指针异常)
  • <location></location>:用来设置跳转的错误页
    <!-- 设置错误页 -->
    <error-page>
        <error-code>404</error-code>
        <location>/error_404.html</location>
    </error-page>
    <error-page>
        <exception-type>java.lang.NullPointerException</exception-type>
        <location>/error_null.html</location>
    </error-page>

访问不存在的页面,跳转到错误页进行显示

Tomcat 会自动解析各种 xml 文件,这个过程。。。对于现在的我而言太复杂了

InputSource contextWebXml = this.getContextWebXmlSource();

Tomcat 如何根据 URL 定位到 Servlet

参考自:java - Tomcat 架构原理解析到架构设计借鉴 - 个人文章 - SegmentFault 思否

以 http://user.shopping.com:8080/order/buy 为例,其中 http 为访问协议、user.shopping.com 为主机名、order 可认为是一个工程名、一个 Servlet 对应一个 Wrapper,buy 可认为是一个 Servlet 程序名称

  1. 首先根据协议和端口号确定 Service 和 Engine。Tomcat 默认的 HTTP 连接器监听 8080 端口、默认的 AJP 连接器监听 8009 端口。上面例子中的 URL 访问的是 8080 端口,因此这个请求会被 HTTP 连接器接收,而一个连接器是属于一个 Service 组件的,这样 Service 组件就确定了。我们还知道一个 Service 组件里除了有多个连接器,还有一个容器组件,具体来说就是一个 Engine 容器,因此 Service 确定了也就意味着 Engine 也确定了
  2. 根据域名选定 Host。 Service 和 Engine 确定后,Mapper 组件通过 URL 中的域名去查找相应的 Host 容器,比如例子中的 URL 访问的域名是 user.shopping.com,因此 Mapper 会找到 Host2 这个容器
  3. 根据 URL 路径找到 Context 组件。 Host 确定以后,Mapper 根据 URL 的路径来匹配相应的 Web 应用的路径,比如例子中访问的是 /order,因此找到了 Context4 这个 Context 容器
  4. 根据 URL 路径找到 Wrapper(Servlet)。 Context 确定后,Mapper 再根据 web.xml 中配置的 Servlet 映射路径来找到具体的 Wrapper 和 Servlet

补充,也可以是请求访问 http://user.shopping.com:8080/order/buy.html

5 执行 Servlet

参考文档:

透过现象看本质——什么是servlet_servlet go-CSDN博客

Java servlet执行的完整流程(图解含源码分析)_请简述 servlet 的工作流程?-CSDN博客Tomcat如何创建Servlet? Servlet的执行流程_tomcat先创建servlet还是先创建servletcontext-CSDN博客Java servlet执行的完整流程(图解含源码分析)_请简述 servlet 的工作流程?-CSDN博客

5.1 Servlet 接口(规范)

所有实现 Servlet 接口的类必须实现 init()、Service()、getServletConfig()、getServletInfo()、destroy() 方法

5.2 Servlet 生命周期

  • 执行 Servlet 构造器方法,创建 Servlet 时调用,只调用一次
  • 执行 init 初始化方法,创建 Servlet 时调用,只调用一次
  • 执行 service 方法,每次访问都会调用
  • 执行 destory 方法,JavaWeb 工程停止的时候调用

        服务器找到全类名后,会在缓存中查看是否存在该对象,不存在则通过反射创建对象,同时也创建了 ServletConfig 类,里面存放了一些初始化信息(注意服务器只会创建一次 Servlet 对象,所以 ServletConfig 也只有一个)

5.3 执行 init 初始化方法

原文的解释有点问题,通过代码来说明,根据多态动态绑定,执行 Servlet 子类重写的方法

// 反射创建 Servlet 对象
Servlet obj = Class.forName("全类名").newInstance();

// ServletConfig config
//调用 init 方法初始化
obj.init(config);

// ServletRequest req, ServletResponse resp
// 调用 Service 方法
obj.Service(req, resp);

5.4 执行 service 方法

        仓促抄完,大概就抄这么点,用的时候继承 HttpServlet ,重写 doGet 和 doPost 就好了,忘了写可以通过注解 @WebServlet("/Servlet名称") 配置 Servlet 了,写了注解 @WebServlet,就不要在 web.xml 配置 Servlet,好像会冲突。。。

希望大佬多多指正!!!问题。。。我暂时还找不出来

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

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

相关文章

QT-Day2

思维导图 作业 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#x…

【Crypto | CTF】BUUCTF RSA2

天命&#xff1a;密码学越来越难了&#xff0c;看别人笔记都不知道写啥 天命&#xff1a;莫慌&#xff0c;虽然我不会推演法&#xff0c;但我可以用归纳法 虽然我不知道解题的推演&#xff0c;但我可以背公式啊哈哈哈 虽然我不会这题&#xff0c;但是我也能做出来 公式我不知…

ElasticStack安装(windows)

官网 : Elasticsearch 平台 — 大规模查找实时答案 | Elastic Elasticsearch Elastic Stack(一套技术栈) 包含了数据的整合 >提取 >存储 >使用&#xff0c;一整套! 各组件介绍: beats 套件:从各种不同类型的文件/应用中采集数据。比如:a,b,cd,e,aa,bb,ccLogstash:…

挑战杯 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

四、分类算法 - 朴素贝叶斯算法

目录 1、朴素贝叶斯算法 1.1 案例 1.2 联合概率、条件概率、相互独立 1.3 贝叶斯公式 1.4 朴素贝叶斯算法原理 1.5 应用场景 2、朴素贝叶斯算法对文本进行分类 2.1 案例 2.2 拉普拉斯平滑系数 3、API 4、案例&#xff1a;20类新闻分类 4.1 步骤分析 4.2 代码分析 …

Java SE 入门到精通—基础语法【Java】

敲重点&#xff01; 本篇讲述了比较重要的基础&#xff0c;是必须要掌握的 1.程序入口 在Java中&#xff0c;main方法是程序的入口点&#xff0c;是JVM&#xff08;Java虚拟机&#xff09;执行Java应用程序的起始点。 main方法的方法签名必须遵循下面规范&#xff1a; publ…

css知识:盒模型盒子塌陷BFC

1. css盒模型 标准盒子模型&#xff0c;content-box 设置宽度即content的宽度 width content 总宽度content&#xff08;width设定值&#xff09; padding border IE/怪异盒子模型&#xff0c;border-box width content border padding 总宽度 width设定值 2. 如何…

好用的备忘录便签软件推荐哪一款?

好用的备忘录便签软件推荐哪一款&#xff1f;备忘录便签软件支持放在桌面上&#xff0c;可以辅助大家快捷记录&#xff0c;而且可以高效辅助大家进行记录&#xff0c;支持在电脑桌面显示的便签工具是比较多的&#xff0c;但是论其是否好用&#xff0c;大家还需要耐心的筛选一番…

Chromium的下载地址

Chromium的下载地址&#xff1a; Download Chromiumhttps://www.chromium.org/getting-involved/download-chromium/ https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefixWin_x64/https://commondatastorage.googleapis.com/chromium-br…

LLM之RAG实战(二十七)| 如何评估RAG系统

有没有想过今天的一些应用程序是如何看起来几乎神奇地智能的&#xff1f;这种魔力很大一部分来自于一种叫做RAG和LLM的东西。把RAG&#xff08;Retrieval Augmented Generation&#xff09;想象成人工智能世界里聪明的书呆子&#xff0c;它会挖掘大量信息&#xff0c;准确地找到…

Kafka进阶

文章目录 概要应用场景消息队列两种模式kafka的基础架构分区常见问题小结 概要 kafka的传统定义&#xff1a;kafka是一个分布式的基于发布\订阅模式的消息队列&#xff0c;主要用于大数据实时处理领域。 kafka的最新概念&#xff1a;kafka是一个开源的分布式事件流平台&#x…

一种基于动态水位值的Flink调度优化算法(flink1.5以前),等同于实现flink的Credit-based反压原理

优化flink反压 说明1 flink反压介绍1.1 介绍1.2 大数据系统反压现状1.4 flink task与task之间的反压1.5 netty水位机制作用分析 2 反压优化算法3 重点&#xff01; 但是 可但是 flink1.5以后的反压过程。4 flink反压问题的查找瓶颈办法 说明 首先说明&#xff0c;偶然看了个论…

iMazing2024Windows和Mac的iOS设备管理软件(可以替代iTunes进行数据备份和管理)

iMazing2024是一款兼容 Windows 和 Mac 的 iOS 设备管理软件&#xff0c;可以替代 iTunes 进行数据备份和管理。以下是一些 iMazing 的主要功能和优点&#xff1a; 数据备份和恢复&#xff1a;iMazing 提供了强大的数据备份和恢复功能&#xff0c;可以备份 iOS 设备上的各种数据…

Unity xLua开发环境搭建与基础进阶

Unity是一款非常流行的游戏开发引擎&#xff0c;而xLua是一个为Unity开发者提供的Lua框架&#xff0c;可以让开发者使用Lua语言来进行游戏开发。在本文中&#xff0c;我们将介绍如何搭建Unity xLua开发环境&#xff0c;并进行基础进阶的学习。 环境搭建 首先&#xff0c;我们需…

MATLAB练习题:拉马努金的恒等式

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 拉马努金是印度历史上最著名的数学家之一&#xff0c;他没有接…

【电子书】产品经理

资料 wx&#xff1a;1945423050 个人整理了一些互联网电子书 产品经理 破茧成蝶2——以产品为中心的设计革命.epub产品经理的20堂必修课.epub信息无障碍_提升用户体验的另一种视角.epub引爆用户增长.epub在你身边&#xff0c;为你设计 腾讯的用户体验设计之道.epub以匠心&…

新版Java面试专题视频教程——多线程篇①

新版Java面试专题视频教程——多线程篇① Java多线程相关面试题 0. 问题汇总0.1 线程的基础知识0.2 线程中并发安全 1.线程的基础知识1.1 线程和进程的区别&#xff1f;1.2 并行和并发有什么区别&#xff1f;1.3 创建线程的四种方式1.4 runnabl…

Global Gamers Challenge | 与 Flutter 一起保护地球

作者 / Kelvin Boateng 我们知道 Flutter 开发者热爱挑战&#xff0c;因此我们很高兴地宣布&#xff0c;新一轮的 Flutter 挑战赛来了&#xff01; 挑战https://flutter.cn/events/puzzle-hack Global Gamers Challenge 是一项为期 8 周的比赛&#xff0c;参赛者需要设计、构建…

基于CNN-GRU-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 CNN&#xff08;卷积神经网络&#xff09;部分 4.2 GRU&#xff08;门控循环单元&#xff09;部分 4.3 Attention机制部分 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版…

详解 IT/OT 融合的五层架构(从PLC/SCADA到MES/ERP)

作为一个电气自动化的从业者&#xff0c;有必要搞懂下面术语的意思。 IT&#xff1a;Information Technology的缩写&#xff0c;指信息技术&#xff1b; OT&#xff1a;Operational Technology的缩写&#xff0c;指操作层面的技术&#xff0c;比如运营技术&#xff1b;CT&…