一、Java技术体系

在早期,Java被称为Java开发工具包或JDK,是一门与平台(由一组 必需的API组成)紧密耦合的语言。

从1998年底的1.2版本开始,Java技术栈被分割为下面关键部分:

  • Java是一门包含了严格和强类型语法的语言。
  • Java 2平台标准版本,被称为J2SE,指的是平台以及java.lang和java.io包中包含的类。它是构建Java应用程序的基础。
  • Java虚拟机或JVM是一个可运行编译后Java代码的软件虚拟机。因为被编译过的Java代码只是字节码,JVM将在运行代码之前,把字节码编译成机器码。JVM还负责管理内存,从而实现了应用程序代码的简化。
  • Java开发工具包或JDK。它包括了Java语言编译器、文档生成器、与本地代码协作的工具和用于调试平台类的Java源代码。
  • Java运行时环境或JRE曾经并且现在也仍是终端用户用于运行编译后Java应用程序的软件。它包含了JVM但不含任何JDK中的开发工具。而JDK包含了一个JRE(即jdk既包含开发工具又包含JRE)。

上述5个组件曾经都只是规范,而不是实现。任何公司都可以通过规范实现Java技术栈,比如IBM有自己的JDK。开源社区则形成了OpenJDK项目,该项目提供Java栈的开源实现。

我们在Oracle网站下载的JDK,实际也是一种实现,sun公司最初就提供了Java、J2SE、JVM、JDK和JRE的标准实现,sun公司的Java实现是首选,也就是我们一般讲的JDK。在Oracle收购了Sun之后,Sun和Oracle的实现变成了同一个。

JDK中是包括了Java SE的,我们在Oracle网站的下载JDK,会来到下面的页面,该页面叫Java SE Development Kit Downloads page,JDK不仅包含了Java SE,还包含了JVM以及各种工具,可以看成Java SE开发的套件,JDK和Java SE开发是融于一体的,JDK是Java开发的最小环境,Java SE开发必须使用JDK,当然,Java EE等其他一切Java开发都离不了JDK。

Sun和Orcle并没有官方实现Java EE,而是各个Web服务器厂商自己实现。

以上根据各个组成部分的功能来进行划分的,如果按照技术所服务的领域来划分,或者说按照Java技术关注的重点业务领域来划分,Java技术体系分为四个平台:

  • Java Card
  • Java ME
  • Java SE
  • Java EE

Java SE、Java EE等名词,既是规范又是实现,用的时候并不怎么区分,容易搞混。

二、Java运行流程

高级语言需要翻译成机器语言,才能够被机器执行。根据不同的翻译方式,高级语言可以被分为解释型语言和编译型语言,比如C语言是编译型语言,python是解释型语言。

Java是一种编译型-解释型语言,既有编译过程又有解释过程。

2.1 解释型语言和编译型语言

计算机程序,其实就是一组计算机指令的集合,能真正驱动机器运行的是机器指令,但让普通开发者直接编写机器指令是不现实的,因此就出现了计算机高级语言。高级语言允许使用自然语言(通常就是英语)来编程,但高级语言的程序最终必须被翻译成机器指令来执行。
高级语言按照程序的执行方式,可以分为编译型和解释型两种。

编译型语言

编译型语言是指使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码,一次性“翻译”成可被该平台硬件执行的机器语言(包括机器指令和操作数),并包装成该平台所能识别的可执行程序的格式,这个转换过程称为编译(Compile)。编译生成的可执行程序可以脱离开发环境,在特定的平台上独立运行。即物理计算机操作系统直接运行。

编译器,可以理解为就是一个比较复杂的计算机程序,它可以接受一个以高级语言编写的程序,并将其翻译成以某个计算机的机器语言表达的等效程序。

有些程序编译结束后,还可能需要对其他编译好的目标代码进行链接,即组装两个以上的目标代码模块生成最终的可执行程序,通过这种方式实现低层次的代码复用。
因为编译型语言是一次性编译成机器语言的,所以可以脱离开发环境独立运行,而且通常运行效率较高。但因为编译型语言的程序被编译成特定平台上的机器码,因此编译生成的可执行程序通常无法移植到其他平台上运行,如果需要移植,则必须将源代码复制到特定平台上,针对特定平台进行修改,至少需要采用特定平台上的编译器重新编译。

现有的 C 、C++、Objective-C、Pascal 等高级语言都属于编译型语言。

半编译型语言

此外,还有一种伪编译型语言,如 Visual Basic,它属于半编译型语言,并不是真正的编译型语言。它首先被编译成 P-code 代码(中间代码),并将解释引擎封装在可执行程序内,当运行程序时,P-code 代码才会被解析成真正的二进制代码。
从表面上看,Visual Basic 可以编译生成可执行的 EXE 文件,而且这个 EXE 文件也可以脱离开发环境,在特定平台上运行,非常像编译型语言。实际上,在这个 EXE 文件中,既有程序的启动代码,也有链接解释程序的代码,而这部分代码负责启动 Visual Basic 解释程序,再对 Visual Basic 代码进行解释并执行。

