百度上查找了很多,但是那些第一行第二行的都错了,还差点误导我。
/*可以拦截所有url,包括带后缀的,这个他们没讲错。
但是他们说/的url-pattern不能匹配带后缀的url,比如.html,.jsp等等,这个当时就让我感觉非常困惑。
使用spring mvc的DispatherServlet的url-pattern不就是经常用/作为匹配规则的吗?
而且DispatherServlet一样可以收到各种带后缀的url请求,然后让controller处理,一直都这么用。
然后又是到处查资料,终于搞明白了:
tomcat或者其他容器,都有一个默认servlet,当其他servlet的url-pattern都不匹配请求url时,该请求就会交给默认servlet处理,
默认servlet能够处理 静态资源、HTTP缓存请求,媒体(音频/视频)数据流和文件下载。
然后呢,默认servlet的url-pattern就是/,当你的servlet的url-pattern用/匹配,那么就代表你的servlet替代了默认servlet了。
那如果需要处理静态资源什么的,你的servlet就要自己处理了。
springmvc 的DispatherServlet就是这样,静态资源什么的也是自己处理,或者在内部使用容器默认的servlet
spring mvc自己处理静态资源就是我们熟悉的<mvc:resource ...../>
spring mvc调用默认servlet处理也是熟悉的<mvc:default-servlet-handler>.
所以,最后总结,/和/*的区别就是:/*的匹配规则比/更详细,所以,如果有/*与/同时存在,那么/*会优先匹配。
一般如果我们自己写servlet,那url-pattern是尽量不要设置成/以及/*,道理应该显而易见的,除非专门的框架,否则正常的一个servlet怎么可能会去处理所有请求?
一般情况下建议:/*给filter使用,/给mvc框架实现的servlet使用