今天在写项目时,发现了这样一个现象:初始状态是这样的,web-app下有一个index.html,web.xml将这个index.html配置为欢页;WEB-INF下有一个index.jsp;只写了一个没有添加@RequestMapping做窄化请求的Controller类,这个Controller只有一个@RequestMapping("/index")的方法;DispatcherServlet的url-pattern为"/"。然后当浏览器访问http://localhost:8080时,我本以为出现的应该是欢迎页index.html,但是却出现了index.jsp。
这让我感到奇怪,欢迎页<welcome-file-list>和DispatcherServlet的优先级到底是怎样的?如果是DispatcherServlet的优先级更高,那么"/"的请求为什么会被@RequestMapping("/index")响应?接着我做了几个实验。
实验1:把@RequestMapping("/index")修改为@RequestMapping("/index/"),后面加了个斜杠,此时再访问http://localhost:8080,返回的是404,也就是说不再能够匹配到@RequestMapping。
实验2:恢复初始状态,把index.html改为test.html,同时修改web.xml里的欢迎页为test.html,访问http://localhost:8080,返回404。综合上面一个实验,只要使html和@RequestMapping异名就不会匹配到@RequestMapping。
实验3:恢复初始状态,把DispatcherServlet的时候url-pattern改为其他,使它不再拦截"/",访问http://localhost:8080,返回欢迎页index.html。
上面几个实验只能说明"/"的请求既被web.xml的欢迎页响应,也被DispatcherServlet响应。花了半天多的时间,看了很多资料,也找了几个人问了问,最后还是没有弄明白产生这个现象的机制。如果不是配置上的错误,那么也许要到以后看Tomcat、Spring MVC源码才能弄清楚了吧。
上传源码,留待填坑。点击打开链接