解释型语言

解释型语言是指使用专门的解释器,将源程序逐行解释成特定平台的机器代码并立即执行的语言。
解释型语言通常不会进行整体性的编译和链接处理,解释型语言相当于把编译型语言中的编译和解释过程混合到一起同时完成。
可以这样认为,每次执行解释型语言的程序都需要进行一次编译,因此解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。但解释型语言有一个优势,就是跨平台比较容易,只需提供特定平台的解释器即可,每个特定平台上的解释器都负责将源程序解释成特定平台的机器指令。

也就是说,解释型语言可以方便地实现源程序级的移植,但这是以牺牲程序执行效率为代价的。

编译型语言PK解释型语言

编译型语言和解释型语言的对比如图 1 所示。


图 1 编译型语言和解释型语言

编译型的语言效率为什么高?借助图 1 不难理解,编译型语言和解释型语言的区别在于,编译是对高级语言程序进行一次性翻译,这样的好处是,一旦源程序被彻底翻译,它就可以重复运行,且今后都不再需要编译器和源代码;而如果使用解释器,则高级语言程序每次运行,都需要借助源程序和解释器,其最大的好处就是,程序有很好的可移植性。

编译型语言编译好了可执行文件,可以直接运行,比如c++生成可执行文件后,我们直接执行即可,拷贝到另一个相同的平台也可以直接运行。Java效率也不错,我们也是编译好了.class文件,比如用maven打包成jar包,里面有.class文件,我们拷贝到任何平台上使用,都避免了编译工作(jvm里可能还会编译),但是纯解释型的语言,不进行编译,不生成可执行文件,通过解释器将高级语言转为机器码,可想而知效率肯定不如直接运行可执行文件高,且每次执行都要重新解释。

2.2 Java运行流程

Java运行流程大致可以分为编译期和运行期。

编译期: 是指把源码交给编译器编译成计算机可以执行的文件的过程。就是把Java代码编成class文件的过程,编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作,比如检查错误。编译时期检查语法错误,也就是源代码有没有写错,如果源代码没写错,生成的.class文件在运行时期出错,这些情况就叫异常。

运行期:是把编译后的文件交给计算机执行,直到程序运行结束。所谓运行期就把在磁盘中的代码放到内存中执行起来,在Java中把磁盘中的代码放到内存中就是类加载过程,类加载是运行期的开始部分。

编译期分配内存并不是说在编译期就把程序所需要的空间在内存中分配好,而是说在编译期生成的代码中产生一些指令,在运行代码时通过这些指令把程序所需的内存分配好。只不过在编译期的时候就知道分配的大小,并且知道这些内存的位置,而运行期分配内存是指只有在运行期才确定内存的大小,存放的位置。

Java中的绑定:绑定指的是把一个方法的调用与方法所在的类(方法主体)关联起来(这个方法被哪个类调用),对Java来说,分为静态绑定和动态绑定。

静态调用:在程序执行前方法已经被绑定,也就是在编译期方法明确知道被哪个类调用。java当中的方法只有final,static,private和构造方法是前期绑定的。

动态调用:在运行时根据具体对象的类型进行绑定(只有运行时才知道方法被哪个类调用)。在java中,几乎所有的方法都是后期绑定的。

Java编译器:将Java源文件(.java文件)编译成字节码文件(.class文件,是特殊的二进制文件,二进制字节码文件),这种字节码就是JVM的“机器语言”。javac.exe可以简单看成是Java编译器。

Java解释器:是JVM的一部分。Java解释器用来解释执行Java编译器编译后的程序。java.exe可以简单看成是Java解释器。

通常情况下,一个平台上的二进制可执行文件不能在其他平台上工作,因为此可执行文件包含了对目标处理器的机器语言。而Class文件这种特殊的二进制文件,是可以运行在任何支持Java虚拟机的硬件平台和操作系统上的。

字节码文件通过类装载器装载,被分配被分配到JVM的运行时数据区,然后会被执行引擎执行。执行引擎以指令为单位读取Java字节码。每个字节码指令都由一个字节的操作码和附加的操作数组成。执行引擎取得一个操作码,然后根据操作数来执行任务,完成后就继续执行下一条操作码。将人能读懂的字节码文件转化为jvm可以读懂执行的语言,在jvm中通过三种方式经行转化,即解释器模式,JIT编译器模式,混合模式。

  • 解释器模式 (java -Xint -version)仅使用解释器方式执行

  一条一条地读取,解释并且执行字节码指令。因为它一条一条地解释和执行指令,所以它可以很快地解释字节码,但是执行起来会比较慢,没有JIT的配合下效率不高。

  • JIT编译器模式 (java -Xcomp -version)优先采用编译方式执行程序,但解释器要在编译无法进行的情况下介入执行过程 

  即时编译器把整段字节码不加筛选的编译成机器码不论其执行频率是否有编译价值,在程序响应时间的限制下,没有达到最大的优化。

