tomcat通俗讲解,tomcat通俗易懂的说法
tomcat是什么?
这个软件用来装载你的javaweb程序,可以称它为web容器,你的jsp/servlet程序需要运行在Web容器上,Web容器有很多种,JBoss、WebLogic等等,Tomcat是其中一种。tomcat是一种web服务器,也可以称作运行在服务器(物理意义上的计算机)上的一种软件包。用来对服务器上的HTML文档提供访问权限控制。
以上的说法可能太专业化,一时难以理解。其实用通俗的语言来讲,万维网本质上就是“超文本文档”(HTML文档)组成的一个通过超级链接互相访问交互网络。你从甲计算机上的文档A通过超链接访问乙计算机上的文档B,而B必须放在Web服务器(Tomcat)里才能被访问。Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和Jsp规范总能在Tomcat中得到体现。
与传统的桌面应用程序不同,Tomcat中的应用程序是一个WAR(WebArchive)文件。WAR是Sun提出的一种Web应用程序格式,与JAR类似,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织:通常其根目录下包含有Html和Jsp文件或者包含这两种文件的目录,另外还会有一个WEB-INF目录,这个目录很重要。通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类(如JavaBean)。通常这些所依赖的类也可以打包成JAR放到WEB-INF下的lib目录下,当然也可以放到系统的CLASSPATH中,但那样移植和管理起来不方便。
Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理静态Html的能力就不如Apache。我们可以将Tomcat和Apache集成到一块,让Apache处理静态Html,而Tomcat处理Jsp和Servlet。这种集成只需要修改一下Apache和Tomcat的配置文件即可。
Tomcat工作原理解析
本文主要讲解Tomcat启动和部署webapp时的原理和过程,以及其使用的配置文件的详解。主要有三大部分:
1.Tomcat的简介和启动过程
2.Tomcat部署webapp
3.Tomcat处理一个http请求的过程
【简介】
Tomcat依赖/conf/server.xml这个配置文件启动server(一个Tomcat实例,核心就是启动容器Catalina)。
Tomcat部署Webapp时,依赖context.xml和web.xml(/conf/目录下的context.xml和web.xml在部署任何webapp时都会启动,他们定义一些默认行为,而具体每个webapp的 ?META-INF/context.xml ?和 ?WEB-INF/web.xml ?则定义了每个webapp特定的行为 )两个配置文件部署web应用。
第一部分、Tomcat的简介和启动过程
一个标准TOMCAT结构目录如上图所示:
BIN目录主要存放各种平台下启动和关闭Tomcat的脚本文件.其中 有个档是catalina.bat,打开这个windos配置文件,在非注释行加入JDK路径,例如 : SET? JAVA_HOME=C:\j2sdk1.4.2_06 保存后,就配置好tomcat环境了. startup.bat是windows下启动tomcat的文件,shutdown.bat是关闭tomcat的文件.
conf: 存放不同的配置文件(如:server.xml和web.xml);?
server.xml文件:该文件用于配置和server相关的信息,比如tomcat启动的端口号、配置host主机、配置Context?
web.xml文件:部署描述文件,这个web.xml中描述了一些默认的servlet,部署每个webapp时,都会调用这个文件,配置该web应用的默认servlet。
tomcat-users.xml文件:配置tomcat的用户密码与权限。
context.xml:定义web应用的默认行为。
/lib:存放Tomcat运行需要的库文件(JARS);?
/logs: 存放Tomcat执行时的LOG文件;?
/temp: ? 临时目录
/webapps:Tomcat的主要Web发布目录(包括应用程序示例);?
/work:存放jsp编译成Servlet后产生的class文件;
二、Tomcat启动过程?
1、开启Tomcat:可以在IDE中启动Tomcat的服务器,也可以手动在 /bin/目录下找到startup.bat并双击,然后程序就会依次执行以下步骤:
(1)引导(Bootstrap)启动: 调用了org.apache.catalina.startup.Bootstrap.class中的main方法,开始启动Tomcat容器;main方法如下:
publicstaticvoid main(String args[]) {
? ? ? ? if(daemon ==null) {
? ? ? ? ? ? daemon =newBootstrap();//创建了一个引导对象try{//引导对象初始化,即创建了Catalina容器? ? ? ? ? ? ? ? daemon.init();
? ? ? ? ? ? } catch (Throwable t) {
? ? ? ? ? ? ? ? t.printStackTrace();
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? // 根据不同的命令参数执行try {
? ? ? ? ? ? String command = "start";
? ? ? ? ? ? if(args.length 0) {
? ? ? ? ? ? ? ? command = args[args.length - 1];
? ? ? ? ? ? }
? ? ? ? ? ? if(command.equals("startd")) {
? ? ? ? ? ? ? ? args[args.length - 1] = "start";
? ? ? ? ? ? ? ? daemon.load(args);
? ? ? ? ? ? ? ? daemon.start();
? ? ? ? ? ? } elseif(command.equals("stopd")) {
? ? ? ? ? ? ? ? args[args.length - 1] = "stop";
? ? ? ? ? ? ? ? daemon.stop();
? ? ? ? ? ? } elseif(command.equals("start")) {
? ? ? ? ? ? ? ? daemon.setAwait(true);
? ? ? ? ? ? ? ? daemon.load(args);
? ? ? ? ? ? ? ? daemon.start();
? ? ? ? ? ? } elseif(command.equals("stop")) {
? ? ? ? ? ? ? ? daemon.stopServer(args);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? log.warn("Bootstrap: command \"" + command + "\" does not exist.");
? ? ? ? ? ? }
? ? ? ? } catch (Throwable t) {
? ? ? ? ? ? t.printStackTrace();
? ? ? ? }
? ? }publicvoid init()?
? ? ? ? throws Exception?
? ? {?
? ? ? ? // Set Catalina path?
? ? ? ? // 设置catalina_home属性,tomcat启动脚本里有通过-Dcatalina.home设置? ? ? ? ? setCatalinaHome();?
? ? ? ? // 设置catalina_base属性,运行多实例的时候该目录与catalina_home不同? ? ? ? ? setCatalinaBase();?
? ? ? ? // 初始化classloader,读取conf/catalina.properties,根据指定的repository创建classloader?
? ? ? ? // 有三个classloader? 分别是common、catalina、shared,tomcat6中三个相同? ? ? ? ? initClassLoaders();?
? ? ? ? // 设置当前线程的classloader? ? ? ? ? Thread.currentThread().setContextClassLoader(catalinaLoader);?
? ? ? ? // 待研究? ? ? ? ? SecurityClassLoad.securityClassLoad(catalinaLoader);?
? ? ? ? // 以下通过反射调用Catalina中的方法?
? ? ? ? // Load our startup class and call its process() method? if (log.isDebugEnabled())?
? ? ? ? ? ? log.debug("Loading startup class");?
? ? ? ? Class startupClass =?
? ? ? ? ? ? catalinaLoader.loadClass?
? ? ? ? ? ? ("org.apache.catalina.startup.Catalina");?
? ? ? ? Object startupInstance = startupClass.newInstance();?
? ? ? ? // Set the shared extensions class loader? if (log.isDebugEnabled())?
? ? ? ? ? ? log.debug("Setting startup class properties");?
? ? ? ? String methodName = "setParentClassLoader";?
? ? ? ? Class paramTypes[] =newClass[1];?
? ? ? ? paramTypes[0] = Class.forName("java.lang.ClassLoader");?
? ? ? ? Object paramValues[] =newObject[1];?
? ? ? ? paramValues[0] = sharedLoader;?
? ? ? ? Method method =?
? ? ? ? ? ? startupInstance.getClass().getMethod(methodName, paramTypes);?
? ? ? ? method.invoke(startupInstance, paramValues);?
? ? ? ? catalinaDaemon = startupInstance;?
? ? }
2)调用Bootstrap中的init(),创建了Catalina对象(核心容器):主要进行了以下三步:
//设置tomcat实例的环境变量
①?Set up the environment variables required by this Tomcat instance
//实例化将用于运行Tomcat实例的通用类加载
②?Instantiate the general class loaders that will be used for our running? Tomcat instance
//初始化tomcat实例
③?Initialize this Tomcat instance
(3)调用Bootstrap中的load():实际上是通过反射调用了catalina的load方法。
①Parse the main configuration file for a Tomcat instance, server.xml,?converting each configuration element into the appropriate Tomcat?component1。 (找到config file(server.xml);然后创建digester,解析server.xml,生成各组件对象(Server、Service、Container、Connector等)以及建立相互之间的关系。 )
(4)Start up our outermost Top Level Element—the Server instance。(最后start(),同样是在Bootstrap中通过反射调用catalina对象的start方法。 接着启动server.start()方法: ((Lifecycle)?getServer()).start();?接着调用service.start()方法。接下来是一系列的container的start,后续在分析(会部署所有的项目)
三、server.xml配置简介:? 下面讲述这个文件中的基本配置信息,更具体的配置信息请参考tomcat的文档
tomcat是干什么用的?
Tomcat是一个世界上广泛使用的支持jsp和servlets的Web服务器。Tomcat 因为技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
扩展资料:
Tomcat不仅实现了Servlet规范、JSP规范,支持对这两者的解析,还支持JSTL表达式语言、和Java WebSocket。目前Tomcat最新稳定版是8.0。Tomcat请求流程:
1、对外接收请求是Connector连接器组件,可以支持不同协议,Connector组件中可设置端口,所以我们请求的时候需要输入端口号。可以把Connector当作接待员。
2、Connector组件接收到请求后,转发给处理Engine(catalina引擎)组件去处理。
3、根据请求的域名,分配到对应的Host主机。
4、在根据path分配context组件。
参考资料来源:百度百科-Tomcat
Tomcat基础(2)
Tomcat服务器的配置主要集中于tomcat/conf下的catalina.policy, catalina.properties,context.xml、server.xml、tomcat-users.xml、web.xml文件。
server.xml 是tomcat服务器的核心配置文件,包含了Tomcat的servlet容器(catalina)的所有配置。由于配置的属性特别多,我们在这里主要讲解其中的一部分重要配置。
Server是server.xml的根元素,用于创建一个Server实例,默认使用的实现类是org.apache.catalina.core.standardserver.
port:Tomcat监听的关闭服务器的端口。
shutdown:关闭服务器的指令字符串。
Server内嵌的子元素为Listener, GlobalNamingResources, Service.
默认配置的5个Listener的含义
GlobalNamingResources中定义了全局命名服务
该元素用于创建Service实例,默认使用org.apache.catalina.core.Standardservice,默认情况下,Tomcat仅指定了Service的名称,值为"Catalina",Service可以内嵌的元素为:Listener, Executor, connector, Engine ,其中Listener用于为Service添加生命周期监听器,Executor用于配置Service共享线程池,Connector用于配置Service包含的链接器,Engine用于配置Service中链接器对应的Servlet容器引擎。一个Server服务器,可以包含多个Service服务。
默认情况下Service并未添加共享线程池配置,如果我们想添加一个线程池,可以在下添加如下配置:
属性说明
属性含义
name线程池名称,用于Connector中指定。
nameprefix所创建的每个线程的名称前缀,一个单独的线程名称为namePrefix+threadNumber.
maxThreads池中最大线程数。
minSpareThreads活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。
maxIdleTime线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000 (1分钟) ,单位毫秒。
maxQueuesize在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无限。除非特殊情况,这个值不需要更改,否则会有请求不会被处理的情况发生。
prestartminSpareThreads启动线程池时是否启动minSpareThreads部分线程。默认值为false,即不启动。
threadPriority线程池中线程优先级,默认值为5,值从1到10。
className
线程池实现类,未指定情况下,默认实现类为org.apache.catalina.core.standardThreadExecutor,如果想使用自定义线程池首先需要实现? org.apache.catalina.Executor接口。
JDK工具jconsole.exe观察线程池被创建
如果不配置共享线程池,那么Catalina各组件在用到线程池时会独立创建。
Connector用于创建链接器实例。默认情况下, server.xml配置了两个链接器,一个支持HTTP协议,一个支持AJP协议。因此大多数情况下,我们并不需要新增链接器配置,只是根据需要对已有链接器进行优化。
属性说明
1) port:端口号,Connector用于创建服务端Socket并进行监听,以等待客户端请求链接。如果该属性设置为0,Tomcat将会随机选择一个可用的端口号给当前Connector使用。
2)protocol :当前Connector支持的访问协议。默认为HTTP/1.1 ,并采用自动切换机制选择一个基于JAVA NIO的链接器或者基于本地APR的链接器(根据本地是否含有Tomcat的本地库判定)。
如果不希望采用上述自动切换的机制,而是明确指定协议,可以使用以下值。
Http协议:
AJP协议
3) connectionTimeOut: Connector接收链接后的等待超时时间,单位为毫秒。-1表示不超时。
4)redirectPort:当前Connector不支持SSL(HTTP协议证书)请求,接收到了一个请求,并且也符合security-constraint约束,需要SSL传输,Catalina自动将请求重定向到指定的端口。
5)executor:指定共享线程池的名称, 也可以通过maxThreads, minSpareThreads等属性配置内部线程池。
6)URIEncoding:用于指定编码URI的字符编码,
Tomcat8.x版本默认的编码为UTF-8,Tomcat7.X版本默认为ISO-8859-1(解决请求字符串乱码问题,Tomcat8版本默认UTF-8不需要指定URI字符编码)。
完整的配置如下:
Engine作为Servlet引擎的顶级元素,内部可嵌入:Cluster、Listener、Realm、Valve和Host。
属性说明:
1)name:用于指定Engine的名称,默认为Catalina。该名称会影响一部分Tomcat的存储路径(如临时文件);
2)defaultHost:默认使用虚拟主机名称,当客户端请求指向的的主机无效时将交由默认虚拟主机处理,默认为localhost。
Host元素用于配置一个虚拟主机,它支持以下嵌入元素:Alias,cluster,Listener,valve,Realm,context,如果在Engine下配置Realm,那么此配置将在当前Engine下的所有Host中共享。同样,如果在Host中配置Realm , 则在当前Host下的所有context中共享。Context中的Realm优先级Host的Realm优先级Engine中的Realm优先级。
属性说明:
1)name:当前Host通用的网络名称,必须与DNS服务器上的注册信息一致。Engine中包含的Host必须存在一个名称与Engine的defaultHost设置一致。
2)appBase:当前Host的应用基础目录,当前Host上部署的web应用均在该目录下(可以是绝对目录,相对路径)。默认为webapps。
3)unpackWARs:设置为true, Host在启动时会将appBase目录下war包解压为目录。设置为false,Host将直接从war文件启动。
4)autoDeploy:控制tomcat是否在运行时定期检测并自动部署新增或变更的web应用。
通过给Host添加别名,我们可以实现同一个Host拥有多个网络名称,配置如下:
Context用于配置一个web应用,默认配置如下:
属性描述 :
1)docBase:Web应用目录或War包的部署路径。可以是绝对路径,也可以是相对于Host appBase的相对路径。
2)Path:Web应用的Context路径。如果我们Host名为localhost,则该web应用访问的路径为:
它支持的内嵌元素为:CookieProcessor,Loader,Manager,Realm,Resources,WatchedResource,Jarscanner,Valve.
该配置文件中,主要配置的是Tomcat的用户,角色等信息,用来控制Tomcat中manager,host-manager的访问权限。
web.xml是web应用的描述文件, 它支持的元素及属性来自于servlet规范定义。在Tomcat中,web应用的描述信息包括tomcat/conf/web.xml中默认配置以及web应用WEB-INE/web.xml下的定制配置。
我们可以通过context-param添加ServletContext初始化参数,它配置了一个键值对,这样我们可以在应用程序中使用javax.servlet.ServletContext.getInitParameter()方法获取参数。 可以直接在servlet中进行应用 。
5.2 会话配置
session-config用于配置web应用会话,包括超时时间Cookie配置以及 会话追踪模式 。它将覆盖server.xml和context.xml
1)session-timeout:超时时间,单位分钟。
2)cookie-config:用于配置会话追踪Cookie
nane:Cookie的名称
domain:Cookie的域名
path: Cookie的路径
comment: 注释
http-only:cookie只能通过HTTP方式进行访问, JS无法读取或修改,此项可以增加网站访问的安全性。
secuze :设置true则此cookie只能通过HTTPS连接传递到服务器,而HTTP连接则不会传递该信息。注意是从浏览器传递到服务器,服务器端的Cookie对像不受此项影响。
max-age:以秒为单位表示cookie的生存期,默认为-1表示是会话Cookie ,浏览器关闭时就会消失。
3)tracking-mode:用于配置会话追踪模式,Servlet3.0版本中支持追踪模式:COOKIE,URL,SSL
ACOOKIE:通过HTTP Cookie 追踪会话是最常用的会话追踪机制, 而且Servlet规范也要求所有的Servlet规范都需要支持Cookie追踪。
B.URL:URL重写是最基本的会话追踪机制。当客户端不支持Cookie时,可以采用URI重写的方式。当采用URI追踪模式时,请求路径需要包含会话标识信息,Servlet容器会根据路径中的会话标识设置请求的会话信息。如:"http: //;jessionid=1234567890。
C.SSL:对于SSL请求,通过SSL会话标识确定请求会话标识。
Servlet的配置主要是两部分,servlet和servlet-mapping;
配置说明:
1)sexvlet-name:指定servle的名称,该属性在web.xml中唯一。
2)servlet-class:用于指定servlet类名
3)init-param:用于指定servlet的初始化参数, 在应用中可以通过HttpServlet.getInitParameter获取。
4) load-on-startup:用于控制在Web应用启动时,Servlet的加载顺序。值小于0, web应用启动时,不加载该servlet,第一次访问时加载
5)enabled: true ,false。若为false ,表示servlet不处理任何请求。
6)url-pattern:用于指定URL表达式,一个servlet-mapping可以同时配置多个url-pattern。
Servlet 中文件上传配置
配置说明:
1)location:存放生成的文件地址。
2) max-file-size:允许上传的文件最大值。默认值为-1,表示没有限制。
3)max-request-size:针对该multi/form-data请求的最大数量,默认值为-1,表示无限制。
4)file-size-threshold:当数量量大于该值时, 内容会被写入文件。
Listener用于监听servlet中的事件,例如context、request、session对象的创建、修改、删除,并触发响应响应。Listener是 观察者模式 的 实现 ,在servlet中主要用于context、request、session对象的生命周期进行监控。在servlet 2.5规范中共定义了8重Listener。在启动时,ServletContextListener的执行顺序与web.xml中的配置顺序一致,停止时执行顺序相反。
配置说明:
1)filter-name:用于指定过滤器名称,在web.xm1中,过滤器名称必须唯一。
2)filter-class:过滤器的全限定类名,该类必须实现Filter接口。
3)async-supported:该过滤器是否支持异步。
4)init-param:用于配置Filter的初始化参数,可以配置多个,可以通过 FilterConfig.getInitParameter 获取
5)url-pattern:指定该过滤器需要拦截的URL。
Tomcat conf/web.xml中配置了web默认访问页面。
Tomcat启动后会尝从上到下的请求顺序。
如果在项目的WEB-INF目录下的web.xml中配置访问页面,则会覆盖Tomcat中的默认配置。
error-page用于配置web项目访问异常时定向的页面,支持HTTP响应码和异常类两种形式。优化用户体验,保证系统安全。
Tomcat中自定义错误页面放入ROOT目录下。
项目中将错误页面放在web目录下,并且会覆盖Tomcat中的配置。
从早期的Tomcat版本开始,就提供了web版的管理控制台,他们是两个独立的web应用,位于webapps目录下。Tomcat提供的管理应用有用于管理的Host的host-manager和用于管理web应用的manager。
这两个web应用主要作用就是为Tomcat提供了管理后台,可以通过这两个应用去管理Tomcat中所配置的虚拟主机、Tomcat中部署的web应用、Tomcat占用的JVM内存分配、JVM参数配比等
Host-manager主要用来管理 虚拟主机 信息。Tomcat启动之后,可以通过 访问该web应用。host-manager默认添加了访问权限控制,当打开网址时,需要输入用户名和密码(conf/tomcat-users.xml中配置) 。所以要想访问该页面,需要在conf/tomcat-users.xml中配置,并分配对应的角色:
1)admin-gui:用于控制页面访问权限
2)admin-script:用于控制以简单文本的形式进行访问
配置如下:
界面:
Manager用来管理部署在当前Tomcat上的web应用,访问路径为 ,同样manager也添加了页面访问控制,因此我们需要为登录用户分配角色为:
Server Status查看服务器状态,给JVM内存优化参考数据
tomcat是干什么的?
Tomcat是Apache 软件基金会的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发的。后来他帮助将其变为开源项目,并由Sun贡献给Apache软件基金会。由于大部分开源项目O'Reilly都会出一本相关的书,并且将其封面设计成某个动物的素描,因此他希望将此项目以一个动物的名字命名。因为他希望这种动物能够自己照顾自己,最终,他将其命名为Tomcat。而O'Reilly出版的介绍Tomcat的书籍的封面也被设计成了一个公猫的形象。而Tomcat的Logo兼吉祥物也被设计成了一只公猫。
扩展资料:
Tomcat技巧-配置系统管理
大多数商业化的JavaEE服务器都提供一个功能强大的管理界面,且大都采用易于理解的Web应用界面。Tomcat按照自己的方式,同样提供一个成熟的管理工具,并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现,当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数,user、group、role的多种数据库管理等。在后续的版本中,这些功能将得 到很大的扩展,但现有的功能已经非常实用了。
参考资料来源:百度百科-Tomcat
tomcat是什么,怎么理解,跟java的关系
tomcat就是一个 web容器,就相当于一个 锅,java 程序就好比 锅里煮的面条,要让java程序运行就必需要有一个web容器来承载他,就好比要想煮面就必需要有锅来装面一样。