您的位置:首页 > 编程语言 > Java开发

java技术体系基础

2015-11-25 18:00 411 查看
一、java相关概念
1、编程语言:
系统级:C,C++,go,erlang
应用级:C#,Java,Python,Perl,Ruby,php(世界上最好的编程语言),
虚拟机:jvm,pvm
动态网站:asp .net,jsp,
动态网站:
客户端动态:
服务器端动态:CGI

API:应用程序编程接口,
遵循POSIX API规范
ABI:应用二进制编程接口

Java编程语言:
SUN,James Gosling,Green Project,Oak,Java
1995:java 1.0, Write Once,Run Anywhere

1996:JDK(java Development Kit),包含一个JVM(Sun Classic VM)
JDK 1.0:JVM,Applet,AWT
1997:JDK 1.1
JAR文档格式,JDBC,JavaBeans
1998:JDK 1.2
SUN把Java技术分拆为三个方向:
J2SE:Standard Edition
J2EE:Enterprise Editon
J2ME:Mobile Edition
代表性技术:EJB,Java Plug-in,Swing,
JIT编译器:Just In Time (即时编译:边装载代码,边编译)
1999:HotSpot虚拟机
2000:JDK 1.3
2002: JDK 1.4
2006: Sun开源了Java技术:遵循GPL规范,建立了Open JDK组织管理此些代码

虚拟机:JRockit,HostSpot,
Java编程语言的特性:
面向对象,多线程,结构化错误处理,
垃圾收集,动态链接,动态扩展,
编程语言的类别:

面向过程:以指令为中心,围绕指令组织数据
面向对象:以数据为中心,围绕数据组织指令

二、Java1.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)2.Java 组成(1)Java体系结构Java由四方面组成:Java编程语言
Java CLass文件格式
Java应用程序接口(Java API,类库)
Java VM (虚拟机)
下面我们来说一下这四个方面的关系,我们通过Java编程语言+Java应用程序接口(Java API)编写出*.java的文件(如,test.java),通过Java编译器javac(Java Complier)进行编译生成*.class的类文件(如,test.class),再通过Java类文件+Java虚拟机(JVM)运行Java程序。简单过程如下:Java 程序语言+Java API ---> test.java (java程序)
javac(Java Complier) ---> test.class (字节码文件)
Java类文件+Java虚拟机 ---> 运行test.class
好了,下面我们来说一说,Java虚拟机(JVM)的组成。
JVM 的核心组成:
Class Loader:类加载器
执行引擎
3、jvm运行时数据区域解析 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。

1)程序计数器(寄存器)
当前线程所执行的字节码行号指示器

字节码解释器工作依赖计数器控制完成

通过执行线程行号记录,让线程轮流切换各条线程之间计数器互不影响

线程私有,生命周期与线程相同,随JVM启动而生,JVM关闭而死

线程执行Java方法时,记录其正在执行的虚拟机字节码指令地址

线程执行Nativan方法时,计数器记录为空(Undefined)

唯一在Java虚拟机规范中没有规定任何OutOfMemoryError情况区域

程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下 一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多喝处理器来说是一个内核) 只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响、独立存 储,我们称这类内存区域为“线程私有”的内存。
如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie方法,这个计数器值则为空 (Undefined)。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
2)Java虚拟机栈
线程私有,生命周期与线程相同

用于存储局部变量、操作栈、动态链接、方法出口

每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程

与程序计数器一样,Java虚拟机栈(Java Vitual Machine Stacks)也是线程私有的,他的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧 (Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的 过程。
局部变量表存放了编译器克制的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(Object reference)和字节码指令地址(returnAddress类型)。
在Java虚拟机规范中,对于此区域规定了两种异常状况:
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;
如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常。对于32位的jvm,默认大小为256kb, 而64位的jvm, 默认大小为512kb,可以通过-Xss设置虚拟机栈的最大值。不过如果设置过大,会影响到可创建的线程数量。3)本地方法栈
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用非常类似,区别在于虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则是为虚拟机使用到的Native方法服务。
4)Java堆
Java堆(java heap)是Java虚拟机所管理的内存中最大的一块