热点代码

  在刚开始的时候,jvm不知道这段代码,是否会频繁的调用方法,或是一个循环,也就是这段代码被多次执行,因此刚开始的时候并不会编译代码,将代码翻译成 java 字节码相对于编译这段代码并执行代码来说,要快很多。编译器回去衡量哪些方法会被频繁调用,如果一个方法的执行频率超过一个特定的值的话,那么这个方法就会被JIT编译成本地代码。而这个方法或代码块因其运行特别频繁,就会认为这是“热点代码”(Hot Spot Code)。当 JVM 执行某一方法或遍历循环的次数越多,就会更加了解代码结构,那么 JVM 在编译代码的时候就做出相应的优化。

热点代码分为二类:

  • 多次被调用的方法
  • 多次被执行的循环体
  • 检测热点代码:

  • 方法计数器:记录方法调用的次数
  • 回边计数器:记录代码块循环次数
  • 当计数器数值大于默认阈值或指定阈值时,方法或代码块会被编译成本地代码。

  • 混合模式 默认(java -version混合模式)

  在解释执行的模式下引入编译执行,刚好可以弥补相互的缺点,达到更优的效果。

  程序刚开始启动的时候,因为解释器可以很快的解释字节码,所以首先发挥作用,解释执行Class字节码,在合适的时候,即时编译器把整段字节码编译成本地代码,然后,执行引擎就没有必要再去解释执行方法了,它可以直接通过本地代码去执行它。执行本地代码比一条一条进行解释执行的速度快很多,主要原因是本地代码是保存在缓存里的。

如上图可以看出,整个java应用程序的执行过程如下:

  • 源代码经javac编译成字节码,class文件
  • 程序字节码经过JIT环境变量进行判断,是否属于“热点代码”(多次调用的方法,或循环等)
  • 如是,走JIT编译为具体硬件处理器(如sparc、intel)机器码
  • 如否,则直接由解释器解释执行

2.3 C++和Java编译过程对比

C++是静态编译器,编译结束最终生成平台相关的机器码,而Java的编译生成.class文件格式的字节码,字节码交给JVM,JVM中的解释器和JIT会将平台无关的.class文件,转为平台相关的机器码。

C++、C#等语言执行过程如下:

C++会先转为汇编语言,再转为机器码:

C++编译是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再转换为机器代码,生成目标文件(.obj)。分为两个过程:

(1)编译:

  • 预处理阶段
  • 宏#define
  • 条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif等。
  • 头文件包含,#include <iostream>
  • 特殊符号
  • LINE标识将被解释为当前行号(十进制数)

  • FILE则被解释为当前被编译的C源程序的名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换

  • 编译、优化阶段
  • 针对代码优化,不依赖具体计算机
  • 针对计算机优化

(2)汇编

把汇编语言代码翻译成目标机器指令,生成目标文件(.o文件、.obj文件),此过程会依赖机器的硬件和操作系统环境。

Java不会转为汇编语言,而是生成字节码,字节码再通过JVM转为机器码。字节码是已经经过编译,但与特定机器码无关,需要解释器转译后才能成为机器码的中间代码,这是Java跨平台的关键。不同平台下载不同的JDK,里面包含各平台的JVM,不同平台的JVM都可以处理.class文件,.class文件和虚拟机共同保证了跨平台性。

三、Java的特点

最初的Oak语言为了嵌入式而开发,但是当时的消费性电子产品市场无法达到预期,而互联网兴起,Java针对嵌入式的特性也恰好与互联网很搭,Java转而以互联网为目标,不断发展,Java诞生之初就是和互联网密不可分的,反而相对并不太适合嵌入式了。

Java的特点正是源于Java的发展目标。

1.面向对象

 

2.多线程

大多数操作系统都给一个进程产生和管理多个线程的能力,这些线程彼此独立地完成不同的任务。但是,很少由程序语言提供对线程管理的直线支持,通常都需要直接调用操作系统功能。Java却相反,直接在语言中提供了产生、管理和协调同步线程的功能。与Java的其他特点一样,该功能是必要的,因为设计者不敢确定底层的操作系统是否支持多线程。

开发者越来越多地在程序中使用线程,将其作为满足一个程序不能完成的,通常相互无关的一些任务的一种手段。由于Java对线程有内置语言支持,以Java创建多线程较之与其他语言更简单、更自然。

