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"

相关推荐
AntsData6 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat6 小时前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰6 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
Flynn Liang6 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
灿飞6 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
计算机毕设定制辅导-无忧学长7 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
雪芽蓝域zzs7 小时前
第 1 章:IDEA 创建 SpringBoot3.5.16 Maven 项目
java·maven·intellij-idea
golang学习记8 小时前
IDEA 开始换芯,发布全新AI版终端
java·人工智能·intellij-idea
vipxieliang8 小时前
ValidX 正则表达式预编译优化:Pattern 复用策略
java·spring boot·后端
Wang's Blog8 小时前
Java 项目实战:交友项目 - FastDFS 工作原理
java·大数据·交友