Spring MVC(Maven)项目控制器无法返回JSP页面(HTTP 404)求助
嘿,我之前也碰到过一模一样的问题!在Maven搭建的Spring MVC项目里,控制器明明写了返回视图名,结果访问就跳404,折腾了好一会儿才找到原因。先看看你提供的spring-servlet.xml配置片段(看起来内容被截断了,不过我可以基于常见问题给你梳理排查方向):
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframewor..."> <!-- 你的配置内容 --> </beans>
下面是几个最容易出问题的地方,你可以逐一排查:
1. 视图解析器是否正确配置
这是最常见的原因!Spring MVC需要InternalResourceViewResolver来把控制器返回的逻辑视图名转换成实际的JSP文件路径。检查你的spring-servlet.xml里有没有这个bean:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- JSP文件所在的父路径,根据你的项目结构调整 --> <property name="prefix" value="/WEB-INF/views/"/> <!-- JSP文件的后缀 --> <property name="suffix" value=".jsp"/> </bean>
比如你控制器返回"home",那Spring会去找/WEB-INF/views/home.jsp,如果你的JSP放在别的路径,一定要修改prefix的值。
2. 组件扫描是否覆盖了控制器包
确保你配置了组件扫描,并且包路径准确指向你的控制器所在位置,不然Spring根本找不到你的@Controller类:
<context:component-scan base-package="com.yourpackage.controller"/>
把com.yourpackage.controller换成你实际的控制器包路径。
3. 是否启用了MVC注解驱动
别忘了加<mvc:annotation-driven/>标签,它会自动注册处理@RequestMapping、参数绑定等功能的核心bean,没加的话控制器的请求映射可能完全不生效:
<mvc:annotation-driven/>
4. JSP文件的实际路径是否匹配
手动核对一下JSP文件的位置,比如视图解析器prefix是/WEB-INF/views/,那你的JSP必须放在src/main/webapp/WEB-INF/views/目录下(Maven项目的web资源根目录是src/main/webapp),文件名也要和控制器返回的视图名一致,大小写也要注意!
5. Maven打包是否正确包含了web资源
有时候Maven默认配置会漏掉webapp目录下的文件,导致打包后的war里没有JSP。可以在pom.xml里添加资源配置,确保WEB-INF下的内容被正确打包:
<build> <resources> <resource> <directory>src/main/webapp</directory> <targetPath>/</targetPath> <includes> <include>**/*</include> </includes> </resource> </resources> </build>
6. 控制器方法有没有误加@ResponseBody
如果你的控制器方法加了@ResponseBody注解,Spring会直接把返回的字符串作为响应内容返回,而不会去寻找对应的JSP页面。比如下面这种写法就会导致404(因为不会找JSP):
@Controller public class HomeController { @RequestMapping("/home") @ResponseBody // 这个注解会导致直接返回字符串,不走视图解析器 public String home() { return "home"; } }
把@ResponseBody去掉就好了,除非你是要返回JSON或纯文本。
内容的提问来源于stack exchange,提问作者bharath

