java.lang.IllegalArgumentException: 名为 [MyServlet]和 [com.example.MyServlet] 的servlet不能映射为一个url模式
·
java.lang.IllegalArgumentException: 名为 [MyServlet]和 [com.example.MyServlet] 的servlet不能映射为一个url模式(url-pattern) [/test.do]

MyFilter类
package com.example;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import java.io.IOException;
// 过滤所有以 .do 结尾的请求
@WebFilter("*.do")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFilter 初始化完成");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("请求进入 MyFilter,开始处理请求...");
// 继续执行后续的过滤器或 Servlet
chain.doFilter(request, response);
System.out.println("请求离开 MyFilter,响应已处理完成");
}
@Override
public void destroy() {
System.out.println("MyFilter 销毁完成");
}
}
MyServlet类
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
// 处理 /test.do 请求
@WebServlet("/test.do")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h2>这是 MyServlet 处理的请求</h2>");
out.println("</body></html>");
}
}
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">
<!-- 配置过滤器 -->
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<!-- 配置 Servlet -->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/test.do</url-pattern>
</servlet-mapping>
</web-app>


根据错误信息 名为 [MyServlet]和 [com.example.MyServlet] 的servlet不能映射为一个url模式 [/test.do],这通常是由于 同一个 URL 模式被多个 Servlet 重复映射 导致的。以下是详细分析和解决方案:
错误原因
在 Tomcat 中,同一个 URL 模式(如 /test.do)不能同时被两个不同的 Servlet 映射,无论通过注解还是 web.xml 配置。错误信息中的 MyServlet 和 com.example.MyServlet 可能是以下两种情况:
- 注解与
web.xml冲突:在 Servlet 类上使用了@WebServlet("/test.do"),同时又在web.xml中手动配置了另一个 Servlet 映射到/test.do。 - 重复配置:在
web.xml中重复声明了同一个 Servlet 的映射。
解决方案
1. 检查 Servlet 注解与 web.xml 的配置
-
示例代码中的冲突:
- 在
MyServlet类上有@WebServlet("/test.do")。 - 同时在
web.xml中配置了<servlet-mapping>映射/test.do到MyServlet。 - 这会导致 Tomcat 认为两个不同的 Servlet(一个通过注解,一个通过
web.xml)映射到了同一个 URL。
- 在
-
修复方法:
- 删除
web.xml中的 Servlet 配置,仅保留注解:java
@WebServlet("/test.do") // 注解已配置 URL,无需在 web.xml 中重复 public class MyServlet extends HttpServlet { ... } - 或者 删除注解,仅使用
web.xml配置:java
public class MyServlet extends HttpServlet { ... } // 移除 @WebServlet 注解xml
<!-- 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>/test.do</url-pattern> </servlet-mapping>
- 删除
2. 检查是否有重复的 Servlet 映射
- 确保
web.xml中没有多个<servlet-mapping>指向同一个 URL 模式。例如:xml
<!-- 错误示例:两个不同的 Servlet 映射到同一个 URL --> <servlet-mapping> <servlet-name>AServlet</servlet-name> <url-pattern>/test.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>BServlet</servlet-name> <url-pattern>/test.do</url-pattern> </servlet-mapping>
完整修复后的代码
1. 仅使用注解配置
java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
// 注解直接配置 URL,无需 web.xml
@WebServlet("/test.do")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h2>这是 MyServlet 处理的请求</h2>");
out.println("</body></html>");
}
}
2. 仅使用 web.xml 配置
java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
// 移除 @WebServlet 注解
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h2>这是 MyServlet 处理的请求</h2>");
out.println("</body></html>");
}
}
xml
<!-- web.xml -->
<web-app ...>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/test.do</url-pattern>
</servlet-mapping>
</web-app>
其他注意事项
- 确保类路径正确:检查
web.xml中的<servlet-class>是否与实际包路径一致(如com.example.MyServlet)。 - 清理 Tomcat 缓存:删除 Tomcat 目录下的
work和temp文件夹,避免旧配置残留。 - 重新部署项目:使用 IDE 的重新部署功能或手动替换
webapps目录中的项目文件。
通过以上步骤,应该能解决 Servlet 映射冲突的问题。如果仍有异常,请检查 Tomcat 日志中的其他错误信息。
更多推荐


所有评论(0)