JavaWeb——(web.xml)中的(url-pattern)

一、基本概念

web.xml 中,你通过 <servlet-mapping> 来定义一个 Servlet 的映射。<url-pattern> 就是其中的关键子元素,它告诉 Web 容器:"当遇到符合这个模式的请求时,请把它交给那个 Servlet 来处理"。

基本结构:

XML 复制代码
<web-app>
    <!-- 1. 声明Servlet -->
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.example.MyServlet</servlet-class>
    </servlet>

    <!-- 2. 映射Servlet到URL模式 -->
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/hello</url-pattern> <!-- 这就是我们关注的重点 -->
    </servlet-mapping>
</web-app>

在上面的例子中,任何指向 http://yourdomain.com/yourWebApp/hello 的请求都会被 MyServlet 处理。

二、url-pattern 的四种匹配规则(按优先级排序)

规则优先级从高到低为:精确匹配 > 路径匹配 > 扩展名匹配 > 默认匹配。容器会按照这个顺序查找,使用第一个匹配成功的映射。

1. 精确匹配

模式必须与请求的 URL 完全一致(不包括上下文路径)。

示例:

XML 复制代码
<url-pattern>/user/info</url-pattern>
<url-pattern>/shop/cart.html</url-pattern>
  • 匹配的 URL: http://.../yourWebApp/user/info

  • 匹配的 URL: /user/info/, /user/info/123, /user

2. 路径匹配 (最长路径优先)

使用通配符 * 来表示任意长度的路径。这是最常用的匹配方式。

语法: /path/*

示例:

XML 复制代码
<url-pattern>/admin/*</url-pattern>
  • 匹配的 URL:

    • /admin/

    • /admin/users

    • /admin/users/add

    • /admin/old/settings

  • 匹配的 URL: /admin (注意,这里没有尾随的 /)

"最长路径优先"原则:

如果一个 URL 同时匹配多个路径模式,容器会选择最长的那个。

XML 复制代码
<servlet-mapping>
    <servlet-name>ServletA</servlet-name>
    <url-pattern>/admin/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ServletB</servlet-name>
    <url-pattern>/admin/users/*</url-pattern>
</servlet-mapping>

对于请求 /admin/users/list,它会匹配到 ServletB,因为 /admin/users/*/admin/* 更长。

3. 扩展名匹配

匹配特定文件扩展名的请求。

语法: *.扩展名

示例:

XML 复制代码
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.action</url-pattern>
<url-pattern>*.do</url-pattern>
  • 匹配的 URL:

    • /index.jsp

    • /user/login.jsp

    • /shop/checkout.action

    • /任何路径/data.do

  • 重要规则

    • 不能/ 开头。/*.do错误的写法。

    • 它不关心路径,只关心结尾的扩展名。

4. 默认匹配 (/ 和 /*)

这是一个特殊且容易混淆的匹配。
  • <url-pattern>/</url-pattern>:

    • 它匹配所有没有被其他 Servlet 匹配的请求。

    • 它通常被用作 "默认 Servlet" 或用于集成 MVC 框架(如 Spring MVC 的 DispatcherServlet)。

    • 它不会匹配 到有扩展名的 URL,比如 .jsp 文件,因为容器通常有一个内置的 Servlet(如 JspServlet)来处理 .jsp 请求,它的优先级更高。

  • <url-pattern>/*</url-pattern> :(属于路径匹配,优先级高于扩展名匹配)

    • 它匹配所有 请求,包括 .jsp.html 等。

    • 如果你将一个 Servlet 映射到 /*,那么它将拦截所有请求,包括你希望由 JSP 引擎处理的 JSP 页面。这通常会导致你访问 index.jsp 时,看到的是 Servlet 输出的内容,而不是被渲染的 JSP 页面。因此,在使用时需要特别小心。

相关推荐
star learning white4 分钟前
xm C语言12
服务器·c语言·前端
tabzzz5 分钟前
大道至简:万字漫谈前端性能监控
前端·javascript·性能优化
0思必得012 分钟前
[Web自动化] CSS基础概念和介绍
前端·css·python·自动化·html·web自动化
小胖霞14 分钟前
全栈系列(15)github Actions自动化部署前端vue
前端·node.js·github
未来魔导15 分钟前
基于 Gin 框架的 大型 Web 项目推荐架构目录结
前端·架构·gin
foundbug99938 分钟前
Modbus协议C语言实现(易于移植版本)
java·c语言·前端
Luna-player38 分钟前
在前端中list.map的用法
前端·数据结构·list
用户479492835691542 分钟前
面试官问 React Fiber,这一篇文章就够了
前端·javascript·react.js
小徐_23331 小时前
Gemini 3做粒子交互特效很出圈?拿 TRAE SOLO 来实现一波!
前端·ai编程·trae
LYFlied1 小时前
【一句话概述】Webpack、Vite、Rollup 核心区别
前端·webpack·node.js·rollup·vite·打包·一句话概述