多线程功能使得在一个程序里可同时执行多个小任务。因为Java实现的多线程技术,所以比C和C++更键壮。多线程带来的更大的好处是更好的交互性能和实时控制性能。当然实时控制性能还取决于系统本身(UNIX,Windows,Macintosh等),在开发难易程度和性能上都比单线程要好。任何用过当前浏览器的人,都感觉为调一副图片而等待是一件很烦恼的事情。在Java里,你可用一个单线程来调一副图片,而你可以访问HTML里的其它信息而不必等它。

3.分布式

 

Java支持在网络上应用,它是分布式语言。它既支持各种层次结构的网络连接,也以Socket类来支持流(Stream)的网络连接。所以用户可以产生分布式的客户端与服务端。而网络可以理解为软件应用的分布式运载工具。Java程序只需要编写一次,就可以到处运行。

在Java中,网络类包括 TCP/IP流和使用TCP及UDP的数据报程序,用于HTTP和URL服务的操作方法,以及错误检查代码和恢复功能。虽然实现网络也可能用其他语言,比如C语言,但那些语言要求特别的附件软件包、DLL,或其他必须由操作系统或者第三方销售提供的程序模块。特别附件通常要求有操作系统或第三方工具的知识,不像Java,有标准的、内置的网络支持。Java包括网络包是必要的,因为设计者不能对一个作为基础的操作系统的网络设施做任何假定,它们必须包括集成网络程序库,以确保Java程序能在所有平台上工作。

4.稳健性

 

  Java设计之初是用作消费类电子产品软件的语言,所以它被设计成写可靠和稳健的软件的。Java消除了某些编程错误,使得它写稳健程序更加容易。Java是一个强类型的语言,它允许扩展编译时检查潜在类型不匹配的问题。所以Java要求显式的方法声明,而不是C语言那样的隐式声明。因为Java不支持指针,所以它消除了重写存储和讹误数据的可能性。取而代之的异常处理是Java中更稳健的特性。异常(Exception)就是某种类似于错误的信号,但不是错误(Error)。对待异常,Java有两种处理方式,捕获(try-catch-finally)和抛出(throw/throws)。这样就方便找到可能出错的代码并加以处理,从而简化了出错的机率。

5.安全

Java的安全性可从两个方面得到保证。一方面,在Java语言里,象指针和释放内存等C++功能被删除,避免了非法内存操作。另一方面,当Java用来创建浏览器时,语言功能和浏览器本身提供的功能结合起来,使它更安全。Java语言在你的机器上执行前,要经过很多次的测试。它经过代码校验,检查代码段的格式,检测指针操作,对象操作是否过分以及试图改变一个对象的类型。

6.可移植的

这句话一直是Java程序设计师们的精神指标,也是Java之所以能够受到程序设计师们喜爱的原因之一,最大的功臣就是JVM的技术。大多数编译器产生的目标代码只能运行在一 种CPU上(如Intel的x86系列),即使那些能支持多种CPU的编译器也不能同时产生适合多 种CPU的目标代码。如果你需要在三种CPU( 如x86、SPARC 和MIPS)上运行同一程序, 就必须编译三次。
但JAVA编译器就不同了。JAVA编译器产生的目标代码(J-Code) 是针对一种并不 存在的CPU--JAVA虚拟机(JAVA Virtual Machine),而不是某一实际的CPU。JAVA虚拟机能掩盖不同CPU之间的差别,使J-Code能运行于任何具有JAVA虚拟机的机器上。
作为一种虚拟的CPU,JAVA 虚拟机对于源代码(Source Code) 来说是独立的。我们不仅可以用JAVA语言来生成J-Code,也可以用Ada95来生成。事实上,已经有了针对若干种源代码的J-Code 编译器,包括Basic、Lisp 和Forth。源代码一经转换成J-Code以后,JAVA虚拟机就能够执行而不区分它是由哪种源代码生成的。这样做的结果就是CPU可移植性。 将源程序编译为J-Code的好处在于可运行于各种机器上,而缺点是它不如本机代码运行的速度快。
同体系结构无关的特性使得Java应用程序可以在配备了Java解释器和运行环境的任何计算机系统上运行,这成为Java应用软件便于移植的良好基础。但仅仅如此还不够。如果基本数据类型设计依赖于具体实现,也将为程序的移植带来很大不便。例如在Windows3.1中整数(Integer)为16bits,在Windows95中整数为32bits,在DECAlpha中整数为64bits,在Intel486中为32bits。通过定义独立于平台的基本数据类型及其运算,Java数据得以在任何硬件平台上保持一致。Java语言的基本数据类型及其表示方式如下:byte8-bit二进制补码short16-bit二进制补码int32-bit二进制补码long64-bit二进制补码float32-bitIEEE754浮点数double32-bitIEEE754浮点数char16-bitUnicode字符在任何Java解释器中,数据类型都是依据以上标准具体实现的。因为几乎目前使用的所有CPU都能支持以上数据类型、8~64位整数格式的补码运算和单/双精度浮点运算。Java编译器本身就是用Java语言编写的。Java运算系统的编制依据POSIX方便移植的限制,用ANSIC语言写成。Java语言规范中也没有任何"同具体实现相关"的内容。

