前言:本篇博文主要是来讲解一下应用服务器之Tomcat,在讲述Tomcat之前要先了解下JAVA.

   一:何为JAVA

    Java是由Sun Microsystems公司于 1995年5月推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Javaapplet。另一方面,Java技术也不断更新。(2010年Oracle公司收购了SUN)

  二:JAVA 组成

    Java由四方面组成:

    Java编程语言

    Java类文件格式

    Java虚拟机

    Java应用程序接口(Java API)

     我们通过Java编程语言+Java应用程序接口(Java API)编写出*.java的文件(如,test.java),通过Java编译器javac(Java Complier)进行编译生成*.class的类文件(如,test.class),再通过Java类文件+Java虚拟机(JVM)运行Java程序。简单过程如下

wKiom1Q1KAWw2qedAADM48iWYs4326.jpg

三:JAVA虚拟机

  从上面的的Java流程图我们可以看出用Java语言编写的程序经过Java编译器编译后才能在JAVA虚拟集中运行.所以说JAVA虚拟机起着运行程序的作用.而Java虚拟机是有那些组件组成的呢?

   Java虚拟机的组成

   JRE(JVM+Java SE API),是用于实现Java程序运行的最小环境。

   JDK (Java+API+JVM),是用于实现Java程序开发的最小环境。 

   Java正是由于引入虚拟机机构使得我们编写的Java程序可以在多种平台上运行.

wKiom1Q1KprzYHkrAACzXRvRAzA720.jpg

   我们现在用的安卓手机系统就是跑在Linux平台上JAVA虚拟里


四:Java有哪些体系

  上面对Java做了简单的介绍,那么我们现在有哪些Java体系?

    Java分为三个体系

    J2ME(Java 2 Platform Micro Edition,java平台微型版)

    J2SE(Java2 Platform Standard Edition,java平台标准版)

    J2EE(Java 2 Platform,Enterprise Edition,java平台企业版)

  从上面的排序我们可以看出Java企业版可以提供的功能肯定是做多的.那Java企业版提供了那些功能呢?  

    Jave EE标准则包含了一组适用于创建企业级Web应用程序的API。Jave EE建立在Java SE的基础上,并依赖于Java SE才能正常工作.  这是运行.jsp程序的基础.


五:servlet和jsp

  Servlet是什么?

  在Client/Server应用的发展过程中,Java提供了一整套Client/Server解决方案,在这个方案中,程序可以自动地下载到客户端并执行,这就是applet。但是它仅仅是问题的一半,问题的另一半就是Servlet。Servlet可以被认为是服务器端的applet。Servlet被Web服务器加载和执行,就如同applet被浏览器加载和执行一样。Servlet从客户端(通过Web服务器)接收请求,执行某种作业,然后返回结果。使用servlet的基本流程如下:

   客户端通过HTTP提出请求。

   Web服务器接收该请求并将其发给Servlet。如果这个Servlet尚未被加载,Web服务器将把它加载Java虚拟机并且执行它。

   Servlet将接收该HTTP请求并执行某种处理。

   Servlet将向Web服务器返回应答。

   Web服务器将从Servlet收到的应答发送给客户端。

