Spring MVC超链接调用控制器出现404错误的排查与解决
排查Spring MVC超链接404错误及正确调用指南
首先咱们拆解下你遇到的问题:点击JSP里的hello.html链接触发404,但你的控制器明明配置了/hello的映射。下面分几个核心原因和对应的解决方法,再聊聊正确调用Spring MVC控制器的最佳实践。
一、最直接的原因:URL路径与控制器映射不匹配
你的控制器用@RequestMapping("/hello")定义了请求路径,但JSP里的链接是hello.html——这里的矛盾点在于:
- 如果你的Spring MVC核心
DispatcherServlet在web.xml里配置的映射是/(处理所有请求),那么hello.html会被当成静态资源去查找,不会转发到控制器; - 如果
DispatcherServlet配置的是*.do这类后缀映射,那hello.html根本不会被DispatcherServlet接管,自然找不到对应的控制器逻辑。
解决方法(二选一即可):
- 修改JSP的链接路径:改成和控制器映射一致的路径,同时建议加上项目上下文路径,避免因JSP所在位置导致的相对路径错误:
这里<%@ page isELIgnored="false" %> <a href="${pageContext.request.contextPath}/hello">click</a>${pageContext.request.contextPath}会自动获取项目的部署上下文路径,不管项目部署在什么环境下都能正确定位。 - 修改控制器的映射路径:把控制器的
@RequestMapping改成和前端链接匹配的路径:@RequestMapping("/hello.html") public ModelAndView helloWorld() { // 原业务逻辑不变 String message = "HELLO SPRING MVC HOW R U"; return new ModelAndView("hellopage", "message", message); }
二、其他可能的配置疏漏
如果上面的修改后还是404,那得检查以下配置项:
- 组件扫描未开启:确保你的Spring MVC配置文件(比如
spring-servlet.xml)里开启了组件扫描,这样Spring才能识别到你的@Controller类:<context:component-scan base-package="com.javatpoint"/> - DispatcherServlet映射配置错误:检查
web.xml里的DispatcherServlet映射规则,比如想让它处理所有请求,应该配置:
如果项目习惯用统一后缀(比如<servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>.html),可以把映射改成*.html。
三、正确调用Spring MVC控制器的最佳实践
- 优先使用绝对路径+上下文路径:永远不要用纯相对路径(比如直接写
hello),通过EL表达式获取上下文路径能避免绝大多数路径问题; - 保持映射路径一致性:控制器的
@RequestMapping路径要和前端调用的路径完全匹配(包括后缀,如果项目有统一规范的话); - 处理静态资源冲突:如果用
DispatcherServlet映射/,记得在Spring配置里单独处理静态资源,避免静态资源请求被转发到控制器:<mvc:resources mapping="/static/**" location="/static/"/>
你的原始代码格式化后:
控制器代码:
package com.javatpoint; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class HelloWorldController { @RequestMapping("/hello") public ModelAndView helloWorld() { String message = "HELLO SPRING MVC HOW R U"; return new ModelAndView("hellopage", "message", message); } }
JSP代码:
<%@ page isELIgnored="false" %> <a href="hello.html">click</a>
内容的提问来源于stack exchange,提问作者user3898783
相关产品推荐
相关产品推荐