我们常说Java是跨平台的语言

我们把CPU处理器与操作系统的整体叫平台,不同的操作系统支持不同CPU的指令集。使用特定编译器编译的程序只能在对应的平台运行,这里也可以说编译器是与平台相关的,编译后的文件也是与平台相关的。我们说的语言跨平台是编译后的文件跨平台,而不是源程序跨平台,如果是源程序,任何一门语言都是跨平台的语言了。

7.动态性

 

Java的动态特性是其面向对象设计方法的发展。它允许程序动态地装入运行过程中所需要的类。

四、Java与Internet

4.1 Java缘起

有心栽花花不成,无心插柳柳成荫。

1966年,一门叫Simula的模拟语言备受人们青睐,Simula可以把一组事件归入一个类别(classification),称之为“类”(class)。Bjarne Stroustrup(C++语言之父)就是Simula的使用者之一,为了使模拟器运行得更快,他在博士论文中改写了Martin Richard的Basic Combined Programming Language(BCPL)中的程序,并就职于AT&T公司贝尔实验室。20世纪70年代,贝尔实验室的一名工作人员Ken Thompson正致力于测试一门基于BCPL的新语言,称为B语言。Ken Thompson想给B语言添加数据类型,于是在1971年他又发展了一门新的语言,称为C语言。从那以后,C语言风靡全球。以至于在1983年,美国国家标准化组织甚至考虑要把它作为该组织的一个标准(称为ANSI C)。1979年5月,Stroustrup开始利用类(class)来开发一种称为C的项目,其目的是将C的速度和他所熟悉的Simula类结合在一起。1983年,C++首次投入使用。随后,C++越来越普及,使用的公司越来越多,这其中就包括了Sun微系统公司。

1990年12月,Sun的工程师Patrick Naughton无法忍受Sun C++工具,威胁离开Sun,转投乔布斯(Steve Jobs)领导的NeXT公司。领导层为了留住他,允许他启动了一个叫做Stealth的项目,James Gosling等人加入了该项目,该项目后来改名为“Green Project”。1991年4月,绿色计划启动,该计划的目的是开发一种能够在各种消费性电子产品上运行的程序架构。他们认为计算机技术发展的一个趋势是数字家电之间的通讯,为电视、烤箱等家用电器开发一种交互式的软件系统,这种应用需要的是那种小而可靠的系统,它能够移植,并且实时性好,适用于网络分布环境。C++缺少团队需要的特性且不易用,比如垃圾回收机制等。起初,高斯林试图修改和扩展C++的功能,他自己称为C++ ++—,显然这不是一个容易被他人接受的名字。最终,一种被命名为 “Oak”(以他的办公室外的橡树命名)的全新的语言诞生了。

1992年夏天,Oak语言连同Green OS和一些应用程序一起发布在称做Start 7的小型设备上。11月,Green计划被转化成了名为FirstPerson的全资子公司。当时,时代华纳发布了一个关于电视机顶盒的项目,FirstPerson团队开发了一个高交互性的设备投标该项目。结果,华纳公司和有线电视服务商不愿意用户拥有这么大的控制权,从而竞标失败给了SGI,而与3DO公司另一笔机顶盒交易也没有成功。

1993年,美国伊利诺州伊利诺大学NCSA组织,发表了第一个可以显示图片的浏览器,命名为MOSAIC,在当时人气爆发的大受欢迎,Mosaic的出现,算是点燃后来因特网热潮的火种之一。

1994年,Gosling 等人意识到了万维网的机会,他们认为互联网将将向高度互动的远景演变,Oka进行小规模改造。94年秋,团队中 Naughton 与 Jonathan  完成了第一个Java语言网页浏览器,WebRunner,后改名为HotJava。

1995年5月23日,由于Oka被一家显卡制造商注册,Oka改名为Java,在SunWorld大会上正式发布Java 1.0版本,Java语言第一次提出了“Write Once,Run Anywhere”的口号。

4.2 互联网和万维网

互联网和因特网

