今天在和朋友交流技术时证实了以前一直模糊的一件事。那就是所有经过Tomcat的请求都是有一个servlet来处理的。如果一个请求没有匹配到任何应用指定的servlet,那么就会流到Tomcat的默认的servlet来处理。默认的DefaultServlet是配置在$catalina/conf/web.xml里面的相关servlet配置如下:
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
servlet的mapping映射关系如下:
<!-- The mapping for the default servlet --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
(因为注释太多在此隐去,建议感兴趣的看客可以到$catalina/conf/web.xml目录下看看,很有用的)
默认情况下,DefaultServlet是映射到根目录的。可能有人会问“<url-pattern>/</url-pattern>”这个和我们应用配置的不会冲突吗?有相关疑问的可以查看以下博文:
http://k1121.iteye.com/blog/1564241
当我们浏览器输入“http://localhost:8080/test.html” 向tomcat容器发送一个静态文件请求时,就会调用tomcat的org.apache.catalina.servlets.DefaultServlet类的doGet()方法进而通过serveResource()等方法取出需要的资源,然后加载进来,并且判断相应的mime类型设置不同的HTTP head,然后输出到页面上。
<!-- ===================== Default MIME Type Mappings =================== --> <!-- When serving static resources, Tomcat will automatically generate --> <!-- a "Content-Type" header based on the resource's filename extension, --> <!-- based on these mappings. Additional mappings can be added here (to --> <!-- apply to all web applications), or in your own application's web.xml --> <!-- deployment descriptor. --> <mime-mapping> <extension>html</extension> <mime-type>text/html</mime-type> </mime-mapping>
实验:
如果按照以下内容修改$catalina/conf/web.xml中的servlet-mapping:
<!-- The mapping for the default servlet --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.test</url-pattern> </servlet-mapping>
则当我们浏览器输入“http://localhost:8080/test.html” 向tomcat容器发送一个静态文件请求时则会报“HTTP/1.1 404 Not Found”