Tomcat初识

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>		根元素,可包含多个Service
    <Service>		顶层类元素,可包含一个Engine和多个Connector
        <Connector/>	连接器元素,代表通信接口
        <Engine>	容器元素,为Service处理客户请求,可包含多个Host
            <Host>	容器元素,为Host处理客户请求,可包含多个Context
                <Context/> 容器元素,为Web应用处理客户请求
            </Host>
        </Engine>
    </Service>
</Server>

以上是server.xml的基本结构,一个元素代表一个组件或容器,组件类元素不能处理请求

  • Server组件:它是配置文件的根元素,代表一个服务器,一个XML只能有一个根;
  • Service组件:它是一些Connector组件的集合,它本身不是一个容器,所以在这里不能定义日志等组件。一个Service组件只能有一个Engine组件,可以包含多个Connector组件;
  • Connector组件:它表示一个接口,通过这个接口接收客户的请求,然后发送给其他组件,最后再把服务器的响应结果传递给客户;

容器类元素可以处理请求:

以上组件本身并不能处理客户请求,也不能生成响应,在Tomcat中只有三个容器可以处理客户的请求并生成响应,这个三个容器分别是Engine、Host和Context。这3个容器分别代表了不同的服务范围,通过嵌套关系可以知道他们的范围关系:Engine>Host>context。

  • Engine组件下可以包含多个Host组件,它为特定的Service组件处理所有的客户请求;
  • 一个Host组件代表一个虚拟主机,一个虚拟主机可以包含多个Web应用(Context组件);
  • Context组件代表一个Web应用;

各组件关系如下图


各种参数详解:

Tomcat目录结构

安装Tomcat时要设置CATALINA_HOME环境变量到根目录,可以使用脚本文件catalina.bat和catalina.sh中列出了Tomcat启动的默认环境变量。

Tomcat有几个重要的目录:

  • bin:存放启动和关闭的Tomcat脚本;startup和shutdown是启动和关闭服务的脚本,他们都是调用catalina脚本的;
  • conf:存放配置文件,包括server.xml、用户访问控制tomcat-users.xml、web.xml;
  • logs:存放Tomcat的日志文件;
  • webapps:Web应用目录,其中examples是例子;manager是用于管理的应用;ROOT是默认Web目录;
  • work:存放JSP编译后产生Class文件;Tomcat把各种由JSP生成的servlet文件放在这个目录下,包括临时文件、JSP预编译文件和其他的中间文件;

配置应用牛刀小试

Tomcat默认的监听端口是8080,启动后可以通过http://localhost:8080即可看到默认的站点,如果需要修改端口可以打开conf/server.xml配置文件找到

 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

替换8080为你的端口,记得要重启Tomcat。


添加一个应用,即是添加一个context,找到

  <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

添加其子节点context,如

<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的三个作用范围:

  • Server级别:在/conf/context.xml里配置;
  • Host级别:在/conf/Catalina/${hostName}里添加context.xml,继而进行配置;
  • web app 级别:在/conf/Catalina/${hostName}里添加${webAppName}.xml,继而进行配置;

因此可以在/conf/Catalina/localhost/myapp.xml配置,myapp.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来添加角色和用户名、密码

<role rolename="manager-gui"/>
<user username="tomcat" password="123456" roles="manager-gui"/>

重启Tomcat即可通过http://localhost/manager来管理应用。

其实通过Tomcat的默认页(即http://localhost:8080)有三个按钮:Server Status、Manager App、Host Manager,其中前两个是Tomcat Web Application Manager功能,后一个是Tomcat Virtual Host Manager的功能。

Tomcat Web Application Manager角色名:

  • manager-gui - allows access to the HTML GUI and the status pages
  • manager-script - allows access to the text interface and the status pages
  • manager-jmx - allows access to the JMX proxy and the status pages
  • manager-status - allows access to the status pages only

Tomcat Virtual Host Manager角色名:

  • admin-gui - allows access to the HTML GUI and the status pages
  • admin-script - allows access to the text interface and the status pages

如果你不考虑安全,只是测试用的话,简单配置一个用户全部拥有权限

<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"/>
posted @ 2014-09-30 08:56  码农神说  阅读(162)  评论(0编辑  收藏  举报