因特网于1969年诞生于美国。最初名为“阿帕网”(ARPAnet)是一个军用研究系统,后来又成为连接大学及高等院校计算机的学术系统,现在则已发展成为一个覆盖五大洲150多个国家的开放型全球计算机网络系统,拥有许多服务商。
普通电脑用户只需要一台个人计算机用电话线通过调制解调器和因特网服务商连接,便可进入因特网。但因特网并不是全球唯一的互联网络。
例如在欧洲,跨国的互联网络就有“欧盟网”(Euronet),“欧洲学术与研究网”(EARN),“欧洲信息网”(EIN),在美国还有“国际学术网”(BITNET),世界范围的还有“飞多网”(全球性的BBS系统)等。
我们就可以知道大写的“Internet”(世界语为“Interreto”)和小写的“internet”(世界语为“interreto”)所指的对象是不同的。当我们所说的是上文谈到的那个全球最大的的也就是我们通常所使用的互联网络时,
我们就称它为“因特网”或称为“国际互联网”,虽然后一个名称并不规范。在这里,“因特网”是作为专有名词出现的,因而开头字母必须大写。但如果作为普通名词使用,
即开头字母小写的“internet”(“interreto”),则泛指由多个计算机网络相互连接而成一个大型网络。
按全国科学技术审定委员会的审定,这样的网络系统可以通称为“互联网”。这就是说,
因特网和其他类似的由计算机相互连接而成的大型网络系统,都可算是“互联网”,因特网只是互联网中最大的一个。
《现代汉语词典》2002年增补本对“互联网”和“因特网”所下的定义分别是“指由若干电子机网络相互连接而成的网络”和“目前全球最大的一个电子计算机互联网,是由美国的ARPA网发展演变而来的”。 因特网(Internet)是一组全球信息资源的总汇。
有一种粗略的说法,认为INTERNET是由于许多小的网络(子网)互联而成的一个逻辑网,每个子网中连接着若干台计算机(主机)。
Internet以相互交流信息资源为目的,基于一些共同的协议,并通过许多路由器和公共互联网而成,它是一个信息资源和资源共享的集合。

万维网(world wide web)

因特网是基于TCP/IP协议实现的,TCP/IP协议由很多协议组成,不同类型的协议又被放在不同的层,其中,位于应用层的协议就有很多,比如FTP、SMTP、HTTP。所以,因特网提供的服务一般包括有:www(万维网)服务、电子邮件服务(outlook)、远程登录(QQ)服务、文件传输(FTP)服务、网络电话等等。只要应用层使用的是HTTP协议,就称为万维网(World Wide Web)。之所以在浏览器里输入百度网址时,能看见百度网提供的网页,就是因为您的个人浏览器和百度网的服务器之间使用的是HTTP协议在交流。

互联网通过TCP/IP协议把计算机连接到了一起,而万维网是运行在互联网之上,基于HTML、URL和HTTP这三个协议进一步把计算机上的信息资源连接到一起。

在TCP/IP协议上传输信息的方式很早就出现了,比如FTP就是通过TCP/IP传输文件的方式。为什么万维网会带来这么神奇的效应呢?因为它第一次带来了一种叫做超媒体(Hypermedia)的内容形态。超媒体可以在TCP/IP协议之上的传输,可以包含文字、音频、视频,同时可以相互链接,是一种全新的信息表达方式。

Web设计初衷是一个静态信息资源发布媒介,通过超文本标记语言(HTML)描述信息资源,通过统一资源标识符(URI)定位信息资源,通过超文本转移协议(HTTP)请求信息资源。HTML、URL和HTTP三个规范构成了Web的核心体系结构,是支撑着Web运行的基石。用通俗的一点的话来说,客户端(一般为浏览器)通过URL找到网站(如www.google.com),发出HTTP请求,服务器收到请求后返回HTML页面。可见,Web是基于TCP/IP协议的,TCP/IP协议把计算机连接在一起,而Web在这个协议族之上,进一步将计算机的信息资源连接在一起,形成我们说的万维网。

动态页面

不要将动态网页和页面内容是否有动感混为一谈。这里说的动态网页,与网页上的各种动画、滚动字幕等视觉上的动态效果没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,只要是采用了动态网站技术生成的网页都可以称为动态网页。

动态网页是基本的html语法规范与Java、VB、VC等高级程序设计语言、数据库编程等多种技术的融合,以期实现对网站内容和风格的高效、动态和交互式的管理。因此,从这个意义上来讲,凡是结合了HTML以外的高级程序设计语言和数据库技术进行的网页编程技术生成的网页都是动态网页。

与静态网页相对应的,能与后台数据库进行交互,数据传递。也就是说,网页 URL的后缀不是.htm、.html、.shtml、.xml等静态网页的常见形动态网页制作格式,而是以.aspx、.asp、.jsp、.php、.perl、.cgi等形式为后缀,并且在动态网页网址中有一个标志性的符号——“?”。

特征简要归纳如下:

(1)动态网页一般以数据库技术为基础,可以大大降低网站维护的工作量;

(2)采用动态网页技术的网站可以实现更多的功能,如用户注册、用户登录、在线调查、用户管理、订单管理等等;

