Demo应用启动加载index.jsp而非main-menu.jsp问题排查求助
问题排查与修复方案
兄弟,你遇到的这个情况在Spring MVC项目里挺常见的——明明配置了Controller映射,结果默认走了index.jsp,Controller还没被触发,大概率是核心配置没到位或者优先级冲突,我给你拆解几个常见问题点:
1. 核心DispatcherServlet没配置对
Spring MVC全靠DispatcherServlet来接管请求,如果你的web.xml里没配这个核心入口,或者映射路径不对,请求根本不会走到Controller层。
排查&修复:
先检查web.xml里有没有这段配置,要是没有赶紧补上:
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-mvc-config.xml</param-value> <!-- 换成你自己的Spring MVC配置文件路径 --> </init-param> <load-on-startup>1</load-on-startup> <!-- 启动就加载,确保比其他组件先初始化 --> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> <!-- 把所有请求都交给DispatcherServlet处理 --> </servlet-mapping>
要是已经配了,看看url-pattern是不是/——如果是*.do这种后缀匹配,那只有带.do的请求才会走Controller,根路径请求自然会被容器默认处理成index.jsp。
2. HomeController没被Spring识别到
要么是你没给Controller加注解,要么是Spring没扫描到这个类所在的包。
排查&修复:
- 先看你的HomeController类,必须加
@Controller注解,而且方法上的映射要对应根路径(或者你想要的触发路径):@Controller public class HomeController { @RequestMapping("/") // 根路径请求就触发这个方法 public String showMainMenu() { return "main-menu"; } } - 再检查你的Spring MVC配置文件,有没有开启组件扫描,而且要覆盖Controller所在的包:
<context:component-scan base-package="com.yourproject.controller"/> <!-- 换成你自己的Controller包路径 -->
要是没开扫描,Spring根本不知道有这个Controller存在,自然不会调用它。
3. 容器默认欢迎页优先级抢过了Controller
Tomcat这类Servlet容器默认会把index.jsp当欢迎页,当你访问根路径/时,容器会优先找index.jsp,而不是交给DispatcherServlet处理。
排查&修复:
- 方法一:直接删掉
web.xml里的welcome-file-list配置,让DispatcherServlet全权处理根请求; - 方法二:修改欢迎页为你的Controller映射路径,比如:
<welcome-file-list> <welcome-file>home</welcome-file> <!-- 对应Controller里@RequestMapping("/home")的路径 --> </welcome-file-list> - 方法三:要是不想删index.jsp,就在index.jsp里加一行跳转代码,主动转发到Controller路径:
<% response.sendRedirect("/your-app-context/home"); %> <!-- 替换成你的应用上下文和Controller路径 -->
4. 视图解析器配置(次要排查点)
虽然你现在的问题是Controller没被触发,但也可以顺便检查下视图解析器,避免后续跳页面出问题:
确保Spring MVC配置文件里有这个Bean:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- 你的jsp文件所在目录前缀 --> <property name="suffix" value=".jsp"/> <!-- 后缀,这样return "main-menu"就会找到/WEB-INF/jsp/main-menu.jsp --> </bean>
内容的提问来源于stack exchange,提问作者Alexander Pl
相关产品推荐
相关产品推荐

