最近,使用Tomcat10运行SpringMVC项目时遇到了问题。报错内容为
"org.springframework.web.servlet.DispatcherServlet' is not assignable to 'javax.servlet.Servlet,jakarta.servlet.Servlet"
或者"java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet"。
1.检查依赖配置 在pom.xml文件中,确保以下依赖项已正确配置:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.0.2</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
2.检查web.xml配置 在web.xml文件中,确保以下配置已正确设置:
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<!--servlet: DispatcherServlet-->
<servlet><!-- 配置一个servlet -->
<servlet-name>SpringMVC</servlet-name> <!--与servlet-mapping中的servlet-name相匹配 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定配置的类为请求【派发】控制器 -->
<init-param> <!-- 初始化参数,配置spring容器 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 不能在第一次访问的时候进行容器的初始化,需要的时间太长了 -->
<!-- <load-on-startup>1</load-on-startup> <!– 表示容器启动时会先加载标有该数字的 Servlet,数字越小,优先级越高 –>-->
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern> <!-- 所有的请求【除了jsp】都会起码走 / 路径,所以所有的请求都被统一调度了 -->
</servlet-mapping>
</web-app>
关于为什么在web.xml中使用version="5.0"而不是4.0的原因是,Tomcat 10已经升级到了Jakarta EE 9规范,因此需要使用对应的XML Schema定义。通过将version设置为"5.0",可以确保web.xml文件与Tomcat 10的规范相匹配。