(3)动态网页实际上并不是独立存在于服务器上的网页文件,只有当用户请求时服务器才返回一个完整的网页;

(4)动态网页中的“?”对搜索引擎检索存在一定的问题,搜索引擎一般不可能从一个网站的数据库中访问全部网页,或者出于技术方面的考虑,搜索之中不去抓取网址中“?”后面的内容,因此采用动态网页的网站在进行搜索引擎推广时需要做一定的技术处理才能适应搜索引擎的要求。

常用4种动态网页技术

1、PHP 即Hypertext Preprocessor(超文本预处理器),它是当今Internet上最为火热的脚本语言,其语法借鉴了C、Java、PERL等语言,但只需要很少的编程知识你就能使用PHP建立一个真正交互的Web站点。

2、ASP 即Active Server Pages(活跃服务器页),它是微软开发的一种类似超文本标识语言(HTML)、脚本(Script)与CGI(公用网关接口)的结合体,它没有提供自己专门的编程语言,而是允许用户使用许多已有的脚本语言编写ASP的应用程序。ASP的程序编制比HTML更方便且更有灵活性。它是在Web服务器端运行,运行后再将运行结果以HTML格式传送至客户端的浏览器。因此ASP与一般的脚本语言相比,要安全得多。

aspx是微软的在服务器端运行的动态网页文件,通过IIS解析执行后可以得到动态页面,是微软推出的一种新的网络编程方法,而不是asp的简单升级,因为它的编程方法和asp有很大的不同,他是在服务器端靠服务器编译执行的程序代码, ASP 使用脚本语言,每次请求的时候,服务器调用脚本解析引擎来解析执行其中的程序代码,而asp.net 则可以使用多种语言编写,而且是全编译执行的,比ASP 快,而且,不仅仅是快的问题,有很多优点。

3、JSP 即Java Server Pages(爪哇服务器页面),它是由Sun Microsystem公司于1999年6月推出的新技术,是基于Java Servlet以及整个Java(爪哇)体系的Web开发技术。 [1]

JSP和ASP在技术方面有许多相似之处,不过两者来源于不同的技术规范组织,以至 ASP一般只应用于Windows NT/2000平台,而JSP则可以在85%以上的服务器上运行,而且基于JSP技术的应用程序比基于ASP的应用程序易于维护和管理,所以被许多人认为是未来最有发展前途的动态网站技术。

4、CGI(Common Gateway Interface,公用网关接口)是较早用来建立动态网页的技术。当客户端向Web服务器上指定的CGI程序发出请求时,Web服务器会启动一个新的进程执行某些CGI程序,程序执行后将结果以网页的形式再发送回客户端。
  CGI的优点是它可以用很多语言编写,如 C 、C++ 、VB和Perl语言。在语言的选择上有很大的灵活性。最常用的CGI开发语言为Perl。

4.3 Java与Internet

《Java编程思想》第一章

五、Java EE

JCP

Java Community Process ,Java社区进程,Java标准指定组织
JCP成立于1998年,官网,由社会各界Java组成的社区,规划和领导Java的发展,其成员可以在这里看到。

是一个开放的国际组织,主要由Java开发者以及被授权者组成,职能是发展和更新Java技术规范、参考实现(RI)、技术兼容包(TCK)。Java技术和JCP两者的原创者都是SUN计算机公司。然而,JCP已经由SUN于1995年创造Java的非正式过程,演进到如今有数百名来自世界各地Java代表成员一同监督Java发展的正式程序。

JCP维护的规范包括J2ME、J2SE、J2EE,XML,OSS,JAIN等。组织成员可以提交JCR(Java Specification Requests),通过特定程序以后,进入到下一版本的规范里面。

JSR
Java Specification Requests,Java规范请求,由JCP成员向委员会提交的Java发展议案,经过一系列流程后,如果通过最终会体现在未来的Java中。

广义的 Java EE 包含各种框架,其中最重要的就是 Spring 全家桶,我们这里谈论的是狭义的Java EE。

Java EE, 原名J2EE, 其核心由一系列抽象的标准规范所组成, 是针对目前软件开发中所普遍面临问题的解决方案。

注意以上定义中的”抽象”(abstract)这个词。 Java EE 只是一组接口和规范, 提供了面向开发者的 public API。

这些抽象的规范, 也可以说成是标准。本质上, 所有的 Java EE API, 都是按照领域专家们所确定的标准发布的。

通过标准化, Java Specification Request 流程中的每个 Java EE API 都经过了 Java Community Process 的严谨审核. 这个过程的结果,是一组经过生产检验和测试后, 被认为合理的API。

上一节介绍了什么是JSR参考实现。 Java EE简介 文中提到, JavaEE 是一系列抽象的规范, 现在, 每个版本的 JavaEE 都由一个 JSR 定义, 这相当于是 JSR 的组合, 其中包括了多个JSR。

