Tomcat组件初解

说明:个人认为理解背景知识以及Java技术基础知识是掌握Tomcat工作机制的前提
一、背景知识
1、动态网页的概念
程序是否在服务器端运行,是区分动态网页与静态网页的重要标志,静态网页随着html代码生成后页面的内容和显示效果基本上不会发生变化了;而动态网页则不然,页面代码虽然没有变,但是显示的内容可以随着时间、环境或者数据库操作的结果而发生改变。动态网页是基本的html语法规范与Java、PHP、等高级程序设计语言、数据库编程等多种技术的融合, 以实现对网站内容和风格的高效、动态和交互式的管理。注意不要混淆动态网页和网页视觉上的动态效果这两个概念。

2、HTTP与MIME
最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为html文档,因此web服务器最初只能服务静态资源,即只能解析html文档。后来HTTP协议引入MIME框架(Multipurpose Internet Mail Extensions规定了用于表示各种各样的数据类型的符号化方法),通过在文档之前附加MIME类型信息来支持多媒体数据类型;此时web服务器就可以解析静态超媒体文本文档,浏览器接收服务器返回的消息后就会知道哪些是MP3文件,哪些是Shockwave文件等等,当某种扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。可以理解为服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。

3、Applet
1995年Java发布的时候互联网方兴未艾,不久,人们对动态网站的技术需求越来越迫切,在这种发展背景下,Sun公司在Java的类库中引入了applet类,用applet类开发的小程序能够直接嵌入到html文件中,使用< applet > 和< /applet >来标记html文件中的Applet小程序代码。在这种情况下,当Client端支持JRE插件的浏览器读取到这对标记时,就会下载相应的小应用程序代码并在本地计算机上执行该Applet,而后将执行结果通过网页显示给用户。这大大提高Web页面的交互能力和动态执行能力,但是这种Client端动态网页技术存在明显的一个弊端——为了达到这种动态效果Client端必须要开放一些权限给远程用户执行相关程序,如果有恶意的应用程序在Client端执行就可能会危及用户的系统,尽管Sun公司致力于让Java程序只能运行在JVM中,这样尽可能的缩小的恶意程序的破坏范围(类似chroot机制),但程序的设计避免不了漏洞,总会有安全隐患;applet每一次的改动都需要重新打包签名,手续非常繁琐,所以在具体的实现中要将一些会变化参数放到html文件中来,传到applet中去执行;此外未必每一个用户都会配置需要的JRE环境,在当时网络带宽尚且不大的情况下,applet需要下载到本地执行,因此发展效果不是很理想。

4、CGI
随后CGI技术诞生,CGI规范允许Web服务器执行外部程序,并将它们的输出发送给浏览器,CGI将Web一组简单的静态超媒体文档转换为一个完整的新的交互式媒体。简单来说当Web服务器发现用户请求的是动态程序类的资源,会调用相应的CGI进程来执行,CGI执行完毕后把执行结果输出标准到html语句返回给web服务器,web服务器再返回给Client端。

5、Serverlet
Sun为了使Java能够支持基于CGI的方式来开发动态网站,开发出API的另一种特殊规范Serverlet(Server Applet),它是Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。综上所述,可以将Serverlet理解为是一种CGI技术,能够让Java开发动态页面并通过CGI方式与前端Web进行通信;在通信量大的服务器上,Java Servlet的优点在于其执行速度更快于 CGI 程序,各个用户请求被激活成单个程序中的一个线程,而无需创建单独的进程,因此服务器端处理请求的系统开销明显降低。但是它输出html语句还是采用了老的CGI方式,对所有的代码采用硬编码的方式一句一句输出,对于纯html文档的编译也要由Java程序来输出,这是非常麻烦的,任何静态内容的修改也会导致JVM重新编译Java页面程序,Java程序员还需要理解html前端展示页面的定义,所以编写和修改html非常不方便。

6、JSP
由此Sun公司倡导建立的一种动态网页技术标准,同时吸引了其他一些公司一起参与进来。JSP(Java Server Pages)就此诞生,其根本是一个简化的Servlet设计,在传统的网页HTML文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成后缀名为(.jsp)的JSP文件,用来封装生成动态网页的处理逻辑,实现了网页展示逻辑与Servlet的分离,这样大大简化和方便了网页的设计和修改。JSP与Servlet一样,任何程序操作都在服务器端执行,客户端浏览的服务器端处理的结果。Java Servlet是JSP的技术基础,大型Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠。

7、MVC架构
前面提到的CGI编制方式比较困难而且效率低下,因为每一次修改程序都必须重新将CGI程序编译成可执行文件,MVC因此而生。MVC模型可以理解为是一种将数据、逻辑处理、展示界面分离的一种方法。使用MVC的一个最明显好处就是它将视图展示和应用逻辑清晰的分离。这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。

  • Model:应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
  • View:提供了展示模型数据的不同方式,它可以是数据填充的模板;视图可以有多个,而控制器则决定使用哪个视图。
  • Controller:主要功能就是调用并协调需要的资源/对象来执行用户请求。通常控制器会为任务调用合适的模型,选择合适的视图。

