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"

相关推荐
真上帝的左手41 分钟前
10. 软件设计&架构-Spring Security 7 整合CAS SSO 单点登录
java·spring·架构·sso
Zane19941 小时前
单例线程安全、生产者消费者、死锁:并发面试三连问串讲
java·后端
云烟成雨TD2 小时前
Micrometer 系列【42】链路追踪:Span 体系 | 核心 API
java·链路追踪·micrometer
Gorway2 小时前
理解 Spring 依赖注入:从构造器注入到集合与条件 Bean
java·后端
LiLiYuan.2 小时前
【字符串常量池】
java·开发语言·面试
Sylvia33.2 小时前
从轮询到推送:足球数据API架构演进与火星数据技术拆解
java·服务器·网络·python·websocket·架构
cfm_29143 小时前
高并发系统缓存全解
java·缓存
Ghost Face...3 小时前
龙芯Docker全流程:安装到离线迁移实战
java·docker·eureka
16月6日-晴3 小时前
Java面向对象进阶—static
java·开发语言
自由能燃气设备3 小时前
燃气容积式热水器厂家选购指南:2026年商用热水设备采购避坑手册
大数据·数据库·数据仓库·人工智能