例如,Java EE 7 对应于 JSR 342。 Java EE 8 对应于 JSR 366。 由此可见 Java EE 自身也是一项通过JCP严格审核的JSR。

我们知道, 每个JSR都必须有参考实现。

Java EE 也是一样的, 它的实现被称为 应用服务器 (application server). 应用服务器本质上是Java EE规范的具体实现, 可以执行/驱动 JavaEE 项目. Java EE 的参考实现是 Glassfish Application Server

https://javaee.github.io/glassfish/documentation

GlassFish的网站,写着是Java EE的开源的参考实现

JavaEE基础系列 https://blog.csdn.net/renfufei/category_7001413.html

JavaWeb(一):Java技术概览的更多相关文章

  1. Java SE技术概览 - Jave SE Platform at a Glance

    从学习到工作,使用Java有几年时间,一直没有好好端详一下她的“内涵”.无意中看到一个关于Java SE的概览图,发现Java中提供的API还挺系统全面,把她放到博客中,相信对于想系统了解Java技术 ...

  2. Java技术体系图

    Java程序员高级特性              反射.泛型.注释符.自动装箱和拆箱.枚举类.可变              参数.可变返回类型.增强循环.静态导入        核心编程       ...

  3. 【JAVA】基于MVC架构Java技术荟萃案例演练

    基于JAVA-MVC技术的顾客管理项目案例总结 作者 白宁超 2016年6月9日22:47:08 阅读前瞻:本文源于对javaweb相关技术和资料汇总,涉及大量javaweb基础技术诸如:Servle ...

  4. 从程序员到CTO的Java技术路线图(我爱分享)

    在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高级特性 反射.泛型. ...

  5. 从程序员到CTO的Java技术路线图 作者:zz563143188

    在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高级特性 反射.泛型. ...

  6. Java 技术体系图

    Java 程序员 高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变 参数.可变返回类型.增强循环.静态导入 核心编程 IO.多线程.实体类. 集合类.正则表达式. XML 和属性文件 图形编 ...

  7. [原创]上海好买基金招高级Java技术经理/运维主管/高级无线客户端开发等职位(内推)

    [原创]上海好买基金招高级Java技术经理/运维主管/高级无线客户端开发等职位(内推) 内部推荐职位 高级JAVA技术经理: 岗位职责: 负责项目管理(技术方向),按照产品开发流 ,带领研发团队,制定 ...

  8. Java技术路线图

    在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高级特性 反射.泛型. ...

  9. 从程序员到CTO的Java技术路线图 (转自安卓巴士)

    在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高级特性 反射.泛型. ...

随机推荐

  1. 谜之WA

    完全k叉树 谜之WA #include<bits/stdc++.h> using namespace std; typedef unsigned long long ll; ll k,n; ...

  2. 170819-关于EL表达式的知识点

    1 .EL表达式 [1] 简介 > JSP表达式 <%= %> 用于向页面中输出一个对象. > 到JSP2.0时,在我们的页面中不允许出现 JSP表达式和 脚本片段. > ...

  3. ELK 日志系统入门及通过 Docker 部署

    1. ELK 系统是什么 ELK 是一套日志中心解决方案,其三个字母分别表示: Elasticsearch:负责日志存储及检索 Logstash:负责日志收集.过滤及格式化 Kibana:数据看板,负 ...

  4. 【ABAP系列】SAP ABAP基础-数据更新至数据库操作解析

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP基础-数据更新至 ...

  5. hash-散列笔记

    散列基础与整数散列 散列(hash哈希)的基本思想--"将元素通过一个函数转换为整数,使该整数可以尽量唯一地代表这个元素".其中把这个转换函数称为散列函数H,元素在转换前为key, ...

  6. HTML5-新增type属性

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. jsp(java server page)

    jsp的组成元素; 1, 指令 page指令 <%@ page ..........%> language---当前页面使用的语言:java import---当前页面引入的类库, 默认是 ...

  8. IDEA远程代码实时同步(可以自动实时同步)

    前言 开发时一般的平台都是windows,但windows对开发极其不友好,一般都会在本地开启虚拟机,安装上linux环境进行项目的部署测试.下面介绍一种windows主机与linux虚拟机代码同步的 ...

  9. P4126 [AHOI2009]最小割(网络流+tarjan)

    P4126 [AHOI2009]最小割 边$(x,y)$是可行流的条件: 1.满流:2.残量网络中$x,y$不连通 边$(x,y)$是必须流的条件: 1.满流:2.残量网络中$x,S$与$y,T$分别 ...

  10. redis 命令大全

    全局命令: 1.查看所有键:keys * 2.键总数:dbsize 3.检查键是否存在:exists key 4.删除键:del key [key ...] 5.键过期:expire key seco ...