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"

相关推荐
小羊没烦恼!2 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
卷毛迷你猪2 天前
快速实验篇(A11)数据集成与多维分析:从单实验产出到跨实验宽表
hive·hadoop
俊昭喜喜里2 天前
java中的继承和多态的区别
java
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕2 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码2 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖2 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时2 天前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang2 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi2 天前
mysql 查询所有表名并授权
java