Tomcat专题一:tomcat基础之java

Tomcat基础之JAVA

 

    各位小伙伴,从这篇文章开始,接连将有七篇文章来对tomcat这个软件,或者说是WEB容器做一个专题讨论。还是一样的格调,本人不会有意排版,把文章搞的跟专业论文一样,只是想到哪写到哪,尽量写出自己知道的东西。

 

    之所以介绍一下java,是因为tomcat所面向的语言就是java语言,它是java程序的一个解释容器。虽然tomcat自身也实现了一个WEB容器,不但可以解释java程序,也可以解释html语言,但是在生产环境中,约定俗成的都是用tomcat来构建java应用服务器。根据我的理解,tomcat只是提供了一个java应用的WEB框架,例如:与前端http协议对接的WEB接口,servlet容器,连接器,虚拟机主机等,而提到java应用不得不提的jvm虚拟机,其实这不是tomcat的功能,而是java这个体系所提供的功能。因此,要想全面了解tomcat,有必要对java程序设计语言有一个大致的了解。

 

程序的演变

    java是一个跨平台的程序设计语言,这到底体现在什么地方呢?什么样的机制使得其能够实现跨平台的应用。

    从程序的演变来看,早期在计算机刚刚诞生的时候,那个时候的编程语言是机器语言,所谓的机器语言也就是一堆的二进制01代码,由于学习困难,编程难度大,因此后期出现了汇编语言,汇编语言在一定的程度上有所提高,但是因为其非常接近机器语言,因为也使很多程序员望而止步。为了解决这种现状,后期又出现了高级语言,也就是现在经常使用的编程语言,例如:c,c++,php,java等。

 

    既然产生了这么多的高级语言,使得程序员越来越得心应手,但是对操作系统架构来说还存在着诸多的问题。这里就需要我们对操作系统有一个了解,这里我针对的linux系统(对于其它系统也基本一样)。

    学linux的可能都知道,在linux系统中,有两种重要的工作空间,一是用户空间,另一个是内核空间。用户空间通过shell这个外壳和上层使用者进行交互,内核空间管理着计算机的各种环境,在这里要特别知道的是内核管理着计算机的所有硬件功能。所有用户空间的程序都不允许直接跟硬件交互,必须通过内核来跟硬件进行交互,而内核跟硬件交互则是通过一个一个功能单一的system call来实现与硬件打交道,控制硬件的运行。

    对于编程语言来说,最终的执行无非就是调用硬件来完成一些列的工作,因此要想操作硬件,就必须调用内核的system call才能完成与硬件的交互。然后system call功能非常单一,对于复杂的应用程序来说可能会调用一大堆的system call 这往往可能比程序自身还要臃肿,为了解决这个问题,就产生了API这个概念。API,application program interface 应用程序编程接口,它所实现的功能就是封装一些列的system call 形成一系列的类库lib,这一些不同的类库就被称为API。API诞生之后,程序语言不用在调用一个个system call,而在需要完成某些功能的时候,只需要调用一个封装了多个systemcall的类库就行,或者说只要调用一下对应功能的API接口就行。

    有了API之后,大大减轻了程序员的工作,但是对于程序来说,不同系统之间的API不同,导致了在不同系统上开发的程序不能在另一种操作系统上进行编译,为了磨合这种分别,产生了POSIX:portableoperating system,只要遵循这种规范,就可以将在一种操作系统上开发的程序可以在任何遵循posix的系统上进行编译,到这里应用程序算是实现了跨平台的编译,但是还不能跨平台运行。因为虽然API的不同被磨合了,但是不同系统之间的ABI不同,所谓ABI:application binary interface,应用二进制接口。遵循了posifx接口虽然可以在任何系统上进行编译运行,但是在一种操作系统上编译好的程序却不能够直接在另一种操作系统上运行。因为两种操作系统的二进制接口不同。例如linux基于.so,而windows是基于.dll的。为了实现跨平台运行,除非再产生一种机

制磨合ABI的不同。此时java就出现了,java不但磨合了API还磨合了ABI,这主要归于java的虚拟机jvm。jvm虚拟机机制其实分为两块,一块是与上层程序语言直接相关jvm虚拟机,一块则与下层系统直接相关jvm机制,通过jvm的这种两层机制就磨合了ABI的不同,使得在一种系统上编译的java程序,可以轻松的运行在不同的操作系统上。

    因此就产生了一种说法:java程序一次编译,到处运行。但是要记住java的运行要基于java的虚拟机。到这里总算引出了java语言,说了上面这一堆很抽象的东西,其实就是为了解释下java语言为什么能够跨平台运行。

 

JAVA技术要点

    java应用有四个独立但又相关的组成部分

1.java程序设计语言

2.java API :java应用程序编程接口,有时也可以认为是封装了一些列函数的库

3.java class:java 类文件

4.jvm :java virtual machine ,java虚拟机

关联流程:

    java程序设计语言结合javaAPI,实现各种功能的java程序,java程序通过java编译器(其实也就是javac)编译成一些列的java 类文件,java类文件则放于jvm中运行,实现程序功能,只有编译成java类文件才能在jvm中运行。

 

java程序通常都是以 .java结尾的文件

