在网上搜了很多答案,但讲的最清楚明白的是这篇吧:
https://blog.csdn.net/jinghuashuiyue2/article/details/78589655
上面文章搞懂之后可以再看这篇文章:
https://blog.csdn.net/hei_chen/article/details/78909700
在这里不讲精准匹配,后缀匹配这些,只需要知道这些匹配的优先级就行
1.精确路径匹配2.最长路径匹配3.扩展匹配4.如果前面三条规则都没有找到一个 servlet ,容器会根据 url 选择对应的请求资源。如果应用定义了一个 default servlet ,则容器会将请求丢给 default servlet。
此时/*对应的是最长路径匹配 / 对于的是默认servlet,所以/*和/ 都匹配资源(无所谓什么路径匹配还是后缀匹配,反正这些都匹配,即只要是url都匹配), /不匹配.jsp是因为此时有专门的 .jsp所对应的jspServlet,此时属于扩展匹配,比默认匹配优先级高。 其他详细见下。
总结一下这篇文章。
在web.xml中有一个默认的DefaultServlet,这个servlet专门用来处理静态资源。DefalutServlet(又叫默认Servlet、缺省Servlet)的路径配置恰巧是 / ,也就是说其它Servlet不能匹配的请求将由它进行处理。
当我们在自己的Servlet中配置 / 的时候会覆盖Tomcat中config/web.xml中的 / 配置,这时如果我们不对静态资源进行相应的处理的时候,将导致静态资源无法访问。可见,Tomcat中的config/web.xml中的缺省Servlet主要处理的就是静态资源的访问。
/和/*的区别
当在自己的servlet中配置/*时
其实 / 和 /* 都可以匹配所有的请求资源,无论是所谓路径型的还是后缀型的(因为即使匹配了也不一定能够处理),但其匹配的优先顺序是不同的。 / 在所有的匹配路径中,优先级最低,即当别的路径都无法匹配时,/ 所匹配的缺省Servlet才会进行相应的请求资源处理。而 /* 匹配的优先级是高于 / 路径和 星号.后缀 的路径的(如星号.action,星号.jsp等路径)。
也就是说只要servlet配置了 /* 那么 / 永远也不会匹配。
此时当我们访问localhost:8080会报404,当强行访问jsp资源时,例如localhost:8080/hello/index.jsp时,会把jsp内容以文本形式显示出来(这是在静态资源访问配置开启的前提之下),当静态访问配置给注释掉后,又会报404错误,也就是说此时直接访问jsp,服务器把index.jsp当成了静态资源响应给了浏览器,所有我们会看到一个文本页面。
那么为什么在配置成/*后index.jsp就不能正常访问了?原来在Tomcat中conf/web.xml中配置了org.apache.jasper.servlet.JspServlet用来处理.jsp这样的资源了(第113行)。
内容如下:
The JSP page compiler and execution servlet, which is the mechanism used by Tomcat to support JSP pages. Traditionally, this servlet is mapped to the URL pattern "*.jsp".)
中文意思是
JSP页面编译器和执行servlet,这是Tomcat用来支持JSP页面的机制。(意思就是这个servlet专门编译jsp页面并执行)传统上,这个servlet被映射到URL模式“*.jsp”。
综上可知在web.xml中专门有个JspServlet出来后缀为 .jsp的请求,当配置了/*的时候这个后缀匹配自然也永远匹配不到了。当然还有 / 所对应servlet也匹配不到。
总结:所以 / 可以说是默认的servlet映射,当url找不到合适的匹配的就会调用默认的这个servlet。此时会覆盖对静态资源的访问的servlet,所以要想访问静态资源就要添加额外的配置。
/*和/都是可以匹配任何资源的,但/*的优先级更高,当请求资源与其它Servlet都无法匹配的时候,/所配置的Servlet才会匹配。使用/*时会同时覆盖默认servlet和.jsp所对应的JspServlet,也就是说jsp永远也无法正常编译执行了,只能算是静态资源了(即使访问到了显示的也是源码而不是编译后的jsp),要想访问静态资源也要添加额外配置。
额外补充(常用的):
在springMVC配置文件配置当一个请求找不到处理器时将会把它交给容器本身处理
<!-- 在springMVC配置文件中添加以下代码 -->
<mvc:default-servlet-handler />