【Java 进阶篇】Java Servlet URL Patterns 详解

news2024/9/27 12:14:31

在这里插入图片描述

Java Servlet 是构建动态 Web 应用程序的关键组件之一,而 URL Patterns(URL 模式)则是定义 Servlet 如何响应不同 URL 请求的重要部分。在本文中,我们将深入探讨 Java Servlet URL Patterns 的各个方面,适用于初学者,无需太多的先验知识。

什么是 URL Patterns?

URL Patterns 是一种用于匹配 URL 请求的模式。在 Web 开发中,我们需要指定哪些 URL 请求由哪个 Servlet 处理。URL Patterns 就是这些规则的集合,它决定了请求的分发方式。

URL Patterns 使用通配符和规则来定义 URL,以便 Servlet 容器可以将请求分配给正确的 Servlet。这使得开发者能够更灵活地控制应用程序的 URL 结构和路由。

Servlet 容器和 URL Patterns

在 Java Web 应用中,Servlet 容器(例如 Tomcat、Jetty 等)负责接收 HTTP 请求并将其路由到正确的 Servlet 处理。这个路由过程依赖于 URL Patterns 的定义。Servlet 容器会检查每个请求的 URL,然后根据 URL Patterns 找到匹配的 Servlet,从而实现请求的分发。

URL Patterns 不仅用于确定哪个 Servlet 处理请求,还可以用于提取 URL 中的参数,以便 Servlet 可以访问请求的数据。这使得 Web 应用能够接收各种不同的请求并执行不同的操作。

基本的 URL Patterns 规则

