在Java Web应用的web.xml部署描述文件中,servlet-mapping元素用于将Servlet实例和特定的URL访问路径绑定,只有配置正确的映射规则,客户端才能通过对应的URL访问到对应的Servlet处理逻辑。

servlet-mapping的基本结构
servlet-mapping的配置需要包含两个核心子元素,分别是servlet-name和url-pattern。servlet-name需要和之前定义的servlet元素中的servlet-name保持一致,url-pattern则是具体的URL映射规则。基本配置示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 定义Servlet -->
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.example.TestServlet</servlet-class>
</servlet>
<!-- 配置Servlet映射 -->
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
URL路径映射的三种匹配规则
1. 精确匹配
精确匹配是最常用的匹配方式,url-pattern配置为具体的路径字符串,只有当客户端请求的URL和配置的路径完全一致时,才会匹配到对应的Servlet。例如配置/test,那么只有访问http://localhost:8080/项目名/test时才会触发该Servlet,访问/test/abc或者/test.do都不会匹配。
2. 路径匹配
路径匹配使用通配符*表示匹配任意路径,配置格式为/开头+*结尾,例如/user/*。这种规则会匹配所有以/user/开头的URL请求,比如/user/list、/user/info/1都可以匹配到对应的Servlet。需要注意的是,*只能放在路径的末尾,不能写成/*.do这种格式,否则会被识别为扩展名匹配之外的错误格式。
3. 扩展名匹配
扩展名匹配用于匹配指定后缀的请求,配置格式为*.扩展名,例如*.do。这种规则会匹配所有以.do结尾的URL请求,不管前面的路径是什么,比如/user/list.do、/order/save.do都会匹配到对应的Servlet。扩展名匹配不能和路径匹配混合使用,比如/user/*.do是不合法的配置。
匹配规则的优先级顺序
当客户端请求的URL同时满足多种匹配规则时,会按照以下优先级从高到低进行匹配:
- 精确匹配的优先级最高,只要存在完全匹配的
url-pattern,就会直接使用该映射 - 路径匹配的优先级次之,如果有多个路径匹配符合,会匹配路径更长的那个,比如
/user/*比/*优先级更高 - 扩展名匹配的优先级最低,只要存在符合的扩展名匹配,就会使用该映射
- 如果以上规则都不匹配,容器会尝试查找对应的静态资源,找不到则返回404错误
特殊映射规则说明
有一个特殊的url-pattern配置为/,它会匹配所有未被其他规则匹配的请求,包括静态资源请求,通常被用作前端控制器的映射,比如Spring MVC的DispatcherServlet就常用这个配置。如果配置为/*,则会匹配所有请求,包括JSP页面的请求,一般不建议这样配置,否则会导致JSP无法正常渲染。
实际配置示例
以下是一个包含多种映射规则的完整web.xml配置示例:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 精确匹配Servlet -->
<servlet>
<servlet-name>ExactServlet</servlet-name>
<servlet-class>com.example.ExactServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ExactServlet</servlet-name>
<url-pattern>/exact</url-pattern>
</servlet-mapping>
<!-- 路径匹配Servlet -->
<servlet>
<servlet-name>PathServlet</servlet-name>
<servlet-class>com.example.PathServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PathServlet</servlet-name>
<url-pattern>/path/*</url-pattern>
</servlet-mapping>
<!-- 扩展名匹配Servlet -->
<servlet>
<servlet-name>ExtServlet</servlet-name>
<servlet-class>com.example.ExtServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ExtServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
对应的Servlet处理逻辑示例:
package com.example;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ExactServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("精确匹配Servlet被访问");
}
}
servlet-mappingweb.xmlURL路径映射Java_Web修改时间:2026-06-23 03:15:35