Controller,Model和View各自独立,一个流行的开源实现是Apache Structs框架;目今,设计优良的Web应用程序通常用相关的技术实现相应的功能,比如:
M = JavaBeans:用于传递数据,拥有与数据相关的逻辑处理
http://www.zhihu.com/question/19773379
V = JSP,实现内容展示;从Model接收数据并生成HTML,进而降低了HTML维护的复杂度;
C = Servlet,实现应用逻辑;接收HTTP请求并控制Model和View

二、Java SE和Java包含的API
Java SE包含了Java二进制程序(如JVM和Java字节码编译器)和Java的核心代码库,而Jave EE标准则包含了一组适用于创建企业级Web应用程序的API。Jave EE建立在Java SE的基础上,并依赖于Java SE才能正常工作。当然,任何级别的应用程序均能从Java EE中获益,但Jave EE却更适合解决大型软件系统设计中的问题。
JAVA EE包含多个独立的API,Servlet和JSP就是其中的两个,而JAVA EE中著名的API中还包含如下的几个:
JAVA EE APIs

  • JMS(Java Message Service):高性能异步消息服务,实现JAVA EE应用程序与非JAVA程序的“透明”通信;
  • JMX(Java Management Extensions):在程序运行时对其进行交互式监控和管理的机制;
  • JTA(Java Transaction API):允许应用程序在自身的一个或多个组件中平滑地处理错误的机制;
  • JM(JavaMail):通过工业标准的POP/SMTP/IMAP协议发送和接收邮件的机制;
  • EJB(Enterprise JavaBeans):JAVA相关的诸多高级功能的实现,如RMI(Remote Method Invocation), 对象/关系映射,跨越多个数据源的分布式事务等;

Java SE APIs

  • JNDI(Java Naming and Directory Interface):用于与LDAP服务交互的API;
  • JAXP(Java API for XML Processing):用于分析及转换XML(基于XSLT实现);

Java应用服务器主要为应用程序提供运行环境,为组件提供服务。Java 的应用服务器很多,从功能上分为两类:JSP(支持最新的Servlet 和JSP 规范)和 Java EE (符合J2EE标准的服务器)。
JAVA EE Application Servers:

  • IBM:Websphere 商业
  • BEA(后被Oracle收购):Weblogic 商业
  • Oracle:oc4j 商业
  • Sun:GlassFish 开源
  • Apache:Geronimo 开源
  • RedHat:JBoss 开源,在Tomcat上进行了二次封装和开发,引入了很多新的功能,尤其是企业级的API

JSP Application Servers :

  • Jetty 开源
  • Apache:Tomcat 开源
  • CAUCHO:Resin 商业

三、Tomcat起源
Sun公司创建了第一个Servlet容器的参考实现,即Java Web Server(仅具备Java EE API中的JSP和Serverlet), 但JWS只是为了演示Servlet的相应功能,所以其很不稳定。与此同时,ASF(Apache Software Foundation)创建了JServ项目,一个能够与apache整合起来的servlet容器。1999年,Sun把JWS捐给了ASF,于是两个项目合二为一,即Tomcat的前身。第一个tomcat版本是Tomcat 3.x系列,而发布于2001年Tomcat4.0则是在此前基础上进行了重新设计和实现,其代码项目被命名为Catalina。目前最新的版本则是8.x系列。

尽管Tomcat并没有完整实现Jave EE API,但Tomcat作为第一款成功的web容器,具有广大的用户群体,提供Http Server和Servlet容器功能。很企业也渐渐弃用传统的Java EE技术(如EJB)转而采用一些开源组件来构建复杂的应用。对于这些开源组件如Structs、Spring和Hibernate,Tomcat都能够对其实现完美的支持。

Tomcat主要是作为JSP/Servlet最新规范的参考实现而设计,最常见的使用方式是将其作为一个服务器软件安装到操作系统上,然后在里面部署web应用,比较适合在中小型系统和并发访问用户不是很多的场景下使用;但如果嵌入到其他JEE服务器中以提供Web容器功能或者作为组件嵌入到其他应用中,操作起来比较麻烦。

四、Tomcat的架构
最新版的Tomcat8主要新增了Servlet 3.1, JSP 2.3, EL 3.0 and Web Socket 1.0支持。版本详情说明:http://tomcat.apache.org/whichversion.html
Tomcat由一组嵌套的层次和组件组成,一般可分为以下四类:

  • 顶级组件:位于配置层次的顶级,并且彼此间有着严格的对应关系;
  • 连接器:连接客户端(可以是浏览器或Web服务器)请求至Servlet容器,
  • 容器:包含一组其它组件;
  • 被嵌套的组件:位于一个容器当中,但不能包含其它组件;

