共计 2080 个字符,预计需要花费 6 分钟才能阅读完成。
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 理论知识的同时,还提供有大量的源码让咱们进行实战演练。