它是被所有线程共享的一块内存区域,在虚拟机启动时创建



如上图所示java heap被分为三部分:
(New)新生代:

新生带又被分为to,from,eden三个部分
新生区(Eden): 初创对象
存活区(Survivor spaces):步入成熟期的初创对象
to
from
(Old)老年带:

(Perm)持久带:

reserved:刚启动java,初始化时预留的空间
垃圾回收器:
新生代回收:
Minor GC
老年代回收:
Major GC (FULL GC)

堆内存空间的调整参数:
-Xmx: 新生代和老年代总共可用的最大空间
-Xms: 新生代和老年代初始空间之和;

-XX:NewSize 新生代初始空间
-XX:MaxNewSize 新生代的最大空间

-XX:MaxPermSize 持久代最大空间
-XX:PermSize 持久代初始空间

对tomcat而言:
catalina.sh中有来个环境变量:
CATALINA_OPTS:仅对启动运行tomcat实例的Java虚拟机有效
JAVA_OPTS:对本机上的所有java虚拟机有效

Java堆是垃圾收集管理的主要战场。根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的 磁盘空间一样。在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的。(通过-Xmx和-Xms控制)
如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。
5)方法区
方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
Java虚拟机规范对这个区域的限制非常宽松,除了和Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集。
根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。
4.Java 平台
Java平台由Java虚拟机(Java Virtual Machine,简称JVM)和Java 应用编程接口(Application Programming Interface,简称API)构成。Java应用编程接口为此提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。Java应用编程接口已经从1.1x版发展到1.2版。常用的Java平台基于Java1.5,最近版本为Java7.0。

5、Java的三个技术流派被重新命名:J2SE-->Java 2 SEJ2eEE-->Java 2 EEJ2ME-->Java 2 MEJ2SE(Java2 Platform Standard Edition,java平台标准版)
J2EE(Java 2 Platform,Enterprise Edition,java平台企业版)
J2ME(Java 2 Platform Micro Edition,java平台微型版)。
其中,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:Servlet

Servlet Contaier
println("<h1>")
html标签要硬编码在应用程序中
JSP:
<%
%>
能够将jsp代码内嵌在html文档中

EJB(Enterprise JavaBeans):JAVA相关的诸多高级功能的实现,如RMI(Remote Method Invocation), 对象/关系映射,跨越多个数据源的分布式事务等;
JMS(Java Message Service):高性能异步消息服务,实现JAVA EE应用程序与非JAVA程序的“透明”通信;
JMX(Java Management Extensions):在程序运行时对其进行交互式监控和管理的机制;
JTA(Java Transaction API):允许应用程序在自身的一个或多个组件中平滑地处理错误的机制;
JavaMail:通过工业标准的POP/SMTP/IMAP协议发送和接收邮件的机制;
Java SE APIs:JNDI(Java Naming and Directory Interface):用于与LDAP服务交互的API;
JAXP(Java API for XML Processing):用于分析及转换XML(基于XSLT实现);
6.JDK和JREJDK:Java Development Kit 是用于实现Java程序开发的最小环境。JRE:Java Runtime Environment 是用于实现Java程序运行的最小环境。JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。
JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。
如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。7、Java 优势
与传统程序不同,Sun 公司在推出 Java 之际就将其作为一种开放的技术。全球数以万计的 Java 开发公司被要求所设计的 Java软件必须相互兼容。“Java 语言靠群体的力量而非公司的力量”是Sun公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。Sun 公司对 Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。Java 平台是基于 Java 语言的平台。这样的平台非常流行。因此微软公司推出了与之竞争的.NET平台以及模仿Java的C#语言。7.Java 执行过程

