Spring MVC表单提交404报错:No mapping for GET /demoMVC/output求助
我帮你梳理下这个404问题的几个核心原因,咱们一步步来排查修复:
1. 控制器包扫描路径错误(最关键问题)
你看你的控制器sampleController.java放在com.guni包下,但Spring配置文件里的组件扫描路径是:
<context:component-scan base-package="com.guni.Controllers"></context:component-scan>
这个路径是com.guni.Controllers,根本扫不到com.guni下的控制器!所以DispatcherServlet找不到处理/output请求的映射,直接返回404。
修复方案:
把组件扫描路径改成你的控制器所在的包:
<context:component-scan base-package="com.guni"></context:component-scan>
或者把控制器类移到com.guni.Controllers包下(记得修改Java文件的package声明)。
2. 缺少Spring MVC注解驱动配置
你的Spring配置文件里只开启了注解配置和组件扫描,但没有启用Spring MVC的注解驱动。<mvc:annotation-driven/>会自动注册处理@RequestMapping注解所需的处理器映射器和适配器,没有它的话,即使扫描到控制器,注解也不会生效。
修复方案:
在Spring配置文件里添加这个标签:
<mvc:annotation-driven/>
你的配置文件已经引入了mvc命名空间,直接加标签就行。
3. Spring配置文件的命名与位置问题
你在web.xml里配置的DispatcherServlet名字是sample,根据Spring MVC的默认规则,它会自动加载WEB-INF/sample-servlet.xml作为配置文件。如果你的配置文件名字不是这个,或者放在了其他位置,DispatcherServlet就加载不到配置,导致控制器映射失效。
验证与修复:
- 确认你的Spring配置文件命名为
sample-servlet.xml,并且放在WEB-INF目录下; - 如果想自定义配置文件路径,可以在
web.xml的<servlet>标签里添加初始化参数:
<servlet> <servlet-name>sample</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/你的配置文件名.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
4. 表单Action路径的上下文问题
你的表单action写的是output,当应用部署在上下文路径demoMVC下时,实际请求的是/demoMVC/output,这个路径本身是对的,但为了避免上下文路径变化导致的问题,建议用EL表达式动态获取上下文路径:
<form action="${pageContext.request.contextPath}/output">
这样不管你的应用上下文是什么,路径都会自动适配。
5. Spring Schema版本与Spring4.0不匹配
你的配置文件里用的是Spring3.0的schema(比如spring-beans-3.0.xsd),但你用的是Spring4.0框架,虽然可能兼容,但最好改成对应4.0版本的schema,避免潜在的配置冲突:
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"
最后验证步骤
- 把上述修改完成后,清理Eclipse项目(Project → Clean);
- 重新部署到Tomcat9,确保没有部署错误;
- 启动Tomcat,访问首页提交表单,应该就能正常跳转到
sampleOutput.jsp了。
内容的提问来源于stack exchange,提问作者user2476494

