作者:流丶血的卓洛 | 来源:互联网 | 2023-01-30 16:13
Tomcat拜访所有的资源,都是用Servlet来实现的,所以Tomcat又叫Servlet容器,什么都交给Servlet来解决。当然,动态资源也不例外。动态资源能够了解为前端的固定页面,如css,html,js,jpg,png等。对于动态资源,Tomcat最初会交由一个叫做DefaultServlet的类来解决,DefaultServlet解决动态资源的过程就是Tomcat响应动态资源。
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;
这块和下面内容有关联的中央是,读取www.cungun.com文件的时候,会判断申请的门路对应的资源是否为一个文件夹,如果是目录,就会判断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理论知识的同时,还提供有大量的源码让咱们进行实战演练。