感谢大佬:https://www.zhihu.com/question/57400909

tomcat访问所有的资源,都是用Servlet来实现的。

在Tomcat看来,资源分3种

  1. 静态资源,如css,html,js,jpg,png等 2. Servlet 3. JSP

对于静态资源,Tomcat最后会交由一个叫做DefaultServlet的类来处理

对于Servlet ,Tomcat最后会交由一个叫做 InvokerServlet的类来处理

对于JSP,Tomcat最后会交由一个叫做JspServlet的类来处理

所以Tomcat又叫Servlet容器嘛,什么都交给Servlet来处理。

那么什么时候调用哪个Servlet呢? 有一个类叫做org.apache.tomcat.util.http.mapper.Mapper,它一共进行了7个大的规则判断,第7个,就是判断是否是该用DefaultServlet。

简单地说。。。先看是不是servlet,然后看是不是jsp,如果都不是,那么就是你DefaultServlet的活儿了。



到了DefaultServlet之后,就是一个普通的HttpServlet了,doPost方法会交由doGet处理:



doGet又交由一个叫做 serveResource的方法处理



在serveResource方法里又瞎搞八搞了许多事情,最后在一个叫做copy()方法里,把静态资源对应的输入流 读取出来,扔到了输出流里,这样你的浏览器就看到数据了。

补充:

正规的项目前面都有一个静态服务器?(一般是nginx,apache,他们除了了做负载均衡这些,最重要的是处理静态文件)如果没有前面的静态服务器,所有的资源都用tomcat的静态资源servlet处理,都会占掉了一个tomcat的线程池的一个线程,这样tomcat的性能就会受到非常大的影响。

示例:

感谢大佬:https://zhidao.baidu.com/question/1051681077751531179.html

apache和tomcat区别

经常在用apache和tomcat等这些服务器,可是总感觉还是不清楚他们之间有什么关系,在用tomcat的时候总出现apache,总感到迷惑,到底谁是主谁是次,因此特意在网上查询了一些这方面的资料,总结了一下:

解析一

apache支持静态页,tomcat支持动态的,比如servlet等,

一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是由tomcat来处理的。

apche可以支持phpcgiperl,但是要使用java的话,你需要tomcat在apache后台支撑,将java请求由apache转发给tomcat处理。

apache是web服务器,tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行。

这两个有以下几点可以比较的:

1、两者都是apache组织开发的

2、两者都有HTTP服务的功能

3、两者都是免费的

不同点:

Apache是专门用了提供HTTP服务的,以及相关配置的(例如虚拟主机、URL转发等等)

Tomcat是Apache组织在符合J2EE的JSP、Servlet标准下开发的一个JSP服务器

Runtime r=Runtime.getRuntime();

Process p=null;

try

{

p=r.exec(“notepad”);

}

catch(Exception ex)

{

System.out.println(“fffff”);

}

解析二:

APACHE是一个web服务器环境程序 启用他可以作为web服务器使用 不过只支持静态网页 如(asp,php,cgi,jsp)等动态网页的就不行

如果要在APACHE环境下运行jsp 的话就需要一个解释器来执行jsp网页 而这个jsp解释器就是TOMCAT, 为什么还要JDK呢?因为jsp需要连接数据库的话 就要jdk来提供连接数据库的驱程,所以要运行jsp的web服务器平台就需要APACHE+TOMCAT+JDK

整合的好处是:

如果客户端请求的是静态页面,则只需要Apache服务器响应请求

如果客户端请求动态页面,则是Tomcat服务器响应请求

因为jsp是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销

C是一个结构化语言,如谭老爷子所说:它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。

解析三:

apache:侧重于http server

tomcat:侧重于servlet引擎,如果以standalone方式运行,功能上与apache等效 , 支持JSP,但对静态网页不太理想;

apache是web服务器,tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行。

换句话说,apache是一辆卡车,上面可以装一些东西如html等。但是不能装水,要装水必须要有容器(桶),而这个桶也可以不放在卡车上。

