首先我们应带明白:这是过滤器的条件限制,比如当我们设置*.do的时候,所有的*.do请求路径都会被中央调度器拦截。
中央调度器有点像是过滤器。
/解释:
/原本是调用Tomcat的DefaultServlet的。这个DefaultServlet是专门处理那些找不到路径的请求最后都转发到了这里。
所以当我们调用静态资源时,我们写的Servlet路径是无法匹配的,最终就会调用DefaultServlet进行调用静态资源。
但是这样我们在SpringMVC中设置/后,有创建了一个DefaultServlet,实现了静态资源访问,这到底是怎么实现的呢?
因为我们配置的/就已经表示了处理找不到的请求啊?关键解题点应该是再我们创建的defaultServlet的地址栏是什么?
它不应该也是/吧,因为我们已经给中央调度器配置了/。
首先我们应该理解/代表的是什么意思?/代表localhost:8080/myWeb,代表的是所有以这个路径开头的url地址,但是他的优先级最递,
所以才能被/one给抢走。这样就造成了没有匹配到路径的url地址请求最后都会走到/.
所以我猜测,我们写的defaultServlt的优先级要高于这个中央调度器的/,但是我们用符号才能表示所有的静态资源都会先找我们写的defaultSerlet呢?
JspServlet的访问路径是什么?
*.jsp,*.jspx
/*再tomcat代表什么意思呢?
/*再tomcat的配置文件中匹配了好几个对象
failedRequestFilter:The mapping for the Failed Request Filter
setCharacterEncodingFilter:The mapping for the Set Character Encoding Filter
httpHeaderSecurity:The mapping for the HTTP header security Filter
为什么一个/*可以匹配好几个Servle?
通常而言一个url只对应一个Servlet,他要是有好几个Servlet,/*怎么知道匹配给那个Servlet?
首先我们应当明白/*可以匹配到所有的路径,所以他常常用于过滤器,然后过滤器对请求url进行筛选或者增强后,然后放行,让他在接着匹配我们写的Servlet。
之所以会这样是因为/*的优先级最高。
在tomcat中的/*路径其实是被注释掉的,这就是说其实在tomcat启动的时候是没有创建上面的三个过滤器的,自然就不存在/*匹配三个过滤器的问题了.
过滤器是我们自己手动设置的。
那这是不是就说明上文的三个过滤器是没有方法并存的呢?
不是的,我猜测应该是可以并存的。这应该牵扯到了tomcat是url和相应的servlet进行匹配。
我猜测他应该是将web.xml的路径全都放到了一个list集合中,由于有优先级的问题,/*放在最前面,/放在最后面,然后进行for循环。
前几个过滤器/*路径都会被进行匹配,谁先谁后都无所谓,但是过滤器并不会结束本次循环,当/*循环完后,其实就实现了过滤功能,
然后再接着走,当匹配到我们自己写的/one路径时,会进行匹配并结束for循环。
综上所述:/*和/都能匹配所有路径,只不过是优先级不同,/*最高,用于过滤增强;/最低,用于兜底。
为什么在中央处理器配置/后,会导致静态资源无法访问?
我们配置的中央处理会取代DefaultServlet,然后静态资源就没有Servlet调用了。
为什么我们自己配置dearultServlt后,就可以访问静态资源了呢?
/路径已经被中央处理器拿走了,我们配置的中央处理器路径应该是什么才能匹配到所有的静态资源请求的?
我们可以写*.html,*.png,*.mp3……这样就可以优先匹配所有的静态资源了。
为什么中央处理器配置/*后,会导致jsp页面无法访问呢?或者显示为原码?
这时因为JSPServlet的访问路径是*.jsp,/*的优先级要高于*.jsp,这样就会导致JspServlet无法访问,
直接访问的就是index.jsp,并没有转换成Servlet,所以才回出现原码。
那这样的话我刚才的推理就不对了,/*是会结束for循环的?
不对再tomcat中/*代表的是过滤器,过滤器内部没有结束循环,而是放行了。
但是当/*代表中央处理器的时候,中央处理器没有放行一说,会结束for循环。
我的猜测是正确的。