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"

相关推荐
NE_STOP20 小时前
Docker--Docker Swarm集群
java
两年半的个人练习生^_^20 小时前
JMM 进阶:彻底理解 CAS 实现原理
java·开发语言
wuminyu20 小时前
Java锁机制之park和unpark源码剖析
java·linux·c语言·jvm·c++
W_LuYi18520 小时前
手撸极简zkEVM验证器:RISC-V电路实践
java·risc-v
AI人工智能+电脑小能手21 小时前
【大白话说Java面试题 第102题】【并发篇】第2题:volatile 能否保证线程安全?
java·安全·面试
KobeSacre21 小时前
JUC 概述
java·开发语言
小bo波21 小时前
形式化方法 × UML
java·软件工程·uml·面向对象·形式化方法·tla+
就叫_这个吧1 天前
IDEA中Javaweb项目创建+servlet,实现简单的信息录入获取
java·servlet·intellij-idea·web
程序员Jelena1 天前
接口调用的代码实现:从入门到实战
java
代码钢琴师1 天前
Throttle4j 快速上手教程
java