说明:在第一次调用之后,JSP会被编译成一个servlet类,在后续的操作中则可以直接使用此类,从而避免了对每一次调用的都要重新分析和编译。因此,类似servlet,JSP的执行需要在container中完成。JSP的container跟servlet的container基本相同,但在JSP执行之前,需要一些额外的步骤如与servlet代码建立会话等。Tomcat包含了一个叫做Catalina的Servlet container(执行servlet和编译过的JSP)和一个JSP编译器(Jasper编译器)。事实上,一个包含了JSP编译器和Servlet容器的应用程序组合通常被称作Web容器。
各常见组件:
这里写图片描述
server: Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。
service:一组Connector和一个Engine的集合,这组Connector共用一个Engine来处理所有收到的请求,给服务命名可以方便管理员在日志文件中识别不同服务产生的日志。一个server可以包含多个service组件,但通常情下只为一个service指派一个server。

连接器类组件
connector:连接器负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2连接器。

容器类组件
Engine:通常是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。
Host:主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个引擎至少要包含一个主机组件。
Context:上下文是最内层次的组件,它表示Web应用程序本身。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。

被嵌套类(nested)组件
这类组件通常包含于容器类组件中以提供具有管理功能的服务,它们不能包含其它组件,但有些却可以由不同层次的容器各自配置。
Valve:阀门用来拦截请求并在将其转至目标之前进行某种处理操作,类似于Servlet规范中定义的过滤器。Valve可以定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。
Logger:日志记录器用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。日志记录的功能可被继承,因此,一个引擎级别的Logger将会记录引擎内部所有组件相关的信息,除非某内部组件定义了自己的Logger组件。
Realm:领域用于用户的认证和授权;在配置一个应用程序时,管理员可以为每个资源或资源组定义角色及权限,而这些访问控制功能的生效需要通过Realm来实现。Realm的认证可以基于文本文件、数据库表、LDAP服务等来实现。Realm的效用会遍及整个引擎或顶级容器,因此,一个容器内的所有应用程序将共享用户资源。同时,Realm可以被其所在组件的子组件继承,也可以被子组件中定义的Realm所覆盖。

五、Tomcat初解
http://mirrors.cnnic.cn/apache/tomcat/tomcat-8/v8.0.28/bin/apache-tomcat-8.0.28.tar.gz
1、下载Tomcat二进制包解压安装后打开目录可以看到如下内容(前提:jdk环境已经部署好)
这里写图片描述

  • bin:存放服务器脚本;
  • conf:存放配置文件;
  • logs :存放日志文件;
  • lib:存放需要的JAR文件;
  • work:存放jsp 文件编绎生成的class文件;
  • webapps:存放需要发布的Web应用程序及其部署文件;/webapps是Tomcat服务器用来存放Web应用的目录,每个Web应用都将在这建立各自的子目录,

对于一个Web应用程序而言,其通常由Servlets、JSP和其它文件等共同组成。这些文件通常被打包成WAR(Web Application Archive)格式,并以.war作为打包后的文件扩展名。而Servlet规范则定义了在WAR内部组织这些文件的标准目录结构。其目录和功用如下:
这里写图片描述

  • /Webapps:应用程序的根目录,所有可被公开访问的文件均放置于此处,如HTML、JSP和图片文件等;
  • /WEB-INF:此目录为私有资源目录,其内部的所有文件和子目录均不能被公开访问;包含着此Web应用程序的配置文件web.xml(程序结构描述符文件)通常放置于此目录;
  • /WEB-INF/classes:当前Web应用程序的类文件的存在目录;
  • /WEB-INF/lib:可被打包为JAR格式的类文件通常放置于此目录;

2、Tomcat的配置文件:
这里写图片描述
catalina.policy: Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力;
catalina.properties: Tomcat内部package的定义及访问相关的控制,也包括对通过类装载器装载的内容的控制;Tomcat6在启动时会事先读取此文件的相关设置;
context.xml:所有host的默认配置信息;
logging.properties: Tomcat通过自己内部实现的JAVA日志记录器来记录操作相关的日志,此文件即为日志记录器相关的配置信息,可以用来定义日志记录的组件级别以及日志文件的存在位置等;
tomcat-user.xml: Realm认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认情况下会用到此文件;在Tomcat中添加/删除用户,为用户指定角色等将通过编辑此文件实现;
web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息;
注意:在Tomcat目录下/webapps/ROOT/WEB-INF中也有一个web.xml,当部署一个Web应用时,总是先加载/conf/web.xml,然后再加载/webapps/ROOT/WEB-INF/web.xml文件;但处理过程中,总是先使用/webapps/ROOT/WEB-INF/web.xml配置文件,如果无法处理,才把它交给Tomcat的web.xml文件。
这里写图片描述
server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;主要提供Tomcat组件的初始配置,说明Tomcat的结构,含义,使Tomcat通过实例化组件完成启动及构建自身。

<Server>
    <Service>
        <Connector />
        <Engine>
            <Host>
                <Context> </Context>
            </Host>
        </Engine>
    </Service>
</Server>

3、启动Tomcat,在浏览器中输入:http://localhost:8080/会打开Tomcat的默认页面。实际上,刚装好的Tomcat服务器虚拟主机的默认目录是/webapps/ROOT,默认页面就是Tomcat安装目录下的webapps/ROOT/index.jsp;
这里写图片描述
这里写图片描述
4、编写一个简单shell本用来启动服务
这里写图片描述
这里写图片描述

发布了88 篇原创文章 · 获赞 17 · 访问量 17万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章