Spring MVC未显示预期结果:为何始终展示Tomcat默认页而非test.jsp?
嘿,我来帮你排查下为啥Spring MVC没跳到你的test.jsp反而显示Tomcat默认页面,大概率是这几个地方出了问题,一个个来核对:
DispatcherServlet是Spring MVC的核心入口,如果它没接住你的请求,Tomcat就会直接返回默认页面。
- 如果你用XML配置(
web.xml),检查DispatcherServlet的<url-pattern>:- 要是你设成了
*.do这类后缀匹配,那你的请求路径必须带.do(比如/test.do)才会被处理; - 推荐设成
/,这样除了JSP请求外的所有请求都会交给DispatcherServlet处理,但要注意静态资源的处理(不过你现在的问题是JSP页面,先确保映射正确)。
示例配置:
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> - 要是你设成了
- 如果你用Java配置(
WebApplicationInitializer实现类),检查addServlet时的映射路径:@Override public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(SpringMvcConfig.class); ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(context)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); // 这里的映射要确保覆盖你的请求路径 }
你写的Controller有没有正确映射到你访问的路径?比如你期望访问/test跳转到test.jsp,但Controller的方法映射错了路径,那请求根本到不了处理逻辑。
举个正确的示例:
@Controller public class TestController { // 确保这里的路径和你浏览器输入的一致 @GetMapping("/test") public String showTestPage() { return "test"; // 返回的视图名要和视图解析器的配置对应 } }
注意:如果Controller类上加了@RequestMapping("/api"),那完整的访问路径就是/api/test,别漏了前缀!
Spring MVC需要视图解析器把你返回的视图名(比如上面的test)转换成实际的JSP文件路径,如果没配置或者路径错了,就找不到页面,甚至可能 fallback到Tomcat默认页。
- XML配置(
spring-servlet.xml):<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <!-- JSP文件所在的前缀路径 --> <property name="suffix" value=".jsp"/> <!-- 文件后缀 --> </bean> - Java配置(Spring MVC配置类):
@Configuration @EnableWebMvc @ComponentScan(basePackages = "com.yourpackage.controller") public class SpringMvcConfig implements WebMvcConfigurer { @Override public void configureViewResolvers(ViewResolverRegistry registry) { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); registry.viewResolver(resolver); } }
同时要确保你的test.jsp确实放在/WEB-INF/views/目录下,位置错了肯定找不到!
你是不是直接访问了localhost:8080/?如果你的项目在Tomcat里的部署上下文路径不是/(比如是/myapp),那正确的访问路径应该是localhost:8080/myapp/test,直接访问根路径的话Tomcat就会返回默认页面。
怎么查?在IDE的Tomcat部署配置里看“Context Path”,或者Tomcat的conf/server.xml里的<Context>标签的path属性。
如果web.xml里配置了欢迎页(比如index.html或index.jsp),当你访问根路径时,Tomcat会优先加载欢迎页,而不是走你的Controller。这时候你需要访问具体的请求路径(比如/test),而不是根路径。
示例欢迎页配置:
<welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
确保你的项目里已经引入了Spring MVC和Servlet API的正确依赖,避免因为依赖问题导致Spring MVC没正常启动:
Maven示例(pom.xml):
<!-- Spring MVC 依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.20</version> <!-- 选择适配你Tomcat版本的Spring版本 --> </dependency> <!-- Servlet API,设为provided避免和Tomcat自带的冲突 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
内容的提问来源于stack exchange,提问作者emon