java类文件通常都是以 .class 结尾的文件(相当于字节码)

 

    既然java程序在运行前必须要进行编译成.class文件才能在jvm中执行,那jvm的实现方式又是什么呢?(注意:java程序是在jvm中运行的,因此编译的过程也是在jvm中实现的)

 

jvm实现程序编译的方式:

1.一次性的解释器,解释字节码并执行(即解释.class文件),解释的过程是将字节码转换成真正二进制的过程。要注意是每次执行都需要解释

2.即时编译器(just-in-time complier),第一次解释字节码,解释之后就会缓存解释成的二进制码,因此就会需要更多的内存来缓存解释后的结果。此时可能会导致占据大量内存,如果jvm虚拟机内存不够的话,就会导致内存溢出的状况

3.自适应编译器:自动的缓存那些执行屏蔽比较搞的字节码的二进制码,而不是全部缓存,这样就结合了1和2两种方法取得折中。二八法则,缓存20%左右的代码,提高80%左右的速度;

 

jvm:有很多种jvm

    sun公司自己的jvm:hotspot jvm

       又分为两种;

           JRE: java 运行环境

           JDK:java开发环境

              JDK包含了jre,但不止jre一个功能,还包括很多的开发功能等

             

    开源界的jvm:openjdk

       开发+运行的开源实现

 

JRE:java runtime environment ,其实一个最简单的jvm虚拟机的实现就是JRE,要运行java程序就必须要安装JRE。但是JRE不紧紧实现了jvm的功能,还提供了一些功能性的API

JDK:JDK的功能比较多,基本上包含了JAVA程序源码,API,jvm等功能

 

JAVA根据其应用领域的不同,JAVA技术可分为三类:

    JAVA SE :JAVA 标准版类库,适合中小型企业

    JAVA EE :JAVA 企业版  大型企业

    JAVA ME:mobileedtion,java移动版,用于开发手机程序(用的比较少)

 

 

此外,jvm虚拟机还实现了很多中垃圾回收机制,这些东东就不在聊了,不是程序员,说不清楚啊。

 

JAVA实现的动态网站

客户端动态网站:

    applet:小程序

       将java开发的applet小程序嵌入到html网页中,客户端访问html页面的时候,将applet小程序一起下载到本地,然后在本地的jre环境中进行运行,此时必须保证客户端安装了jre运行环境

   

服务器动态网站:

    CGI:commongateway interface

    在服务器端生成静态页面,直接返回给客户端,而不用在客户端使用jre运行动态内容

   

    Servlet:JAVA 实现的CGI,增加了对http协议的处理能力,能够识别html文档无论上面的那种实现方式,静态页面都是归java源程序所管理,一旦发生改变,就必须重新先编译成字节码才能在jvm虚拟机中运行

 

    JSP:java ServerPage

       是基于Servlet上的一种特殊类,可以实现在html文档中嵌入java程序,这样html文档就不需要java源程序来处理了。jsp实现了将java程序以标签的形式嵌入到html页面中。

    JSP程序执行时,使用jasper将jsp页面必须先转换成servlet,然后在java编译器编译成字节码在jvm虚拟机中运行

    JSP的性能和稳定程度要比php程序好的多的多,因此在大型应用程序和业务的场合,基本都使用jsp程序。

 

    到这里为止,基本上可能大家有一种疑惑,上面说了这么多语言之类的,那tomcat到底是处理那种语言编写的页面。这里还是要简单的介绍一下相互之间的关系。java语言是一种程序设计语言,早期的java语言是一种静态语言,为了实现动态网站,后期应用而生了applet,servlet技术,applet是一种在客户端执行的技术,而sevlet则是在服务器端执行的技术,但不管是applet还是servlet技术,其都是java语言中的一个类库,都是用java语言实现的。而JSP语言是基于servlet技术之上的一个特殊类库,其能够实现java语言嵌套在html页面中,当用户请求时,请求到jsp的页面时候,会将嵌套的java语言编译成servlet,然后在编译成字节码,在jvm虚拟机中运行,然后返回结果和html页面一起返回给客户端,使用JSP这种技术,html这种静态页面就无需再和java程序一起编译。而现如今,java实现的动态网站都是JSP这种技术,可以说JSP不是一种真正的编程语言,而是一种框架,整合了java语言和html页面。因此,虽然你可能经常看到的是.jsp结尾的页面,但里面嵌套的动态页面还是java语言,所以说tomcat处理java程序也是对的。其次大家要注意的是,这里讨论jsp和java是从编程的角度理解,而不是一上来就是什么执行过程,jvm虚拟机之类的。举个例子对比一下,如果现在让你写个jsp的页面,写个java程序,你可能不是想什么jvm运行,而是脑子里面第一闪过的就是jsp和java编程的知识,什么样的编程格式,直接点说写jsp和java源程序页面是一样的吗? 我想使用java开发的人才能说清楚这里面的关系,大家有不清楚的可以和开发沟通,而当你问jsp和java的区别时,开发绝对不会跟你说什么jvm运行之类的。此时你就明白了我到底是要表明一种什么意思。

 

 

好,关于tomcat之java技术只是就说到这里,纯属个人理解。有不对之处,可以交流。

 


本文出自 “生死如梦莫多情” 博客,请务必保留此出处http://mingyang.blog.51cto.com/2807508/1577100

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。