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

