Java Web 开发:servlet-mapping‌

在 Java Web 开发中,‌servlet-mapping‌ 是用于将特定的 URL 路径映射到对应的 Servlet 类的关键配置元素。它定义了客户端请求的 URL 与服务器端处理该请求的 Servlet 之间的对应关系。

‌核心作用‌

‌URL 路径绑定‌:当用户访问某个 URL 时,Web 容器(如 Tomcat)根据 servlet-mapping 配置找到对应的 Servlet 并调用其方法(如 doGet()、doPost())处理请求。

‌支持多种映射方式‌:包括精确匹配、前缀匹配、后缀匹配和默认匹配。

‌配置方式‌

  1. ‌通过 web.xml 配置(传统方式)‌

<servlet>

<servlet-name>MyServlet</servlet-name>

<servlet-class>com.example.MyServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>MyServlet</servlet-name>

<url-pattern>/hello</url-pattern>

</servlet-mapping>

<servlet-name>:必须与 <servlet> 中的名称一致。

<url-pattern>:定义访问路径,支持以下格式:

‌精确匹配‌:/hello

‌前缀匹配‌:/api/*

‌后缀匹配‌:*.do

‌默认匹配‌:/(注意:不是 /*)

⚠️ ‌注意‌:/ 和 /* 含义完全不同:

/:‌默认 Servlet‌,仅处理未被其他映射捕获的请求(如静态资源)。

/*:‌覆盖所有请求‌,包括 JSP、CSS、JS 等,可能导致静态资源 404 或 JSP 无法解析 ‌。

  1. ‌通过注解配置(Servlet 3.0+ 推荐)‌

@WebServlet("/hello")

public class MyServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

resp.getWriter().println("Hello, World!");

}

}

注解方式更简洁,但需确保与 web.xml 配置方式‌不混用‌,否则可能产生冲突或被忽略 ‌。

‌映射优先级规则‌

Web 容器按以下顺序匹配 URL,‌取第一个命中的项‌,不考虑 XML 中声明顺序 ‌:

‌精确匹配‌(如 /hello)

‌前缀匹配‌(如 /api/*)

‌扩展名匹配‌(如 *.do)

‌默认匹配‌(/)

示例:若同时存在 /api/* 和 /api/user,访问 /api/user 会优先匹配前者(前缀匹配),后者(精确匹配)‌永远不会生效‌ ‌。

‌常见错误与注意事项‌

❌ <url-pattern> ‌必须以 / 开头‌,否则部署失败 ‌8。

❌ servlet-name 在 <servlet> 和 <servlet-mapping> 中‌必须完全一致‌ ‌810。

❌ ‌不要在 /* 上配置 Spring 的 DispatcherServlet‌,否则会拦截所有静态资源,导致 CSS/JS 无法加载 ‌11。

✅ 若需处理所有路径但保留静态资源,建议使用 /app/* + 前端路由,或配置 DefaultServletHttpRequestHandler ‌。

‌获取映射信息(Servlet 4.0+)‌

可通过 HttpServletRequest.getHttpServletMapping() 获取当前请求的映射详情 ‌:

HttpServletMapping mapping = request.getHttpServletMapping();

String pattern = mapping.getPattern(); // 如 "/hello/*"

String matchValue = mapping.getMatchValue(); // 如 "abc"

String servletName = mapping.getServletName(); // 如 "MyServlet"

String matchType = mapping.getMappingMatch().name(); // 如 "PREFIX_MATCH"

相关推荐
咩咩啃树皮9 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚10 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白11 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司12 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地13 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415913 小时前
TCP超时重传机制是为了解决什么问题?
java
罗政13 小时前
基于AI工作流的多渠道销售数据仓库清洗统计实践
数据仓库
莫逸风15 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898616 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112317 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python