问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

tomcat的缺省servlet如何处理静态资源

发布网友 发布时间:2023-03-26 17:43

我来回答

3个回答

热心网友 时间:2023-10-21 19:26

Tomcat的默认servlet,即org.apache.catalina.servlets.DefaultServlet,处理静态资源(例如HTML、CSS、JavaScript文件和图像等)的方法与标准的Web服务器类似。当请求一个静态资源时,因为没有映射到其他servlet或JSP文件,Tomcat将自动将该请求交给默认servlet来处理。

默认servlet会首先检查请求路径是否与Web应用程序上下文路径匹配。如果是,则该servlet将从磁盘上的Web应用程序目录中找到与请求路径对应的资源文件,并将其发送回客户端。如果请求路径与Web应用程序上下文路径不匹配,则默认servlet会将请求传递给上一个servlet(可能是前一个过滤器),以便进行进一步处理。

默认情况下,Tomcat使用默认servlet来提供Web应用程序中的静态内容。但是,也可以配置Tomcat以使用外部Web服务器(如Apache)来提供静态内容,这通常比使用默认servlet提供更高的性能和安全性。

总之,Tomcat的默认servlet可以方便的处理静态资源,并与标准的Web服务器类似。

热心网友 时间:2023-10-21 19:27

我们都知道Web服务器与Web容器的区别。而且Tomcat是一种Web Container,与Nginx/Apache这一类的Web Server本质区别是,Tomcat不光可以处理静态资源,还能处理Servlet文件。

响应Servlet文件这件事,我们虽然还没有深入分析,但多少有点司空见惯的感觉了,毕竟做为一个Servlet规范的参考实现,能处理Servlet自然是情理之中的。

那Tomcat又是如何处理静态资源的呢?

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

那我们一起来看看,它究竟是怎么处理的。

本质上讲,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服务器一样,把应用目录下的文件都列了出来,像下面这个样子。当然,这个样式也是可以自已定义的。

这个DefaultServlet的servlet-mapping是这样配置的

你会不会问,既然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;

}

热心网友 时间:2023-10-21 19:27

1 缺省servlet可以处理静态资源
2 当请求的资源为静态资源时,缺省servlet会首先检查请求的资源是否存在于web应用程序的根目录或者WEB-INF目录下,如果存在则直接返回该资源;如果不存在,则会将请求转发给下一个servlet或者JSP处理。

3 如果需要更高效的处理静态资源,可以使用专门的静态资源处理器,如Apache Httpd服务器或者Nginx服务器。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
绩效工资从工资里扣合法吗 无人机电机轴的主要功能有哪些? 闽侯南通多久发展 南通哪个位置最有潜力 南通未来的机遇有哪些 江苏南通的发展前景怎么样 南通这座城市未来发展前景怎样 我女儿阳历08年01月08日出生,{农历07年腊月初一}请高人帮忙改个名字... 我女儿是2012年1月10日10:35分出生的五行缺什么,取什么名字好 这种图片效果怎么做出来的,不是纯白板,仔细看有一个个均匀分布的小圆点... 电炖锅煮饭的时候锅和锅盖粘在一起了怎么办! 电炖锅煮东西有什么缺点吗 荣事达电炖锅过夜煮粥怎么粘锅了电 梦见花蛇还有青蛇的预兆 苹果7p充电屏幕失灵 怎样做无钖排骨 诺基亚N72的图片上传到电脑上不是很清楚啊?是不是我买的手机有问题了?我从国美买的行货啊! iphone的QQ空间照片墙的照片是哪里来的?我没往手机上传过啊,是电脑Q空间的相册,但是别的相册为啥没在手机 六安市天堂寨风景区导游词 梦见穿破拖鞋走路的预兆 描写珊瑚的诗句 我们都要好好的刘涛怼摄影师是哪一集 更换忘记密码怎么办? 怎么改但是密码忘了? 请问一下断送一生惟有酒指什么生肖 小花折纸教程视频 解压折纸教程视频 怎么画鲁智深 长袜有什么作用? 长袜子是什么意思啊? 1张微信名片能推荐几个好友 宜昌体育场路属于哪个区呀?听说那里有个学校还不错,大伙怎么看 宜昌红星美凯龙邮寄地址 宜昌市体育场路是哪个区 宜昌市西陵区体育场路8号哪个社区 当阳万达建哪里 宜昌金雅家居有限公司怎么样? 宜昌三维空间装饰工程有限公司怎么样? 宜昌神话酒吧多少平 windows文件问题 广东省一模是全省参考吗 湛一模和广一模哪个参考价值大 电脑insert没用怎么办 主父偃是什么时期的人 梦见红包里没钱的预兆 “……一生要哭多少回,才能不流泪;一生要流多少泪,才能不心碎……” "变脸"时会唱的歌,有一句是"流多少泪,出多少汗",不知道是什么歌啊 一生要哭多少回,才能不流泪,一生要流多少泪,才能不心碎? 一生要哭多少回,才不会流泪。。。一生要流多少泪,才不会心碎! (一生要爱多少回,才能不流泪;一生要流多少泪,才能不伤悲.)这首歌叫什么呀?或者谁知道是谁唱的?