专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 Tomcat响应静态资源详解

Tomcat响应静态资源详解

更新时间:2020-12-10 17:32:15 来源:动力节点 浏览1032次

Tomcat访问所有的资源,都是用Servlet来实现的,所以Tomcat又叫Servlet容器,什么都交给Servlet来处理。当然,静态资源也不例外。静态资源可以理解为前端的固定页面,如css,html,js,jpg,png等。对于静态资源,Tomcat最后会交由一个叫做DefaultServlet的类来处理,DefaultServlet处理静态资源的过程就是Tomcat响应静态资源

 

可能你习惯性的打开Tomcat,在部署了一个应用之后,就开始查看其运行结果,或者更多的关注Servlet内的逻辑是否正确。至于静态资源处理这个事,可能不曾留意过。那我们一起来看看,Tomcat是如何响应静态资源的。

 

本质上讲,Tomcat对于所有的静态资源,会做统一处理。也就是在所有你没有配置URL匹配的地方,Tomcat这个全局统一处理的配置就开始接管工作了。那么,倘若我们没有配置这个东西,它怎么生效呢?

 

在Tomcat的conf目录下,就是有全局配置文件server.xml在同一个目录下,有一个web.xml,打开它之后,你会发现这样的说明:

 

The default servlet for all web applications, that serves static

 

resources. It processes all requests that are not mapped to other

 

servlets with servlet mappings.

 

再向下,你会看到关于这个全局处理的Servlet声明,也就是处理静态资源的DefaultServlet类。此处,它还有一个名为listings的初始化参数,默认值为false。这个参数主要作用,是在没有welcome文件时,控制应用目录内的文件是否允许列表显示。如果设置为true,就会常见的FTP服务器一样,把应用目录下的文件都列了出来,像下面这个样子。当然,这个样式也是可以自已定义的。

 

那么,既然url-pattern配置的是 / ,那不就应该响应所有的请求了么?

对,我们上面说明中也提到了,是匹配所有你没定义的Servlet-mapping的请求。而之所以自己定义的Servlet可以优先生效,则是因为Tomcat内的Servlet配置,是严格按照声明顺序初始化,并按此顺序响应请求,一层层按此比对,有一个可以响应请求,就用其处理。

下面我们来看DefaultServlet中,静态资源响应处理的部分源码,文件位于org.apache.catalina.servlets.DefaultServlet文件中。首先是这个文件,一般资源请求,都会走GET方法。

 

protected void doGet(HttpServletRequest request,

 

HttpServletResponse response)

 

throws IOException, ServletException {

// Serve the requested resource, including the data content

 

serveResource(request, response, true, fileEncoding);

 

}

 

 

serveResource这个方法内容较多,放在这里查看不太方便。大致总结下,首先会判断要请求的资源是否存在,文件是否可读,之后,根据资源的类型,设置响应头的content-type,判断文件的时间,设置超时时间等,最终是流的读写。

 

整个应用内的资源存放在resources这个变量内,声明如下:

 

/**

 

* The complete set of web application resources

 

*/

 

protected transient WebResourceRoot resources = null;

 

这块和上面内容有关联的地方是,读取文件的时候,会判断请求的路径对应的资源是否为一个文件夹,如果是目录,就会判断listings这个参数,为true时才会列出内容,否则直接返回内容找不到,即404。代码如下:

 

if (resource.isDirectory()) {

// Skip directory listings if we have been configured to

 

// suppress them

 

if (!listings) {

 

response.sendError(HttpServletResponse.SC_NOT_FOUND,

 

request.getRequestURI());

 

return;

 

}

 

简而言之,Tomcat响应静态资源主要还是依靠着DefaultServlet类进行的。只有熟练掌握DefaultServlet类的用法,自然而然也就掌握了Tomcat响应静态资源的方法。想要学习更多的Tomcat服务器相关的知识,可以观看本站的Tomcat服务器教程,让我们熟悉Tomcat理论知识的同时,还提供有大量的源码让我们进行实战演练。


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>