Spring MVC使用@RequestMapping注解出现HTTP 404错误如何解决?
问题排查及解决方案
根因梳理
- 核心兼容性问题:你使用的Tomcat 10属于Jakarta EE技术栈,全部Servlet包从
javax.servlet.*重命名为jakarta.servlet.*,而Spring MVC 4完全基于Java EE的javax.servlet.*开发,两者不兼容,请求无法被Spring MVC正常拦截处理,这是出现404的最主要原因。 - 配置重复:
todo-servlet.xml中重复声明了两次<mvc:annotation-driven/>,可能导致MVC注解配置冲突。 - 缺少视图解析器配置:Spring MVC没有配置视图解析器,无法正确映射Controller返回的视图名到实际的jsp文件。
- web.xml版本过低:当前使用的web.xml 2.3版本过于老旧,无法适配Spring MVC 4的最低运行要求。
- 路径适配问题:表单提交路径未添加项目上下文根,若项目部署时带自定义上下文路径,会出现请求地址不匹配。
具体修复步骤
- 解决版本兼容性问题
二选一即可:
- 方案1:将Tomcat版本降级到9.x及以下版本,Tomcat 9仍使用
javax.servlet.*包,可直接兼容Spring MVC 4 - 方案2:若需保留Tomcat 10,将Spring MVC版本升级到6.x及以上,适配Jakarta EE规范
- 修正
todo-servlet.xml配置
删除重复的<mvc:annotation-driven/>,新增视图解析器配置,修改后完整配置如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.telusko"></context:component-scan> <mvc:annotation-driven enable-matrix-variables="true"/> <!-- 新增视图解析器,prefix根据你的jsp存放位置调整,以下示例为jsp放在webapp根目录 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
- 修改
AddController.java返回值
视图解析器已配置后缀,无需再写.jsp后缀:
package com.telusko; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class AddController { @RequestMapping("/add") public String add() { return "display"; } }
- 升级web.xml版本并优化配置
替换原有web.xml的头部和内容,使用3.0以上版本,添加servlet启动加载配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>todo</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>todo</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
- 修正表单提交路径
修改index.jsp的form的action属性,添加上下文根适配:
<html> <body> <form action="${pageContext.request.contextPath}/add"> <input type="text" name="t1"></br> <input type="text" name="t2"></br> <input type="submit"> </form> </body> </html>
- 检查
display.jsp文件是否存在,确保放在webapp根目录下(和index.jsp同层级)。
内容的提问来源于stack exchange,提问作者shantanu srivastava
相关产品推荐
相关产品推荐