用Java语言来编写源代码,把它编译成Java Class文件,然后在Java VM中运行class文件;当编写程序时,通过调用类(Java API)中的方法来访问系统资源,而当程序运行时,它通过调用class文件中实现了Java API的方法也满足程序的Java API调用。 Java VM和Java API一起组成了一个“平台“,所有Java程序都在其上编译和运行,因此,它们有时也被称作Java运行时环境。Java VM的主要任务是装载class文件并且执行其中的字节码。Java VM包含一个类装载器(class loader),它可以从程序和API装载class文件;而Java API的类只在程序执行中需要时才会被装载。(如上图),Java字节码由执行引擎来执行。而不同的Java VM中,其执行引擎的实现可能各不相同。最简单的执行引擎不是一次性解释字节码,而是另一种称为“即时编译器(just-in-time compiler)”的执行引擎执行速度更快,但要消耗更多的内存资源。即时编译模式下,第一次被执行的字节码会被编译成本地机器代码并缓存下来以实现“复用”。第三种执行引擎是所谓的自适应优化器,此种方法中,虚拟机始的时候解释字节码,介是会监视运行中程序的活动,并且记录下使用最频繁的代码。程序运行时,虚拟机只把那些活动最频繁的代码编译成本地代码,而不频繁的代码则仍然保留为字节码由虚拟机解释执行。自适应优化器可以使得Java VM在80%-90%的时间里执行被优化过的本地代码,而只需要编译10%- 20%对性能有影响的代码。最后一种虚拟机由硬件芯片构成,它用本地方法执行Java字节码,其执行引擎内嵌于芯片中。
三、Servlet与JSP1. 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收到的应答发送给客户端。
由于servlet是在服务器上执行,通常与applet相关的安全性的问题并不需实现。要注意的是Web浏览器并不直接和Servlet通信,Servlet是由Web服务器加载和执行的。而Servlet是用Java编写的,所以它们一开始就是平台无关的。这样,Java编写一次就可以在任何平台运行(write once,run anywhere)的承诺就同样可以在服务器上实现了。Servlet还有一些CGI脚本所不具备的独特优点:Servlet是持久的。Servlet只需Web服务器加载一次,而且可以在不同请求之间保持服务(例如一次数据库连接)。与之相反,CGI脚本是短暂的、瞬态的。每一次对CGI脚本的请求,都会使Web服务器加载并执行该脚本。一旦这个CGI脚本运行结束,它就会被从内存中清除,然后将结果返回到客户端。CGI脚本的每一次使用,都会造成程序初始化过程(例如连接数据库)的重复执行。
Servlet是与平台无关的。如前所述,servlet是用Java编写的,它自然也继承了Java的平台无关性。
Servlet是可扩展的。由于servlet是用Java编写的,它就具备了Java所能带来的所有优点。Java是健壮的、面向对象的编程语言,它很容易扩展以适应你的需求。servlet自然也具备了这些特征。
Servlet是安全的。从外界调用一个servlet的惟一方法就是通过Web服务器。这提供了高水平的安全性保障,尤其是在你的Web服务器有防火墙保护的时候。
Setvlet可以在多种多样的客户机上使用。由于Servlet是用Java编写的,所以你可以很方便地在HTML中使用它们,就像你使用applet一样。那么,Servlet是怎样执行的?怎样来写一个Servlet,它的基本架构是怎么样的?这些问题,将在后面部分给予介绍。2.JSP与Servlet JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
它实现了Html语法中的java扩展(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。
JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。
Java Servlet是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。
尽管如此,JSP仍没有超出Java和Servlet的范围,不仅JSP页面上可以直接写Java代码,而且JSP是先被译成Servlet之后才实际运行的。JSP在服务器上执行,并将执行结果输出到客户端浏览器,我们可以说基本上与浏览器无关。
下面我们对JSP的运行来做一个简单的介绍,告诉大家怎样来执行一个JSP文件:
当Web服务器(或Servlet引擎,应用服务器)支持JSP引擎时,JSP引擎会照着JSP的语法,将JSP文件转换成Servlet代码源文件,接着Servlet会被编译成Java可执行字节码(bytecode),并以一般的Servlet方式载入执行。简单来说就是,*.jsp文件 -jasper引擎-> *.java文件 -javac编译器-> .class (JVM运行)。JSP引擎通常架构在Servlet引擎之上,本身就是一个Servlet,把JSP文件转译成Servlet源代码,再调用Java编译器,编译成Servlet。在JSP页面第一次被请求时,JSP引擎会将JSP原始文件转换成Servlet源代码,然后调用Java编译器,编译成Servlet并在Servlet引擎中执行。当再次有请求的时候,JSP引擎会见差异编译好的JSP是否比原来的JSP原始文件要新。如果是,则运行Servlet;如果不是,表示文件已经更新的了,就会从新执行转换和编译的过程。简单的说,SUN首先发展出Servlet,其功能比较强劲,体系设计也很先进。只是,它输出HTML语句还是采用了老的CGI方式,是一句一句输出。所以,编写和修改HTML非常不方便。后来SUN推出了类似于ASP的嵌入式的JSP(是Servlet发展的产物),把JSP TAG嵌入到HTML语句中,这样,就大大简化和方便了网页的设计和修改。新型的网络语言如ASP,PHP,JSP都是嵌入型的SCRIPT语言。
Servlet是用于开发服务器端应用程序的一种编程模型,如果只是一个普通的java应用,可以不使用Servlet来编写,但是如果想要提供基于web的服务能力,那么就必须按照这种模型来编写,而且Servlet也必须允许在符合Servlet规范的java web server or app server之上,否则无法运行。除非你自己实现一个Web server,但是其复杂度是比较高的,特别是在企业级应用中,对系统的稳定性和健壮性都要求比较高,所以Servlet的模型实际上是简化了编写稳健的服务器端的应用开发过程。Servlet 可以作为提供web服务能力的一个接入方式。
3.JSP 运程过程
一个JSP页面有多个客户访问,下面是第一个客户访问JSP页面时候,JSP页面的执行流程:客户通过浏览器向服务器端的JSP页面发送请求
JSP引擎检查JSP文件对应的Servlet源代码是否存在,若不存在转向第4步,否则执行下一步
JSP引擎检查JSP页面是否需要修改,若没修改,转向第5步,否则执行下一步
JSP引擎将JSP页面文件转译为Servlet源代码(相应的 .java 代码)
JSP引擎将Servlet源代码编译为相应字节码( .class代码 )
JSP引擎加载字节码到内存
字节码处理客户请求,并将结果返回给客户


在不修改JSP页面的情况下,除了第一个客户访问JSP页面需要经过以上几个步骤外,以后访问该JSP页面的客户请求,直接发送给JSP对应的字节码程序处理,并将处理结果返回给客户,这种情况下,JSP页面既不需要启动服务器,以便重新加载修改后的JSP页面。四、[b]常见的web Container(容器)[/b]

Servlet Container=Servlet+jdk

web Container=Servlet+jdk+jsp
通过上面的讲解大家对JSP与Servlet已经有所理解,最起码知道它们是做什么的,说到底它们都是程序设计语言,是帮助我们更好的编写程序。大家都知道,不管是Servlet也好,还是JSP也好它们编写出来的应用程序都是要运行的。在Web服务器的支持下可以执行解析并且运行,最终能被用户所看到并操作,这是才我们的最终目的。那能实现对JSP与Servlet解析并运行的Web服务器有哪些呢?(注,我们一般说能解析并运行JSP与Servlet的程序为Web服务器,可在JSP与Servlet这里我们称为Web容器。在下面的内容中我们就说Web容器,也就是Web服务器)商业版:WebSphere Application Server(IBM)%40
WebLogic Application Server (BEA--》Oracle)
Oc4j

Sun GlassFish Enterprise Server
JBoss Enterprise Application Platform
非商业版:Tomcat 内置web server能独立运行,能远程部署
Jetty 轻量,高效,嵌入式
resih 高性能,功能更为强大,源码不能用于商业应用,
开源JDK:Oracle JDKOpenJDKApache Harmony五、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 在严格意义上并不是一个真正的应用服务器,它只是一个可以支持运行Serlvet/JSP的Web容器,不过Tomcat也扩展了一些应用服务器的功能,如JNDI,数据库连接池,用户事务处理等等。Tomcat 是一种具有JSP环境的Servlet容器。Servlet容器是代替用户管理和调用 Servlet的运行时外壳。那么什么是Servlet容器呢? Servlet容器,负责处理客户请求。当客户请求来到时,Servlet容器获取请求,然后调用某个Servlet,并把Servlet的执行结果返回给客户。当客户请求某个资源时,Servlet容器使SERVLETREQUEST对象把客户的请求信息封装起来,然后调用JAVA Servlet API中定义的Servlet的一些生命周期方法,完成Servlet的执行,接着把Servlet执行的要返回给客户的结果封装到SERVLETRESPONSE对象中,最后SERVLET容器把客户的请求发送给客户,完成为客户的一次服务过程。1、Tomcat核心组件Catalina: servlet container (servlet 容器)
Coyote: http connection (http 连接器)Jasper:JSP Engine (JSP 引擎/翻译器)2、Tomcat 体系结构

Tomcat 支持Servlet 2.5和JSP 2.1的规范,它由一组嵌套的层次和组件组成,一般可分为以下四类:顶级组件:位于配置层次的顶级,并且彼此间有着严格的对应关系(如,Server、Service);
连接器:连接客户端(可以是浏览器或Web服务器)请求至Servlet容器,
容器:包含一组其它组件,如Engine、Host、Content;
被嵌套的组件:位于一个容器当中,但不能包含其它组件(如,Realm(用户账户数据库)、valve(基于用户的认证)、logger(记录日志));
Tomcat的开发语言:JAVA
Tomcat Instance:运行中的tomcat进程(JAVA进程)Server:即一个tomcat实例
Engine:Tomcat的核心组件,用于运行jsp或servlet代码Connector:接收并解析用户请求,将请求映射为Engine中运行的代码,之后,将运行结果构建响应报文顶级组件:服务器(server):Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。服务类组件:服务(service):一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器。给服务命名可以方便管理员在日志文件中识别不同服务产生的日志。一个server可以包含多个service组件,但通常情下只为一个service指派一个server。容器类组件:
(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组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。
连接器类组件:
连接器(connectors):负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2连接器。连接器协议: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服务器,它需要监听在某端口上以接收来自于商前服务器的请求。被嵌套类(nested)组件:
这类组件通常包含于容器类组件中以提供具有管理功能的服务,它们不能包含其它组件,但有些却可以由不同层次的容器各自配置。
(1).阀门(Valve):用来拦截请求并在将其转至目标之前进行某种处理操作,类似于Servlet规范中定义的过滤器。Valve可以定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。
(2).日志记录器(Logger):用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。日志记录的功能可被继承,因此,一个引擎级别的Logger将会记录引擎内部所有组件相关的信息,除非某内部组件定义了自己的Logger组件。
(3).领域(Realm):用于用户的认证和授权;在配置一个应用程序时,管理员可以为每个资源或资源组定义角色及权限,而这些访问控制功能的生效需要通过Realm来实现。Realm的认证可以基于文本文件、数据库表、LDAP服务等来实现。Realm的效用会遍及整个引擎或顶级容器,因此,一个容器内的所有应用程序将共享用户资源。同时,Realm可以被其所在组件的子组件继承,也可以被子组件中定义的Realm所覆盖。3、Tomcat 的运行模式standalone:通过内置的web server(就是连接器http connect)来接收客户端请求
proxy:由专门的web server服务客户端客户端的Http请求 in-process:两个组件部署于同一主机 network:部署于不同主机(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程序可以和其他语言编写的本地程序进行通信。(3).进程外的Servlet容器Servlet容器运行于Web服务器之外的地址空间,并且作为Web服务器的插件和JVM使用IPC(如TCP/IP)进行通信。进程外容器的反应时间不如进程内的容器,但有较好的伸缩性、稳定性等性能。IPC INTERPROCESS COMMUNICATION(进程间通信)的简写,它是实现进程间通信的一种技术。4、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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: