在 Java Web 开发中,servlet-mapping 是用于将特定的 URL 路径映射到对应的 Servlet 类的关键配置元素。它定义了客户端请求的 URL 与服务器端处理该请求的 Servlet 之间的对应关系。
核心作用
URL 路径绑定:当用户访问某个 URL 时,Web 容器(如 Tomcat)根据 servlet-mapping 配置找到对应的 Servlet 并调用其方法(如 doGet()、doPost())处理请求。
支持多种映射方式:包括精确匹配、前缀匹配、后缀匹配和默认匹配。
配置方式
- 通过 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 无法解析 。
- 通过注解配置(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"