wKioL1Q1L0jDIlGLAADAzfS0RnM205.jpg

   Setvlet可以在多种多样的客户机上使用。由于Servlet是用Java编写的,所以你可以很方便地在HTML中使用它们,就像你使用applet一样。那么,Servlet是怎样执行的?怎样来写一个Servlet,它的基本架构是怎么样的?这些问题,将在后面部分给予介绍。因为Java运行在服务器端,浏览时会很安全.


 JSP和Servlet的关系


 JSP是一种脚本语言,包装了Java Servlet系统的界面,简化了Java和Servlet的使用难度,同时通过扩展JSP标签(TAG)提供了网页动态执行的能力。尽管如此,JSP仍没有超出Java和Servlet的范围,不仅JSP页面上可以直接写Java代码,而且JSP是先被译成Servlet之后才实际运行的。JSP在服务器上执行,并将执行结果输出到客户端浏览器,我们可以说基本上与浏览器无关。它是与JavaScript不同的,JavaScript是在客户端的脚本语言,在客户端执行,与服务器无关。那么JSP是什么?就是简化Servlet,是我们不用懂Java程序就可以写出基于Java语言的执行脚本..

 

  当Web服务器(或Servlet引擎,应用服务器)支持JSP引擎时,JSP引擎会照着JSP的语法,将JSP文件转换成Servlet代码源文件,接着Servlet会被编译成Java可执行字节码(bytecode),并以一般的Servlet方式载入执行。简单来说就是,*.jsp文件 -jasper引擎-> *.java文件 -javac编译器-> .class (JVM运行)。

   所以说.jsp文件必须依靠jasper引擎,而jasper引擎转换成Java文件后要想执行必须依靠Java编译器.而真正提供运行环境的是Java虚拟机.所以说他们几个之间的关系是相互依靠的.


 六:JSP运行过程


 一个JSP页面有多个客户访问,下面是第一个客户访问JSP页面时候,JSP页面的执行流程:

  客户通过浏览器向服务器端的JSP页面发送请求

  JSP引擎检查JSP文件对应的Servlet源代码是否存在,若不存在转向第4步,否则执行下一步

  JSP引擎检查JSP页面是否需要修改,若没修改,转向第5步,否则执行下一步

  JSP引擎将JSP页面文件转译为Servlet源代码(相应的 .java 代码)

  JSP引擎将Servlet源代码编译为相应字节码( .class代码 )

  JSP引擎加载字节码到内存

  字节码处理客户请求,并将结果返回给客户


wKioL1Q1NfeQ4lMDAAD0_Q5Wl-A154.jpg

七:tomcat

  通过上面的讲解我们知道了jsp是什么.说的简单点就是编写的网页程序文件.好那么问题来了(学挖掘机哪家强..哈哈)编写好的这些程序,只有执行才能达到我们编写程序的目地.那执行这些程序的软件是什么.(下面称为WEB容器)

 商业版:

    Sun GlassFish Enterprise Server

    Sun Java System Web Server

    JBoss Enterprise Application Platform

    WebLogic Application Server

    Caucho's Resin Server

    WebSphere Application Server

    NetWeaver

  非商业版:

    Apache Tomcat

    Apache Geronimo

    GlassFish

    JBoss Application Server

    Jetty

    Tiny Java Web Server

    Eclipse Virgo

 如果你足够土豪,商业版不错.我是紧跟大时代潮流,开源运动的蓬勃发展.Apache Tomcat是不错的选择.


 什么是Tomcat

  Sun推出的JSP(Java Server Pages)是一种运行于服务器端的动态网页开发技术,它基于Java技术。执行JSP时需要在Web服务器上架设一个编译JSP网页的引擎。Tomcat服务器是Apache组织开发的一种JSP引擎同时支持Servlet,本身具有Web服务器的功能,可以作为独立的Web服务器来使用。但是,在作为Web服务器方面,Tomcat处理静态HTML页面时不如Apache迅速,也没有Apache健壮,所以我们一般将Tomcat与Apache配合使用,让Apache对网站的静态页面请求提供服务,而Tomcat作为专用的JSP引擎,提供JSP解析,以得到更好的性能。并且Tomcat本身就是Apache的一个子项目,所以Tomcat对Apache提供了强有力的支持。对于大多数网站来说,Tomcat是一个很不错的选择.

tomcat结构

wKiom1Q1OK_wnERRAAFHgcpbs4Y067.jpg

Tomcat 支持Servlet 2.5和JSP 2.1的规范,它由一组嵌套的层次和组件组成,一般可分为以下四类:

    顶级组件:位于配置层次的顶级,并且彼此间有着严格的对应关系(如,Server、Service);

    连接器:连接客户端(可以是浏览器或Web服务器)请求至Servlet容器,

    容器:包含一组其它组件,如Engine、Host、Content;

    被嵌套的组件:位于一个容器当中,但不能包含其它组件(如,Realm(用户账户数据库)、valve(基于用户的认证)、logger(记录日志));

顶级组件:

(1).服务器(server):Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。


(2).服务(service):一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器。给服务命名可以方便管理员在日志文件中识别不同服务产生的日志。一个server可以包含多个service组件,但通常情下只为一个service指派一个server。


连接器类组件:

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


容器类组件:

(1).引擎(Engine):引擎通是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。

(2).主机(Host):主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个引擎至少要包含一个主机组件。

