背景
众所周知,Tomcat的Default Servlet的servlet-mapping为
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
如果在基于SpringMVC的项目中做如下设置:
- DispatcherServlet的 url-pattern同样设置为 “/”,
- 在web.xml中添加
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
- 在后台代码中添加Controller,用于响应对应用根目录的访问,代码如下
@Controller
public class HomeController {
public HomeController() {
} @RequestMapping(value = "/",method = RequestMethod.GET)
public String home(){
return "home"; //home为/WEB-INF/views/home.jsp页面的逻辑名称
} @RequestMapping(value = "/test",method = RequestMethod.GET)
public String test(){
return "home";
}
}
那么问题如下:
如果访问应用的根路径,是返回index.html页面,还是进入HomeController 并返回 home.jsp?
测试结果
- 在DefaultServlet和DispatcherServlet同时生效的情况下:
- 如果存在index.html页面,则返回index.html,不会进入到Controller代码中
- 如果不存在index.html页面,则进入controller,并返回/WEB-INF/views/home.jsp页面
- 在DefaultServlet被注释,DispatcherServlet生效的情况下:
- 结果同上
- 在DefaultServlet被注释,DispatcherServlet不配置的情况下:
- 如果存在index.html页面,则返回index.html
- 如果不存在index.html页面,则报错
结果分析
- 默认欢迎文件的处理由Tomcat容器负责,与任何Servlet无关;
- 如果同时配置了处理根路径映射的Servlet和欢迎页面,则优先返回欢迎页面,请求不会到达Servlet;
- 如果DispatcherServlet的mapping为“/”,则DispatcherServlet会覆盖容器默认的DefaultServlet