在了解tomcat服务器之前,我们先介绍下java的相关知识,因为tomcat是一款开源的java web服务器。所有了解下java的相关知识是很必要的。
java的体系结构包括四个独立且相关的技术:
1、java程序设计语言
2、java class文件
3、java应用程序接口(API)
4、java虚拟机
java编译执行过程
用java语言编写源代码,把它编译成class文件(字节码),然后再有java虚拟机装载这些class文件并在虚拟机中解释执行。在编写程序时,可以通过调用java API中的方法来访问系统资源;而当程序运行时,它通过调用class文件中实现的API方法来满足java API的调用。java虚拟机和java API组成一个“平台”,所有的java程序都必须在这个平台上编译执行。
java虚拟机
java技术的核心就是java虚拟机。所有的java程序都在其java虚拟机上运行。
java虚拟机是一台抽象的计算机,它主要的任务就是装载class文件,类文件由装载器(class loader)完成,也会装载API class文件。它可以从程序和API中装载class文件。class文件中的字节码由执行引擎来执行。
执行引擎的方式
不同的虚拟机中,执行引擎的实现可能不同。其执行引擎的实现由三种:
1、在由软件实现的虚拟机中,最简单的执行引擎就是一次性解释字节码
2、即时编译,即第一次执行字节码时会被编译成本地机器代码,并将这些编译过的机器代码缓存在本地,等到以后被调用时可以实现重用。第二种比第一种执行引擎效率上要高很多,执行速度也更快,但相对的缺点就是内存消耗很大。当内存消耗剧烈的时候,jvm就会出现异常。
3、自适应优化器,虚拟机开始解释执行字节码时,会监视运行中程序的活动,并将最繁忙的代码段记录下来。当程序运行时,虚拟机只会把那些活动最繁忙的代码段编译成本地代码,而那些不常用的代码段,继续保留为字节码,由虚拟机解释执行他们。自适应优化器可以使得Java VM在80%-90%的时间里执行被优化过的本地代码,而只需要编译10%-20%对性能有影响的代码。
java的特性
1、平台无关系
2、安全性
3、网络移动性
java中的两种方法
本地方法:本地方法是由其他语言比如c\c++\汇编语言编写的,编译器和处理器的相关代码。本地方法保存在动态链接库中,格式是各个平台专有的。java程序通过一个本地方法接口(Java Native Interface ,JNI)装载包含这个本地方法的动态库,并调用这个方法。一旦调用了本地方法,那么java程序就失去了平台无关性,只能在特定的平台上运行。因为你调用的本地方法可能在其他平台上无法运行或者根本就没有,或者其他java平台不支持JNI调用,那么这个时候java程序只能在特定的平台上执行了。
java方法:由java语言编写并编译字节码,存储在class文件中,并在java虚拟机中解释执行。虽然这些java程序需要调用其相关方法来完成程序的功能,但是这些java程序中所有到的方法或API都能够被所有的java平台供应商所实现,因为这些API或方法的实现都定义在java虚拟机中。只要你的java程序没有通过JNI调用本地方法,那么你的java程序就是平台无关的。
类装载器
类装载器包括启动类装载器和用户自定义类装载器
在java虚拟机上,存在着多个类装载器,因而结构图中的类装载器方法实际标示的是一个可能包含多个类装载器的子系统。
一个java应用程序可以使用两种类装载器,启动bootstrap类装载器和用户定义的类装载器。启动类装载器是系统中惟一的,他是java虚拟机实现的一部分。启动装载器通常使用默认的方式从本地磁盘中装载类,包括java api类。启动类装载器也被叫做原始类装载器、系统类装载器或者默认类装载器。
java 应用程序能够在运行时安装用户定义的类装载器,这种类装载器能够使用自定义的方式类装载类。
每一个类被装载的时候,Java虚拟机都监视这个类,看它到底是被启动类装载器还是被用户类装载器装载。当被装载的类引用了另外一个类时,虚拟机就会使用装载第一个类的类装载器装载被引用的类。
由于Java虚拟机采取这种方式实现类的装载,所以被装载的类默认情况下只能看到被同一个类装载器装载的别的类。通过这种方法,Java的体系结构允许在一个Java应用程序中建立多个命名空间.运行时的Java程序中的每一个类装载器都有它自己的命名空间。这就能够限制阻止不同来源的代码之间的相互访问,有效地提高程序的安全性。
Java class文件
Java class文件主要在平台无关性和网络移动性方面使Java更适应于网络。
平台无关性:通常情况下,一个平台上的二进制可执行文件不能在其他平台上工作。而Java class文件是可以运行在任何支持Java虚拟机制硬件平台和操作系统上的二进制文件。
网络适应性:class文件设计的紧凑,因此它们可以快速地在网络上传送。其次由于Java程序是动态链接和动态扩展的,class文件可以在需要的时候才下载。
Java API
Java API是运行库的集合,它提供一套访问主机系统资源的标准方法。Java API是相对安全的,它是保证平台无关性的前提,因为Java虚拟机和Java API class文件是任何Java平台都要实现的必要部分。在一个平台能够支持Java程序以前,必须在这个特定平台上明确地实现API的功能。
什么是java虚拟机?
Java虚拟机之所以被称为是“虚拟”的,就是因为它仅仅是由一个规范来定义的抽象计算机.
Java虚拟机抽象规范仅仅是个概念,一般所说的Java虚拟机都是该规范的具体实现,这个实现可能来自多个提供商,并存在于多个平台上。它可以完全用软件实现,或者以硬件和软件相结合的方式来实现。当运行一个Java程序的同时,也就在运行了一个Java虚拟机实例。
这个实现了的Java虚拟机(Java Virtual Machine) 简称JVM, Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器(由Java栈模拟实现)等,还具有相应的指令系统。
Java虚拟机充当一个硬件平台,假设它等价于一个真实硬件系统,那么java语言就相当于c语言,而java语言编译后的class字节码文件则相当于针对这个硬件平台的汇编指令.
Java虚拟机体系结构
类装载器:装载程序class文件和API class文件
执行子系统或执行引擎:每个Java虚拟机都有一个执行引擎,它负责执行那些包含在被装载类的方法中的指令
运行时数据区:当Java虚拟机运行一个程序时,它需要内存来存储许多东西,例如,字节码、从已装载的class文件中得到的其它信息,程序创建的对象,传递给方法的参数、返回值、局部变量、以及运算的中间结果等等,Java虚拟机把这些东西都组织到几个”运行时数据区”中,以便于管理
方法区及堆
每个Java虚拟机实例都有一个方法区以及一个堆,它们被该虚拟机所有线程所共享。
方法区:存放class文件中的二进制数据的类型信息
堆:存放程序运行时所创建的对象
Java栈及pc寄存器(程序计数器)
Java虚拟机中的每条线程拥有自己的Java栈及程序计数器。因此java栈和程序计数器作为私有内存存储
Java栈:总是存储该线程中Java方法调用的状态信息(包括它的局部变量、被调用时传进来的参数、它的返回值,以及运算的中间结果等等)
pc寄存器的值将总是指示下一条将被执行的指令。
本地方法栈:存储本地方法调用的状态
Java web
Java Web,是用Java技术来解决相关web互联网领域的技术总和。web包括:web服务器和web客户端两部分。Java在客户端的应用有java applet不过现在使用的很少,Java在服务器端的应用非常的丰富,比如Servlet,JSP和第三方框架等等。Java技术对Web领域的发展注入了强大的动力。
Java web的架构
Java的Web框架虽然各不相同,但基本也都是遵循特定的路数的:使用Servlet或者Filter拦截请求,使用MVC的思想设计架构,使用约定,XML或 Annotation实现配置,运用Java面向对象的特点,面向抽象实现请求和响应的流程,支持Jsp,Freemarker,Velocity等视图。
MVC模式
MVC全称为Model View Controller,模型-视图-控制器,这是一种web应用程序的设计模式。其中:
model是应用程序中用于处理应用程序数据逻辑的部分
view是应用程序中处理数据显示的部分,实现展示功能
controller负责从视图读取数据,控制用户输入,并向模型model发送数据,再由视图返回
MVC分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。比如,您可以在不依赖业务逻辑的情况下专注于视图的设计。同时也让应用程序的测试更加容易。
MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。
JSP简介
JSP是一种脚本语言,包装了Java Servlet系统的界面,简化了Java和Servlet的使用难度,同时通过扩展JSP标签(TAG)提供了网页动态执行的能力。尽管如此,JSP仍没有超出Java和Servlet的范围,不仅JSP页面上可以直接写Java代码,而且JSP是先被译成Servlet之后才实际运行的。JSP在服务器上执行,并将执行结果输出到客户端浏览器。JSP是servlet的扩展。
Servlet简介
Servlet是用Java编写的Server端程序。具有独立于平台和协议的特性,可以生成动态的Web页面。它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。
JSP和servlet的区别
JSP与Servlet之间的主要差异在于,JSP提供了一套简单的标签,和HTML融合的比较好,可以使不了解Servlet的人可以做出动态网页来。JSP修改后可以立即看到结果,不需要手工编译,JSP引擎会来做这些工作;而Servelt却需要编译,重新启动Servlet引擎等一系列动作。简单的说,JSP在设计表现层(页面展示)这部分效果更好,而servlet采用了老的CGI方式,是一句一句输出,所以,编写和修改HTML非常不方便。但是servlet在业务逻辑应用设计这一块功能比较强大。后来sun公司在servlet的基础上进行扩展,也就诞生了JSP语言。不过JSP是java语言作为脚本语言的,专门用来动态生成网页的。由于在大型项目上一般采用MVC模式进行设计,所以也就有了使用JSP来设计表现层,servlet用来设计业务逻辑应用层。
因此对于一个java web应用程序来说,它的执行流程应该是这样的:
java运行环境和开发环境
JRE是Java Runtime Environment的缩写,即Java运行时环境。Java程序运行时必需要JRE的支持。
JDK是Java Development Kit的缩写,即Java开发工具集。JDK是整个Java的核心,包括了Java运行环境(JRE)、Java开发工具和Java基础类库。
Java的平台版本:
Java分为J2SE、J2EE和J2ME三个不同的平台版本,即标准版(Java 2 Platform, Standard Edition)、企业版(Java 2 Platform, Enterprise Edition)和微型版(Java 2 Platform, Micro Edition)。从Java 1.5(或者Java 5.0)开始,它们被改称为Java SE、Java EE和Java ME。
各平台版本之间的差别在于适用范围不同:
标准版平台(Java SE)允许开发和部署在桌面、服务器、嵌入式和实时环境中使用的Java应用程序。另外,Java SE包含了支持实现Java Web服务的类库,因此标准版是企业版的基础。
企业版平台(Java EE)帮助开发者开发和部署Java Web应用。企业版提供Web服务、组件模型、管理和通信API,可以用来实现企业级的面向服务的体系结构(Service-Oriented Architecture, SOA)和Web 2.0 应用程序。
而微型版平台(Java ME)主要用于移动设备和嵌入式设备,如手机、PDA、电视机顶盒等等。微型版包括灵活的用户界面、健壮的安全模型、许多内置的网络协议、以及对可动态下载的在线和离线应用的支持。基于Java ME规范的应用程序与普通Java程序一样,只需编译一次,即可在许多设备上运行。