URL Patterns 使用通配符和规则来匹配 URL 请求。以下是一些常见的 URL Patterns 规则和通配符:

  • /*:匹配所有 URL 请求。
  • /somedir/*:匹配以 /somedir/ 开头的所有 URL 请求。
  • *.extension:匹配以指定文件扩展名结尾的所有 URL 请求。
  • /exactURL:精确匹配指定的 URL。

下面我们将详细讨论这些规则并提供示例。

/* - 匹配所有 URL 请求

/* 是最通用的 URL Patterns 规则,它会匹配所有 URL 请求。这意味着无论用户请求什么路径,都将由相应的 Servlet 处理。这通常用于处理默认请求或处理全站点的共享操作。

示例:假设我们有一个名为 DefaultServlet 的 Servlet,我们可以使用以下 URL Patterns 配置:

<servlet-mapping>
    <servlet-name>DefaultServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

这将导致 DefaultServlet 处理所有请求,无论请求的路径是什么。

/somedir/* - 匹配特定目录下的所有 URL 请求

/somedir/* 规则用于匹配以 /somedir/ 开头的所有 URL 请求。这在将多个相关 Servlet 分组到同一目录下时非常有用,以实现更有组织的 URL 结构。

示例:假设我们有一个名为 AdminServlet 的 Servlet,它处理所有 /admin/* 下的请求。我们可以使用以下 URL Patterns 配置:

<servlet-mapping>
    <servlet-name>AdminServlet</servlet-name>
    <url-pattern>/admin/*</url-pattern>
</servlet-mapping>

这将导致 AdminServlet 处理以 /admin/ 开头的所有请求。

*.extension - 匹配特定文件扩展名的 URL 请求

*.extension 规则用于匹配以指定文件扩展名结尾的 URL 请求。这对于处理特定类型的文件请求非常有用,如图像文件、样式表或脚本文件。

示例:假设我们有一个名为 ImageServlet 的 Servlet,它处理以 .jpg.png 结尾的图像文件。我们可以使用以下 URL Patterns 配置:

<servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>

这将导致 ImageServlet 处理所有以 .jpg.png 结尾的 URL 请求。

/exactURL - 精确匹配指定的 URL

/exactURL 规则用于精确匹配指定的 URL。这意味着只有当请求的 URL 与指定的 URL 完全匹配时,才会由相应的 Servlet 处理。

示例:假设我们有一个名为 AboutServlet 的 Servlet,它处理 /about 页面的请求。我们可以使用以下 URL Patterns 配置:

<servlet-mapping>
    <servlet-name>AboutServlet</servlet-name>
    <url-pattern>/about</url-pattern>
</servlet-mapping>

这将导致 AboutServlet 处理 /about 页面的请求。

多个 URL Patterns 和 Servlet 映射

在实际应用中,通常需要为不同的 URL 请求分配多个 Servlet。为此,您可以在 web.xml 文件中定义多个 <servlet-mapping> 条目。

示例:假设我们有三个不同的 Servlet,分别是 HomeServletContactServletServicesServlet,并且我们希望它们分别处理 /home/contact/services 页面的请求。我们可以这样配置 web.xml 文件:

<servlet-mapping>
    <servlet-name>HomeServlet</servlet-name>
    <url-pattern>/home</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ContactServlet</servlet-name>
    <url-pattern>/contact</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ServicesServlet</servlet-name>
    <url-pattern>/services</url-pattern>
</servlet-mapping>

这将使 HomeServlet 处理 /home 页面的请求,ContactServlet 处理 /contact 页面的请求,而 ServicesServlet 处理 /services 页面的请求。

URL Patterns 中的通配符

除了上述基本规则,URL Patterns 还支持一些通配符,以更精细地定义 URL 匹配模式。以下是一些常见的通配符:

  • *:匹配零个或多个字符。
  • ?:匹配单个字符。
  • **:匹配多级目录。
  • /:路径分隔符。

这些通配符可以用于创建更复杂的 URL Patterns。

* - 匹配零个或多个字符

* 通配符表示匹配零个或多个字符。这在需要匹配多个 URL 请求时非常有用。

示例:假设我们有一个名为 ProductServlet 的 Servlet,它处理所有以 /product/ 开头的请求,但后面的部分可以是任何字符。我们可以使用以下 URL Patterns 配置:

<servlet-mapping>
    <servlet-name>ProductServlet</servlet-name>
    <url-pattern>/product/*</url-pattern>
</servlet-mapping>

这将使 ProductServlet 处理所有以 /product/ 开头的请求,无论后面的字符是什么。

? - 匹配单个字符

? 通配符表示匹配单个字符。这对于需要精确匹配某些字符的 URL 请求非常有用。

示例:假设我们有一个名为 FileServlet 的 Servlet,它处理所有以 /file/ 开头,然后跟随两个字符的请求。我们可以使用以下 URL Patterns 配置:

<servlet-mapping>
    <servlet-name>FileServlet</servlet-name>
    <url-pattern>/file/??</url-pattern>
</servlet-mapping>

这将使 FileServlet 处理所有以 /file/ 开头,然后跟随两个字符的请求,如 /file/ab

** - 匹配多级目录

** 通配符表示匹配多级目录。这对于需要处理多级目录结构的 URL 请求非常有用。

示例:假设我们有一个名为 DirectoryServlet 的 Servlet,它处理所有以 /dir/ 开头的请求,后面可以跟随任意数量的目录级别。我们可以使用以下 URL Patterns 配置:

<servlet-mapping>
    <servlet-name>DirectoryServlet</servlet-name>
    <url-pattern>/dir/**</url-pattern>
</servlet-mapping>

这将使 DirectoryServlet 处理所有以 /dir/ 开头的请求,无论后面有多少目录级别,如 /dir/subdir1/subdir2

/ - 路径分隔符

/ 表示路径分隔符,通常用于分隔目录和文件名。在 URL Patterns 中,它表示 URL 路径的分隔符。

示例:假设我们有一个名为 ResourceServlet 的 Servlet,它处理所有以 /resources/ 开头的请求,后面可以跟随文件名。我们可以使用以下 URL Patterns 配置:

<servlet-mapping>
    <servlet-name>ResourceServlet</servlet-name>
    <url-pattern>/resources/*</url-pattern>
</servlet-mapping>

这将使 ResourceServlet 处理所有以 /resources/ 开头的请求,并根据路径分隔符后的部分来查找相应的文件,如 /resources/css/styles.css

URL Patterns 中的优先级

如果存在多个 URL Patterns 可以匹配同一个 URL 请求,Servlet 容器会根据它们的优先级来决定哪个 Servlet 处理请求。Servlet 容器通常遵循以下规则:

  1. 精确匹配(/exactURL)的 URL Patterns 优先级最高。
  2. 下级目录匹配(/somedir/*)的 URL Patterns 优先级次之。
  3. 文件扩展名匹配(*.extension)的 URL Patterns 优先级较低。
  4. 通配符(*?**)的 URL Patterns 优先级最低。

这意味着如果存在多个 URL Patterns 可以匹配同一个 URL 请求,Servlet 容器将选择具有最高优先级的 URL Patterns 对应的 Servlet 来处理请求。

示例:创建一个使用 URL Patterns 的 Servlet

为了更好地理解 URL Patterns 的使用,我们将创建一个简单的 Servlet,它将处理不同类型的 URL 请求。在这个示例中,我们将创建一个名为 PageServlet 的 Servlet,它将处理以下几种 URL 请求:

  1. /home:显示主页。
  2. /about:显示关于页面。
  3. /contact:显示联系页面。
  4. /products/*:显示产品页面,并接受产品 ID 作为参数。

下面是 web.xml 配置的示例:

<servlet-mapping>
    <servlet-name>PageServlet</servlet-name>
    <url-pattern>/home</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>PageServlet</servlet-name>
    <url-pattern>/about</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>PageServlet</servlet-name>
    <url-pattern>/contact</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>PageServlet</servlet-name>
    <url-pattern>/products/*</url-pattern>
</servlet-mapping>

现在,让我们来编写 PageServlet 的代码:

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("/home")
@WebServlet("/about")
@WebServlet("/contact")
@WebServlet("/products/*")
public class PageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response, throws ServletException, IOException {
        // 获取请求的 URL
        String requestURL = request.getRequestURI();

        // 根据 URL Patterns 匹配相应的操作
        if (requestURL.endsWith("/home")) {
            showHomePage(response);
        } else if (requestURL.endsWith("/about")) {
            showAboutPage(response);
        } else if (requestURL.endsWith("/contact")) {
            showContactPage(response);
        } else if (requestURL.startsWith("/products/")) {
            // 从 URL 中提取产品 ID
            String[] parts = requestURL.split("/");
            if (parts.length > 2) {
                String productId = parts[2];
                showProductPage(response, productId);
            } else {
                response.sendError(HttpServletResponse.SC_BAD_REQUEST);
            }
        } else {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
        }
    }

    private void showHomePage(HttpServletResponse response) throws IOException {
        response.setContentType("text/html");
        response.getWriter().write("<h1>Welcome to the Home Page</h1>");
    }

    private void showAboutPage(HttpServletResponse response) throws IOException {
        response.setContentType("text/html");
        response.getWriter().write("<h1>About Us</h1>");
    }

    private void showContactPage(HttpServletResponse response) throws IOException {
        response.setContentType("text/html");
        response.getWriter().write("<h1>Contact Us</h1>");
    }

    private void showProductPage(HttpServletResponse response, String productId) throws IOException {
        response.setContentType("text/html");
        response.getWriter().write("<h1>Product Page</h1>");
        response.getWriter().write("<p>Product ID: " + productId + "</p>");
    }
}

这个示例中的 PageServlet 接受不同的 URL 请求,并根据 URL Patterns 执行相应的操作。通过使用 URL Patterns,我们可以轻松地为每种请求创建不同的处理逻辑,实现更灵活的路由。

结语

Java Servlet URL Patterns 是构建 Web 应用程序的关键部分,它允许您根据 URL 请求的不同部分将请求分发给不同的 Servlet。通过灵活使用 URL Patterns,您可以创建更有组织的 URL 结构,并处理不同类型的请求。希望本文对理解和使用 URL Patterns 有所帮助,无论您是初学者还是有经验的开发者。如果您有任何问题或需要更多信息,请随时提问。祝您在 Web 开发中取得成功!

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

谢谢大家!

注&#xff1a;此篇都是真心话&#xff01; 谢谢各位对我长久以来的支持&#xff0c;感谢感谢&#xff01; 感谢各位把我的阅读量提升到21487&#xff01; 感谢各位把我的排名提升到24916&#xff08;灰长前&#xff0c;干到前1000我发超长文章&#xff09;&#xff01; 感谢…

会声会影2023永久稳定绿色汉化中文版安装包下载

会声会影2023操作简单&#xff0c;功能同样强大&#xff01;会声会影附带上百种特效、滤镜、转场、模板。同时各类专业级视频工具&#xff0c;如调色、遮罩、绿幕抠像、运动追踪、分屏创建器&#xff0c;满足更高标准的视频需求。这款软件上手操作简单易学&#xff0c;就算你在…

已更新!宝藏教程!MYSQL-第六章节多表查询(一对一,多对多,一对多),连接查询(内,外连接),联合查询,子查询 代码例题详解这一篇就够了(附数据准备代码)

c知识点合集已经完成欢迎前往主页查看&#xff0c;点点赞点点关注不迷路哦 点我进入c第一章知识点合集 MYSQL第一章节DDL数据定义语言的操作----点我进入 MYSQL第二章节DDL-数据库操作语言 DQL-数据查询语言----点我进入 MYSQL第三章节DCL-管理用户&#xff0c;控制权限----点我…

windows安装数据库MySQL

windows安装数据库MySQL 文章目录 windows安装数据库MySQL一、MySQL官网下载压缩包二、在D盘新建文件夹D:\MySQL&#xff0c;将下载的压缩包解压到该文件夹下三、配置环境变量四、通过命令行模式安装、启用、配置SQL服务 一、MySQL官网下载压缩包 下载地址&#xff1a;https:/…

Unity ShaderGraph 必会,实用的渐变滑条

常用来做一下区分不同区间部位的区别 G 对应的是 UV 的垂直轴Y R 对应的是 UV 的水平轴X 举个例子&#xff1a; 是不是层次感立马就不一样了呀&#xff0c;嘻嘻嘻嘻嘻嘻嘻 加了渐变的&#xff1a; 没有加渐变的&#xff1a;

C# 图解教程 第5版 —— 第7章 深入理解类

文章目录 7.1 类成员7.2 成员修饰符的顺序7.3 实例类成员&#xff08;*&#xff09;7.4 静态字段&#xff08;*&#xff09;7.5 从类的外部访问静态成员7.5.1 静态字段示例7.5.2 静态成员的生存期 7.6 静态函数成员7.7 其他静态类成员类型7.8 成员常量7.9 常量与静态量7.10 属性…

SLAM从入门到精通(三边测量法详解)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 三边测量&#xff0c;或者说叫三角定位&#xff0c;是定位系统中很常见的一种测量方法。它最主要的原理就是依靠已有的三个特征坐标和半径&#xf…

安全典型配置(五)SNMP中应用ACL过滤非法网管案例

【微|信|公|众|号&#xff1a;厦门微思网络】 安全典型配置&#xff08;一&#xff09;使用ACL限制FTP访问权限案例 安全典型配置&#xff08;二&#xff09;使用ACL限制用户在特定时间访问特定服务器的权限 安全典型配置&#xff08;三&#xff09;使用ACL禁止特定用户上网…

mysql 命令行安装

一、安装包下载 1、下载压缩包 &#xff08;1&#xff09;公众号获取 关注微信公众号【I am Walker】&#xff0c;回复“mysql”获取 &#xff08;2&#xff09;官网下载 安装地址MySQL :: Download MySQL Community Server ​ ​ 二、解压 下载完之后进行解压&…

如何学习能减少对现有工作的依赖?

减少对现有工作的依赖需要你提升自己的技能和能力&#xff0c;并拓宽你的职业选择。以下是一些具体的步骤&#xff1a; 自我评估: 确定你目前的技能和兴趣&#xff0c;并识别哪些领域你可以提升或学习新的技能。 设定学习目标: 根据自我评估的结果&#xff0c;设定具体的学习目…

嵌入式学习笔记(63)位操作实战

(1)给定一个整型数a&#xff0c;设置a的bit3&#xff0c;保证其他位不变。 a | (1<<3) (2)给定一个整形数a&#xff0c;设置a的bit3~bit7&#xff0c;保持其他位不变 a | (0x1f<<3) (3)给定一个整型数a&#xff0c;清除a的bit15&#xff0c;保证其他位不变。 a …

鸿运主动安全监控云平台任意文件下载漏洞复现 [附POC]

文章目录 鸿运主动安全监控云平台任意文件下载漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 鸿运主动安全监控云平台任意文件下载漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术…

SpringBoot 源码分析(三) 监听器分析以及属性文件加载分析

前言 在创建SpringBoot项目的时候会在对应的application.properties或者application.yml文件中添加对应的属性信息&#xff0c;这些属性文件是什么时候被加载的&#xff1f;如果要实现自定义的属性文件怎么来实现&#xff1f;在讲属性加载之前先讲下监听器分析。 一、监听器分…

Apifox:满足你对 Api 的所有幻想

一、Api 管理的难点在哪&#xff1f; 相信无论是前端&#xff0c;还是后端的测试和开发人员&#xff0c;都遇到过这样的困难。不同工具之间数据一致性非常困难、低效。多个系统之间数据不一致&#xff0c;导致协作低效、频繁出问题&#xff0c;开发测试人员痛苦不堪。 开发人…

面向中小型企业的高效企业备份解决方案

​如今&#xff0c;数据保护并不是一个新概念。无论是在个人、家庭、非营利组织还是企业环境中&#xff0c;我们都不想丢失数据&#xff0c;尤其是对于企业来说。无论您的公司规模有多小&#xff0c;与个人使用环境相比&#xff0c;它都会拥有更多的设备、更大的数据量和更低的…

css 两栏布局的实现

目录 前言 1. 浮动布局 用法 代码示例 理解 2. Flex布局 用法 代码示例 理解 3. Grid布局 用法 代码示例 理解 高质量的设计 前言 两栏布局是一种常见的网页设计模式&#xff0c;它将页面分为两个主要区域&#xff1a;主内容区域和侧边栏。这种布局方式不仅能够提…

Java精品项目源码第61期汽车零件销售商城系统(代号V063)

Java精品项目源码第61期汽车零件销售商城系统(代号V063) 大家好&#xff0c;小辰今天给大家介绍一个汽车零件销售商城系统&#xff0c;演示视频公众号&#xff08;小辰哥的Java&#xff09;对号查询观看即可 文章目录 Java精品项目源码第61期汽车零件销售商城系统(代号V063)难…

资料分析错题

答案 ca 间隔增长率 DD

《动手学深度学习 Pytorch版》 10.4 Bahdanau注意力

10.4.1 模型 Bahdanau 等人提出了一个没有严格单向对齐限制的可微注意力模型。在预测词元时&#xff0c;如果不是所有输入词元都相关&#xff0c;模型将仅对齐&#xff08;或参与&#xff09;输入序列中与当前预测相关的部分。这是通过将上下文变量视为注意力集中的输出来实现…

学习嵌入式开发是不是需要很高的天赋智商能力?

今日话题&#xff0c;学习嵌入式开发是不是需要很高的天赋智商能力&#xff1f;我认为提出此疑问的人可能缺乏自信&#xff0c;需要培养自信心。学习嵌入式开发并不要求非常高的智商&#xff0c;成千上万的工程师已经从事这个行业&#xff0c;他们中的大多数都是非常普通的人。…