Tomcat的由来
1995年美国的一个民间组织根据美国NCSA项目源代码,自行组织开发并发布了Apache Web Server,该组织于1999年创建团体,称为Apache Software Foundation(ASF)。Apache项目包括子项目有HTTP Server、APR、Jakarta、Perl、PHP、TCL、XML等,现在已经发展到43个项目。
而Tomcat是Jakarta的子项目,Jakarta Tomcat最初是为了Java Servlet技术而开发的,Servlet嵌入到特定的WebServer中,称为Servlet容器。Sun创建的第一个Servlet容器是Java Web Server,与此同时ASF组织创建了JServ,它是一个与Apache服务器集成的Servlet引擎。
1999年,Sun将Java Web Server容器贡献给了ASF,使Java Web Server和JServ两个项目合并为Tomcat。Tomcat作为Sun的官方参考时限,也标志这它支持Servlet和JSP的参考标准。
综上,Tomcat第一个版本是从3.1.1开始的,它完全支持Servlet2.2和JSP1.1标准,并集成了Java Web Server。2001年Tomcat4.0发布,并命名为Catalina,完全重新设计了架构和基础代码,Tomcat4.x系列时限了Servlet2.3和JSP1.2标准。
注释
目前最新版本是Tomcat8,但由于没找到合适的资料,本文的学习是基于Tomcat6的,但用的是Tomcat8做的实验,有些不对之处请见谅。我们可以来看看Tomcat最近几个版本分别支持的JavaEE规范。
------------------------
Tomcat 6: Servlet 2.5、JSP 2.1、EL 2.1
Tomcat7: Servlet 3.0、JSP 2.2、EL 2.2
Tomcat8: Servlet 3.1、JSP 2.3、EL 3.0
而且Tomcat 8正式支持WebSocket 1.0这个标准的API。
Tomcat部署与集成
Tomcat中的应用程序是一个WAR(Web Archive)文件,WAR是Sun提出的一种Web应用格式,与JAR类似,也是许多文件的一个压缩包。WAR中的文件按一定目录结构来组织:
ROOT
├/ 包含有HTML和JSP文件、图片、样式表等
└─WEB-INF 站点二进制文件目录(INF-information)
├─classes 类文件目录
├─lib 打包文件jar 目录
└─web.xml 站点配置文件
Tomcat部署简单,只需要把WAR放到Tomcat的Webapp即可,它自己负责解压,同时Tomcat也提供了一个web管理平台来辅助部署。基于Tomcat的开发其实就是JSP和Servlet的开发。
Tomcat也可以与其他一些软件来实现更多的功能,如果与JBoss集成来开发EJB、与Cocoon集成来开发XML应用、与OpenJMS集成来开发JMS应用;而且与Apache更是完美组合,让Apache处理静态HTML,它负责处理JSP和Servlet。
Servlet容器
Tomcat是Servlet的容器,Servlet的容器的作用是负责处理客户请求,当客户请求到来时,Servlet容器获取请求,然后调用某个Servlet,并把Servlet的执行结果返回给客户。
如上图,当客户请求某个资源时,Sevlet容器使用ServletRequest对象把客户的请求信息封装起来,然后调用Java Servlet API中定义的Servlet的一些生命周期方法,完成Servlet的执行,接着把Servlet执行的结果封装到ServletResponse对象中,最后Servlet容器把ServletResponse发送给客户,完成一次服务过程。
每一个Servlet的类都自动执行inti()、service()、destory()三个函数,在启动时调用一次init()函数用以进行参数的初始化,在服务器期间每当接收到对该Servlet的请求都会调用service()函数执行该Servlet的服务操作,当容器销毁时调用一次destory()函数,如下图:
Tomcat组件配置文件结构
Tomcat作为Servlet容器,有3中工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器。因此它可以喝Apache、IIS等服务器一起使用。Tomcat是基于组件的服务器,它的构成组件都是可配置的,其中最外层的组件是Catalina Servlet容器,其他的组件按照一定的格式要求配置在这个顶层容器中。Tomcat的组件配置文件是在$CATALINA_HOME/conf/server.xml.
以上是server.xml的基本结构,一个元素代表一个组件或容器,组件类元素不能处理请求:
- <Server> 根元素,可包含多个Service
- <Service> 顶层类元素,可包含一个Engine和多个Connector
- <Connector/> 连接器元素,代表通信接口
- <Engine> 容器元素,为Service处理客户请求,可包含多个Host
- <Host> 容器元素,为Host处理客户请求,可包含多个Context
- <Context/> 容器元素,为Web应用处理客户请求
- </Host>
- </Engine>
- </Service>
- </Server>
以上组件本身并不能处理客户请求,也不能生成响应,在Tomcat中只有三个容器可以处理客户的请求并生成响应,这个三个容器分别是Engine、Host和Context。这3个容器分别代表了不同的服务范围,通过嵌套关系可以知道他们的范围关系:Engine>Host>context。
Tomcat目录结构
安装Tomcat时要设置CATALINA_HOME环境变量到根目录,可以使用脚本文件catalina.bat和catalina.sh中列出了Tomcat启动的默认环境变量。
Tomcat有几个重要的目录:
Tomcat默认的监听端口是8080,启动后可以通过http://localhost:8080即可看到默认的站点,如果需要修改端口可以打开conf/server.xml配置文件找到
替换8080为你的端口,记得要重启Tomcat。
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
添加一个应用,即是添加一个context,找到
添加其子节点context,如
- <Host name="localhost" appBase="webapps"
- unpackWARs="true" autoDeploy="true">
- <Context path="/myapp" docBase="/home/zqftest/web/" />
其中path属性代表网络访问的上下文路径,docBase属性表示应用程序的路径,还有很多别的属性如reloadable表示是否自动加载类包,workDir表示缓存文件的目录等等。
重启Tomcat就可以http://localhost:8080/myapp/来访问你的应用了。
其实并不推荐在直接在conf/server.xml做配置,因为而是在context.xml配置,因为server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件则不然,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。
context.xml的三个作用范围:
- <Context path="/myapp" docBase="/home/zqftest/web/" />
Tomcat应用管理
大多数商业化的J2EE服务器都提供了一个功能强大的管理界面,且大都采用易于管理的Web应用界面,Tomcat按照自己的方式,也提供了一个成熟的Web管理工具,并且丝毫不逊于那些商业化的竞争对手。但Tomcat的Admin Web Application自版本5之后就不集成了,只能手动安装。但默认Tomcat Web Application Manager和Tomcat Virtual Host Manager是可用的是集成的。
如果需要启用Tomcat Web Application Manager,需要编辑tomcat-users.xml来添加角色和用户名、密码
重启Tomcat即可通过http://localhost/manager来管理应用。
- <role rolename="manager-gui"/>
- <user username="tomcat" password="123456" roles="manager-gui"/>
其实通过Tomcat的默认页(即http://localhost:8080)有三个按钮:Server Status、Manager App、Host Manager,其中前两个是Tomcat Web Application Manager功能,后一个是Tomcat Virtual Host Manager的功能。
Tomcat Web Application Manager角色名:
- <role rolename="admin"/>
- <role rolename="manager-script"/>
- <role rolename="manager-gui"/>
- <role rolename="manager-jmx"/>
- <role rolename="manager-status"/>
- <role rolename="admin-gui"/>
- <role rolename="admin-script"/>
- <user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>