You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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接管,自然找不到对应的控制器逻辑。

解决方法(二选一即可):

  1. 修改JSP的链接路径:改成和控制器映射一致的路径,同时建议加上项目上下文路径,避免因JSP所在位置导致的相对路径错误:
    <%@ page isELIgnored="false" %>
    <a href="${pageContext.request.contextPath}/hello">click</a>
    
    这里${pageContext.request.contextPath}会自动获取项目的部署上下文路径,不管项目部署在什么环境下都能正确定位。
  2. 修改控制器的映射路径:把控制器的@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控制器的最佳实践

  1. 优先使用绝对路径+上下文路径:永远不要用纯相对路径(比如直接写hello),通过EL表达式获取上下文路径能避免绝大多数路径问题;
  2. 保持映射路径一致性:控制器的@RequestMapping路径要和前端调用的路径完全匹配(包括后缀,如果项目有统一规范的话);
  3. 处理静态资源冲突:如果用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:17:23