Spring MVC基础Web应用运行时出现404错误求助
这个404错误通常意味着请求的资源找不到,结合你提供的代码,我整理了几个最可能的原因和对应的修复方案:
1. 检查控制器类的包路径是否匹配组件扫描配置
你的spring-servlet.xml里配置了组件扫描的包是com.javatpoint:
<context:component-scan base-package="com.javatpoint" />
但你的HelloController.java代码里没有显示包声明,必须确保控制器类确实在com.javatpoint包下。如果你的控制器在其他包(比如默认包或者自定义的其他包),Spring就无法扫描到这个控制器,自然找不到/hello的映射。
修复:给HelloController添加正确的包声明,比如:
package com.javatpoint; // 必须和component-scan的base-package一致 import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { // ... 你的原有代码 }
2. 修正Servlet API依赖的版本和范围
你pom.xml里的servlet-api依赖有两个问题:
- 版本是
3.0-alpha-1,这是一个非常早期的测试版本,稳定性差,建议换成稳定版,比如3.1.0或者更高; - 没有设置
<scope>provided</scope>,这个依赖是Web容器(比如Tomcat)已经提供的,如果不设置provided,打包时会把它加入到war包,容易和容器自带的Servlet API冲突。
修复后的依赖:
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
(注意:artifactId也从servlet-api改成了javax.servlet-api,这是规范的写法)
3. 确保视图文件的位置符合视图解析器配置
你的视图解析器配置是:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean>
这意味着viewpage.jsp和errorpage.jsp必须放在WEB-INF/jsp/目录下,而不是直接放在WEB-INF或者项目根目录。如果你的这两个jsp文件位置不对,Spring找不到视图,也会触发404。
修复:创建WEB-INF/jsp/目录,把viewpage.jsp和errorpage.jsp移到这个目录里。
4. 修正表单提交的路径(避免上下文路径问题)
你的表单action是hello,如果你的项目部署时有上下文路径(比如项目名是SpringMVC,访问路径是http://localhost:8080/SpringMVC/),直接写hello会导致提交路径变成http://localhost:8080/hello,而不是正确的http://localhost:8080/SpringMVC/hello。
修复:使用JSP的内置对象获取上下文路径,修改表单的action:
<form action="${pageContext.request.contextPath}/hello">
5. 检查DispatcherServlet的配置文件位置
你的web.xml配置看起来没问题,但要确保spring-servlet.xml确实在WEB-INF目录下(因为默认情况下,DispatcherServlet会加载WEB-INF/[servlet-name]-servlet.xml,这里servlet-name是spring,所以是WEB-INF/spring-servlet.xml)。如果你的配置文件放在了其他位置,需要在<servlet>标签里添加<init-param>指定配置路径:
<servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> <!-- 这里写你的配置文件实际路径 --> </init-param> <load-on-startup>1</load-on-startup> </servlet>
按照上面的步骤逐一检查修复,应该就能解决这个404问题了。
内容的提问来源于stack exchange,提问作者coder123

