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

Spring MVC将Dispatcher URL模式设为"/"致控制器失效及404错误求助

嘿,这个问题我太熟了!很多人第一次把DispatcherServlet的URL模式改成/都会踩这个坑。本质原因是当你把它设为/时,它就变成了容器的默认Servlet,接管了所有请求——包括静态资源、欢迎页这些原本由容器自己处理的内容,而Spring MVC默认不会处理这些非控制器请求,所以就出现了404。下面给你一步步搞定的方案:

具体解决步骤

1. 配置静态资源映射

首先得让Spring MVC知道哪些请求是静态资源,要转交给容器的默认Servlet处理,不然CSS、JS、图片这些都会返回404。

如果你用XML配置(比如dispatcher-servlet.xml):

添加以下配置二选一即可:

<!-- 方式一:精准指定静态资源路径,比如把所有/static/**开头的请求映射到/static目录下 -->
<mvc:resources mapping="/static/**" location="/static/"/>

<!-- 方式二:直接启用默认Servlet处理所有静态资源请求,更省心 -->
<mvc:default-servlet-handler/>

小贴士:mvc:default-servlet-handler会自动把静态资源请求转发给Tomcat(或其他容器)的默认Servlet,适合不想逐个配置静态资源路径的场景。

如果你用JavaConfig配置:

在你的Web配置类里重写addResourceHandlers方法:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 精准映射静态资源
        registry.addResourceHandler("/static/**")
                .addResourceLocations("/static/");
        
        // 或者启用默认Servlet处理所有静态资源
        // registry.addResourceHandler("/**")
        //         .addResourceLocations("/")
        //         .setCachePeriod(0);
    }
}

2. 调整欢迎页与跳转逻辑

原来的redirect.jsp通过response.sendRedirect("index.htm")跳转,但现在URL模式是/,没必要再用JSP跳转了,直接让控制器处理根路径请求更优雅:

修改你的控制器类,添加根路径的映射:

@Controller
public class IndexController {
    // 同时匹配根路径/和/index路径
    @GetMapping({"/", "/index"})
    public String index() {
        return "index"; // 这里返回的是视图名,对应你的index.jsp(要和视图解析器配置匹配)
    }
}

之后可以把redirect.jsp删掉,同时调整web.xml里的welcome-file-list:

<welcome-file-list>
    <welcome-file>index</welcome-file>
</welcome-file-list>

3. 确认视图解析器配置

确保你的视图解析器能正确找到控制器返回的视图文件,比如XML配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/> <!-- 视图文件所在目录 -->
    <property name="suffix" value=".jsp"/> <!-- 视图文件后缀 -->
</bean>

如果是JavaConfig:

@Bean
public ViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}

这样控制器返回"index"时,Spring就能找到/WEB-INF/views/index.jsp文件。

4. 检查控制器映射正确性

最后确认你的控制器类标注了@Controller注解,方法上的@GetMapping/@PostMapping等映射路径没有问题——原来的*.htm后缀可以去掉,改用REST风格的路径(比如/user/list而不是userList.htm)。

总结

核心就是两个关键点:

  • 告诉Spring MVC哪些是静态资源,交给容器处理;
  • 用控制器直接接管根路径请求,替代原来的JSP跳转逻辑。

按照上面的步骤调整后,你的DispatcherServlet设为/时应该就能正常工作了。

内容的提问来源于stack exchange,提问作者B K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:33:37