(3).上下文(Context):Context组件是最内层次的组件,它表示Web应用程序本身。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。


  Tomcat连接器架构:基于Apache做为Tomcat前端的架构来讲,Apache通过mod_jk、mod_jk2或mod_proxy模块与后端的Tomcat进行数据交换。而对Tomcat来说,每个Web容器实例都有一个Java语言开发的连接器模块组件,在Tomcat中,这个连接器是org.apache.catalina.Connector类。这个类的构造器可以构造两种类别的连接器:HTTP/1.1负责响应基于HTTP/HTTPS协议的请求,AJP/1.3负责响应基于AJP的请求。但可以简单地通过在server.xml配置文件中实现连接器的创建,但创建时所使用的类根据系统是支持APR(Apache Portable Runtime)而有所不同。APR是附加在提供了通用和标准API的操作系统之上一个通讯层的本地库的集合,它能够为使用了APR的应用程序在与Apache通信时提供较好伸缩能力时带去平衡效用。同时,需要说明的是,mod_jk2模块目前已经不再被支持了,mod_jk模块目前还apache被支持,但其项目活跃度已经大大降低。因此,目前更常用 的方式是使用mod_proxy模块。


连接器协议:

Tomcat的Web服务器连接器支持两种协议:AJP和HTTP,它们均定义了以二进制格式在Web服务器和Tomcat之间进行数据传输,并提供相应的控制命令。

AJP(Apache JServ Protocol)协议:目前正在使用的AJP协议的版本是通过JK和JK2连接器提供支持的AJP13,它基于二进制的格式在Web服务器和Tomcat之间传输数据,而此前的版本AJP10和AJP11则使用文本格式传输数据。

HTTP协议:诚如其名称所表示,其是使用HTTP或HTTPS协议在Web服务器和Tomcat之间建立通信,此时,Tomcat就是一个完全功能的HTTP服务器,它需要监听在某端口上以接收来自于商前服务器的请求。


Tomcat 工作模式

(1).独立的Servlet容器

Tomcat 的默认工作模式,作为独立的Servlet容器,是内置在Web服务器中的一部分,是指使用基于JAVA的Web服务器的情形。其他两种方式是TOMCAT与其他服务器集成的方式。

(2).进程内的Servlet容器

Servlet容器作为Web服务器的插件和JAVA容器的实现。Web服务器的插件在内部地址空间打开一个JVM(JAVA VIRTUAL MACHINE)使JAVA容器得以在内部运行。如有某个需要调用Servlet的请求,插件将取得对此请求的控制并将它传递(使用JNI)给JAVA容器。进程内的容器对于多线程、单进程的服务器非常适合,并且提供了很好的运行速度,只是伸缩性有所不足。

注,JNI是JAVA NATIVE INTERFACE的缩写,是JAVA本地调用接口,通过JNI,JAVA程序可以和其他语言编写的本地程序进行通信。


进程外的Servlet容器

Servlet容器运行于Web服务器之外的地址空间,并且作为Web服务器的插件和JVM使用IPC(如TCP/IP)进行通信。进程外容器的反应时间不如进程内的容器,但有较好的伸缩性、稳定性等性能。

IPC INTERPROCESS COMMUNICATION(进程间通信)的简写,它是实现进程间通信的一种技术。


Tomcat 的组织结构

Tomcat是一个基于组件的服务器,它的构成组件都是可配置的,其中最外层的给件是CATALINA SERVLET容器,其他的组件按照一定的格式要求配置在这个顶层容器中。Tomcat的各个组件是server.xml文件中配置的,Tomcat服务器默认情况下对各种组件都有默认的实现,下面通过分析server.xml文件来理解Tomcat的各个组件是如何组织的。

<Server>      顶层元素,代表一个服务器
  <Service>  顶层元素,是Connector的集合,只有一个Engine
      <Connectior/>        连接器类元素,代表通信接口
          <Engine>   容器类元素,为特定的Service组件处理所有客户请求,可包含多个Host
              <Host>    为特定的虚拟主机处理所有客户请求
                  <Context>     为特定的WEB应用处理所有客户请求
                  </Context>
              </Host>
          </Engine>
          
  </Service>
</Server>


ok 我们的tomcat与Java就讲到这里,文中的内容大量参考了网络上的文档.