1. url-patten 缺省值
想要了解JavaWeb静态资源访问流程,首先要先了解“url-patten 缺省值”的使用
当浏览器发送一个http请求时,tomcat通过请求中URL的路径,从应用中web.xml中查找“url-patten”对应的Servlet,实现对应Servlet的响应。
而有一种特殊的url-patten,即
<url-pattern>/</url-pattern>
当在web.xml中找不到对应的url-patten时,如果存在上面这样的url-patten 缺省值,则会找到其对应的servlet名字,从而找到对应的Servlet。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>test20201005</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>mytest1</servlet-name>
<servlet-class>com.test.servlet.myservelet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mytest1</servlet-name>
<url-pattern>/myservelet1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>mytest2</servlet-name>
<servlet-class>com.test.servlet.myservelet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mytest2</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
如web.xml的内容如上,当tomcat找不到该应用中对应的url-pattern时,则会根据url-pattern的缺省值设置,找到com.test.servlet.myservelet2这个servlet(类)。
2. 静态资源访问流程
了解完上面的url-pattern后。当访问一个静态资源(如http://localhost:8080/test20201003/index.html)时,也会当应用中的web.xml中查找对应的servlet(示例链接对应的url-pattern为/index.html),如果找不到,则会查找url-pattern的缺省值,如果该应用中web.xml没有配置url-pattern的缺省值,则会到全局的web.xml(conf/web.xml)查找有没有该servlet,如果在全局的web.xml中查找不到该servlet,则会在全局的web.xml中查找url-pattern的缺省值,而全局的web.xml中配置了url-pattern的缺省值如下:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
对应的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>
org.apache.catalina.servlets.DefaultServlet这个类会逐行读取静态资源文件(如示例链接中的index.html)并响应给浏览器,浏览器进行显示。