Spring MVC项目部署嵌入式Tomcat访问指定路径报404错误求助
Spring MVC嵌入式Tomcat启动后访问404问题排查
线上学习Spring课程,使用Java配置的Spring MVC框架,通过Eclipse启动嵌入式Tomcat后,访问localhost:8080/myprojectname出现404错误页面,尝试多种解决方案无效。
补充说明:暂未创建.ftl文件,课程中老师执行相同操作可正常显示内容,自身经验不足,表述若有疏漏请见谅。
相关代码
AppInitializer.java
package it.myshop.web; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.FrameworkServlet; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return null; } @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] {MyShopConfig.class}; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } @Override protected FrameworkServlet createDispatcherServlet(WebApplicationContext servletAppContext) { DispatcherServlet ds = new DispatcherServlet(servletAppContext); ds.setThrowExceptionIfNoHandlerFound(true); return ds; } }
MyShopConfig.java
package it.myshop.web; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver; @ComponentScan(basePackages = "it.myshop.web.controller") @Configuration @EnableWebMvc public class MyShopConfig { @Bean public FreeMarkerViewResolver configureResolver() { FreeMarkerViewResolver resolver = new FreeMarkerViewResolver(); resolver.setPrefix(""); resolver.setSuffix(".ftl"); return resolver; } @Bean public FreeMarkerConfigurer configureFreeMarker() { FreeMarkerConfigurer config = new FreeMarkerConfigurer(); config.setTemplateLoaderPath("/WEB-INF/view/"); return config; } }
WelcomeController.java
package it.myshop.web.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/") public class WelcomeController { @GetMapping("/") public String welcome(ModelMap model) { model.addAttribute("message", "Ciao, benvenuto nel mio e-commerce!"); return "welcome"; } }
待创建的welcome.ftl内容
<!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Welcome page!</title> </head> <body> <h1>${message}</h1> </body> </html>
排查方向
- 模板文件缺失:控制器返回
"welcome",对应需要在/WEB-INF/view/目录下创建welcome.ftl文件,FreeMarker视图解析器必须匹配到对应模板才能正常渲染页面,缺失会直接导致视图解析失败引发404。 - 上下文路径验证:检查Eclipse中嵌入式Tomcat的上下文路径设置,确认是否为
myprojectname,部分默认配置下上下文路径为/,此时访问路径应为localhost:8080/。 - 组件扫描有效性:确认
WelcomeController所在包it.myshop.web.controller与MyShopConfig中@ComponentScan指定的包名完全一致,避免因包名拼写错误导致控制器未被扫描加载。 - 目录结构检查:确保
src/main/webapp/WEB-INF/view/目录存在(Maven项目结构),若不存在需手动创建,否则FreeMarker无法找到模板文件。 - 日志异常查看:你已开启
setThrowExceptionIfNoHandlerFound(true),可查看控制台日志是否有"No handler found"异常,以此判断请求是否到达DispatcherServlet、控制器是否被正确映射。
内容的提问来源于stack exchange,提问作者Golter
相关产品推荐
相关产品推荐