tomcat访问所有的资源,都是用Servlet来实现的的更多相关文章

  1. Tomcat访问日志详细配置

    在server.xml里的<host>标签下加上 <Valve className="org.apache.catalina.valves.AccessLogValve&q ...

  2. Tomcat访问日志详细配置(转)

    在server.xml里的<host>标签下加上<Valve className="org.apache.catalina.valves.AccessLogValve&qu ...

  3. tomcat访问日志分析

    常使用web服务器的朋友大都了解,一般的web server有两部分日志: 一是运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息 二是访问日志信息,它记录的访问的时间,IP,访问的资 ...

  4. 转 Tomcat访问日志详细配置

    配置http访问日志.Tomcat自带的能够记录的http访问日志已经很详细了取消下面这段的注释: <Valve className="org.apache.catalina.valv ...

  5. Tomcat访问任意磁盘的图片资源

    项目中用户上传的大量图片存放在项目底下带来诸多不便.每次部署项目都需要拷贝出来,防止覆盖掉以前的 图片.容易丢失,前功尽弃.甚至造成经济损失.不可估量. 如何配置tomcat访问图片路径呢?首页你代码 ...

  6. webpy 访问局域网共享资源

    遇到一个问题: 在python shell 中调用局域网远程共享文件时,没问题.但是在webpy中调用时,报错:没有权限.那一定是apache设置问题. 网上找不到类似的方法,于是换个思路搜了一下“p ...

  7. 使用HttpClient访问被保护资源

    下面的Android应用需要向指定页面发送请求,但该页面并不是一个简单的页面,只有当用户已经登录,而且登录用户的用户名是crazyit.org时才可访问该页面.如果使用HTTPURLConnectio ...

  8. eclipse启动tomcat 访问http://localhost:8080 报404错误

    eclipse启动tomcat 访问http://localhost:8080 报404错误 Server Locations修改后会变灰,如果需要更改设置,则需要移除与Tomcat服务器关联的项目, ...

  9. linux系统tomcat项目部署和tomcat访问日志

    一.只用ip地址访问 先把端口号改成80,然后用 <Host name="localhost"  appBase="webapps"    137     ...

随机推荐

  1. # 【jvm】01-双亲委派都会说,破坏双亲委派你会吗

    [jvm]01-双亲委派都会说,破坏双亲委派你会吗 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请 ...

  2. Spring练习,使用注解的方式,完成模拟用户的正常登录。要求如下: 使用注解方式开发模拟用户的正常登录。

    相关 知识 >>> 相关 练习 >>> 实现要求: 在该实践案例中,使用注解的方式,完成模拟用户的正常登录. 要求如下: 使用注解方式开发模拟用户的正常登录. 实现 ...

  3. centos7 安装python3 小白教程-CV大法

    安装python3 centos7,默认系统自带python2.7的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何 ...

  4. docker学习:docker命令

    帮助命令 自验证 docker version 详情信息 docker info 获取帮助 docker --help 镜像命令 列出本例主机上的镜像 docker images [OPTIONS] ...

  5. C#中的值传递与引用传递(in、out、ref)

    在C#中,方法.构造函数可以拥有参数,当调用方法或者构造函数时,需要提供参数,而参数的传递方式有两种(以方法为例): 值传递 值类型对象传递给方法时,传递的是值类型对象的副本而不是值类型对象本身.常用 ...

  6. Linux配置yum源(离线和在线)

    配置yum源有2种方法,一种是离线yum源,另外一种是在线yum源. 一.离线yum源,基于安装光盘提供的安装仓库. 建立一个属于仓库文件夹 mkdir /media/zidong cd /media ...

  7. linux 开启和关闭防火墙

    Ubuntu #查看防火墙状态 sudo ufw status #开启防火墙 sudo ufw enable #关闭防火墙 sudo ufw disable CentOs #查看防火墙状态 syste ...

  8. python 使用@property 操作属性时,报“RecursionError:maximun recursion depth exceeded”

    使用@property获取和修改属性,出现报错"RecursionError:maximun recursion depth exceeded",超过了最大的递归深度 原因: 方法 ...

  9. vue 传入后台的数据多了个=

    解决方法: 在前端值参时用{} 在后台接收时用Map 来自为知笔记(Wiz)

  10. JQuery实现奇偶行不同背景颜色

    假设table的id为:t1 $(document).ready(function(){ $('#t1 > tbody tr:even').css('background','white'); ...