[摘要]本文面向的观众是对J2EE技术有兴趣的入门者。Java语言 Java语言最早被称为Oak,它是为了实现嵌入式的消费类电子产品应用而产生的,它的作者是James Gosling。Ed Frank, Patrick Naughton, Jonathan Payne, Chris Warth在随后...
本文面向的观众是对J2EE技术有兴趣的入门者。
Java语言
Java语言最早被称为Oak,它是为了实现嵌入式的消费类电子产品应用而产生的,它的作者是James Gosling。Ed Frank, Patrick Naughton, Jonathan Payne, Chris Warth在随后的几年时间中为Java语言加入了大量的特性,并把Java语言的目标做了一个重新的定位,定位于适合Internet的语言。
Java语言是一种多用途的语言、并发的语言、以类为基础,面向对象的语言。它的设计尽可能的做到和操作系统是无关的,也就是Java所宣传的那句话:“一次编写,到处运行。”Java的设计参考了C和C++语言,因此熟悉C和C++的程序员对Java语言上手很快,而Java设计的原则是能够利用Java语言快捷的编写应用,所以我们可以发现,在Java语言中,并没有那些C和C++中的复杂的机制。最明显的就是C中被大量使用的指针,由于它的随意性,被Java以引用来代替了。而C++中的操作符重载、模板、泛型的特性也因为使用比较复杂,Java也不予采用。但是目前Java仍然不断的推出新的特性,以满足应用的发展。例如在新推出的JDK1.4中,Java语言就能够支持Assertment机制和Perl语言中最有用的正则表达式机制。
Java语言主要由以下五种元素组成:标识符、关键字、文字、运算符和分隔符。这五种元素有着不同的语法含义和组成规则,它们互相配合,共同完成Java语言的语意表达。
1:标识符。变量,类和方法都需要一定的名称,我们将这种名称叫做标识符。
2:关键字。关键字是Java语言本身使用的标识符,它有其特定的语法含义。所有的Java关键字将不能被用作标识符。
3:数据类型。Java有着不同的数据类型。比较值得一提的是字符串数据类型,字符串数据类型是用一对双引号括起来的字符序列,字符串数据实际上是由String类所实现,而不是C语言中所用的字符数组。每一个字符串数据将产生一个String类的新的实例,用户不必对字符串与类这个概念发生关系而感到担心,由于类的特性,你不必担心如何去实现它们,它们会自己照顾好自己,需要说明的是字符串在Java里作为类只是出于安全的考虑。
4:运算符。任何语言都有自己的运算符,Java语言也不例外,如+、-、*、/等都是运算符,运算符的作用是与一定的运算数据组成表达式来完成相应的运算。对不同的数据类型,有着不同的运算符。
5:分隔符。分隔符用来使编译器确认代码在何处分隔。‘’‘’‘;’‘:’都是Java语言的分隔符。
学习 Java 语言很简单,毕竟 Java 语言也只包含五十多个关键词(keyword)与几十个算符(operator),再加上 Java 语法(syntax)也很简单,所以一般人可以很快就学会 Java 语言。危险的是,很多人认为已经完全掌控 Java 语言,但其实对于内部的运作机制仍不能掌握,这些盲点有时候会让你无法完全掌控 Java 语言。克服这些盲点的方式是看「The Java Language Specification, 2nd Ed.」(没有中文版)来彻底弄懂 Java 程序语言,并看「Inside the Java Virtual Machine, 2nd Ed.」来彻底掌握 Java 虚拟机器的运作方式。学会了语言,并不代表就可以设计出好的对象导向系统架构。想要成为对象导向的专家,往往需要:(1) 多看相关的书,特别是 Design Pattern 和 Refactoring 的书。(2) 多观摩别人的程序(例如 Java API 的 design 与 implementation)(3) 多写程序。学会 Java 语言之后,还需要学会一些 API 才能写出有用的程序。Java 的 API 非常多,必须规划好一个学习路径,才不会在浩瀚的 API 大海中迷失。必备的 API 包括了:IO、New IO、Collection Framework、Network、RMI、JAXP... 等。至于其它的 API,就看你的需求而定,大致上分成:
* GUI 类:JavaBean -> Swing -> JavaHelp -> Java2D -> Image IO -> JAI -> Java 3D ...
* Enterprise 类:JDBC -> JDO -> Servlet -> JSP -> EJB -> JMS -> JTA/JTS...
* J2ME 类(这一类不是我的专长,无法提供学习顺序建议)
Java语言通常都是根据Java虚拟机规范(The Java Virtual Machine Specification)中的定义,编译为字节码指令集和二进制格式。因此我们接下来就讨论Java虚拟机(JVM)
JVM
我们已经谈过Java语言的语法类似于C和C++,但是摒弃了C和C++中复杂、疑惑和不安全的特性。Java语言最早是用来构建消费类网络设备的软件的,因此它要支持多主机的架构,并要求能够提供安全的软件组件。为了满足这些需求,编译好的代码就必须能够通过网络来传播,能够在任何客户端上运行,同时还要保证客户端是足够安全的。
Java虚拟机是Java和Java 2 平台的基石。它能够保证Java语言和硬件、操作系统无关,保证编译后的代码最小,并保护用户不受恶意程序的攻击。Java虚拟机到底是什么呢。其实它就是一台不实际存在的计算机。和真实的计算机类似,它也有自己的指令集,并可以在运行环境中分配内存区域。使用虚拟机机制来实现编程语言并不是Java的创举,这已经是非常普遍的做法了,最著名的许你就莫过于UCSD Pascal的P-Code机。
只要浏览器检测到目前所处理的Web文件内容含有一个Java Applet,浏览器将会为这个Java小程序另外开一个JVM,执行这个Java应用小程序。在JVM中执行的Java小程序可以得到充分安全的保护。如同我们上面所说,JVM是一个自给自足的作业环境,就像是一台独立的计算机一样。例如,在JVM运作的Applet,无法存取主机操作系统。优点是:
1. 系统中立。Java应用程序可以在任何JVM中运作,不论该系统使用何种硬件、软件。
2. 安全。正因JVM跟操作系统没有任何接触,Java程序很难损害到其它档案或应用程序。
缺点是,由于在JVM运作的程序独立在操作系统之外,也就无法享受操作系统各项特殊功能。
Java技术之所以在今天得到了如此广阔的应用,其中它的安全性是不能不提的。不同于其它技术(例如Microsoft的ActiveX)中安全性作为附加设计和补丁,Java从设计之初便考虑到了安全性。因此Java的安全性是在语言层次实现的。Java的安全性由下列三个方面保证:
1、 语言特性(包括数组的边界检查、类型转换、取消指针型变量)。
2、 资源访问控制(包括本地文件系统访问、Socket连接访问)。
3、 代码数字签名(通过数字签名来确认代码源以及代码是否完整)。
Java的源代码是先编译成为一种字节码的中间代码,存放这种代码的文件就是.class的文件。真正执行的时候是将class文件装载到JVM(虚拟机)中,然后由JVM解释执行的。所以数组的上下界检查及合法的类型转换是通过JVM得到保证的。Java通过一个类装载器类(ClassLoader)将虚拟机代码文件(即class文件)装载到JVM中,当完成装载后,一个被称做安全管理器(SecurityManager)的类开始运行,例如当一个Applet的class文件被缺省的类装载器装载到JVM中后,JVM会立即为它装载一个SecurityManager的子类AppletSecurity,由这个管理器来验证操作。代码的所有动作(例如文件读写)都要先经过验证,只有被该安全管理器接受的动作才能完成,否则就会抛出SecurityException异常。
对于JDK1.0,权限被笼统的划分为两大块。一是拥有所有的权限,一个是仅拥有"沙箱\\"(sandBox)权限,这也是普通的Applet所拥有的权限。这时本地文件读写或是与源主机(Orignal Server)以外的主机连接都是被禁止的。这种划分的最大问题就是缺乏灵活性。例如我们希望一个Applet在用户信任的情况下能够对本地文件系统的某个目录进行读写,但并不要通过Socket与其它主机连接。这是JDK1.0的权限划分就不能达到要求。JDK1.1后改进了权限的划分,引入了权限集(PermissionSet)的概念。
由于我们的文章并不是讨论JVM,因此,我们只是对JVM做一个简单的介绍。如果需要详细了解的,可以参考『The JavaTM TMVirtual Machine Specification』。
客观的看待Java
相对于其他编程语音,Java有一个无庸置疑的优点:用户以及编译器第一次不必了解生成可执行代码的特定CPU细节。Java引入了一个编译代码中间层,叫做字节代码,并使用一个虚拟抽象的机器,而不是一个真实的机器。当Java编译器结束了一个源文件的编译后,你所得到的不是可以立即在一个给定平台上运行的代码,而是可以在任何真实的平台上运行的字节代码,唯一的条件就是这个平台要理解和支持Java。这些发展包含着一个文化的变革。作为一个开发人员,你只需要确定Java虚拟机(JVM)提供的抽象层,不同的OS销售商负责执行代码层,从而将中立于平台的字节代码映射到主机平台的机构中。在这种情况下,Java似乎是统一分布式计算机世界的领袖候选人了。“编写一次,永远运行”(并且无论在哪里)就成为Java诱人但却真实的口号。
但我们平心而论,Java的跨平台并不是一个非常诱人的特性?跨平台理论的发展很好地证明了这一点。我们看到,将Java代码从一个平台移植到另一个平台—Java这个语言最重要和最受吹捧的特点—并不象宣传的那样容易。任何Java平台都有其自己的虚拟机,它可以理解通用的字节代码,并且及时地将其编译为本地代码。矛盾由此产生,不同虚拟机的执行也很不相同,这一点足以使代码的移植比预期耗费多得多的时间,而且基本上不是自动的。在企业用户的角度上来说,也很少会有企业会频繁的更换平台,因此这个特性是否能够带来高价值是很难评价的。
那么,Java模型的好处在哪里呢?首先,Java是一种先进的、面向对象的语言,包含了预防常见错误的内置功能,并在仅仅一两个对象中携带了许多经常需要用到的功能。与C++相比,Java更易于读写,不容易出错,而且更加美观,但是它速度较慢也不太灵活。想实现在任何软件和硬件平台上都可虚拟移植,Java尽可能少地使用了公分母模型,也就是说放弃了将每个平台开发到极限的能力。第二,虚拟机的概念本身就是可移植和可共用的,因此对于分布式环境来说是理想的。Java对于为非Windows平台开发代码是最好的语言。
那么对于Windows平台来说,Java又怎么样呢?让Java适应Windows是不可能的,这是由于Sun的许可约束问题。但是Java实在是太吸引人了,Microsoft比谁都能更清楚这一点。Microsoft在以前推出的Visual J++证明了这一点,但是可惜的是,Microsoft又犯了霸权的老毛病,Visual J++并不好用。因此,Microsoft又一次采取了“拿来主义”的手法,很好地利用了Java 的众多特性,隆重推出了Windows平台的新锐力量,它就是相当简单但十分强大的面向对象的C#编程语言。C#超过了C++,它天生就包含了.NET框架类库中的所有类,并使语法简单化。说到这里已经有一些离题了,不过Java也不是说在Windows平台上就不能够使用,JDK和大部分的IDE都支持Windows平台。
Java技术的架构--J2ME、J2SE和J2EE
通常我们以 JDK(Sun 所开发的一套 Java 开发工具)的版本来定义 Java 的版本。JDK 1.0 版于 1996 年初公开,JDK 1.1 版于 1997 年初公开,JDK 1.2 版于 1998 年底公开。基于市场行销的考量,Sun 在 JDK 1.2 版公开后旋即将 Java 改名为「Java 2」,将 JDK 改名为「Java 2 Software Development Kit(以下简称 J2SDK)」。J2SDK(原称 JDK)1.3 于 2000 年 4 月公开,此版本仍称做「Java 2」。目前 J2SDK 1.4 也已经公开了,大家可以到Sun的官方Java站点上查阅到大量的JDK1.4的信息。
Java 技术根据硬件平台与适用环境的差异,分成几个分支。JDK 1.1 的时代,适用于一般消费性电子产品等,嵌入式系统的 Java 平台是 PersonalJava 与 EmbeddedJava,此二者并无明确的界线,大致上来说,运算资源、内存、以及显示装置比较丰富者,使用 PersonalJava,例如 Set-Top Box、视讯电话 ... 等;反之,资源较有限者使用 EmbeddedJava,例如呼叫器、行动电话 ... 等。除了 PC 使用的 Java 平台、IA 使用的 PersonalJava 与 EmbeddedJava 平台之外,JavaCard 也是一个 Java 平台,使用于 Smart Card(IC Card)上。
Java 2 出现后,推翻了先前的 PersonalJava 与 EmeddedJava 的分法,改分成 Java 2 Platform Enterprise Edition(简称 J2EE)、Java 2 Platform Standard Edition(简称 J2SE)、Java 2 Platform Micro Edition(简称 J2ME)。J2EE 适用于服务器,目前已经成为企业运算、电子商务等领域中相当热门的技术;J2SE 适用于一般的计算机;J2ME 适用于消费性电子产品。除了这三者之外,JavaCard 依然是独立的一套标准。
目前,Java技术的架构包括三个方面:
J2EE(Java 2 Platform Enterprise Edition )—企业版 (J2EE) 是为面向以企业为环境而开发应用程序的解决方案。
J2SE(Java 2 Platform Stand Edition)—标准版 (J2SE) 为桌面开发和低端商务应用提供了可行的解决方案。
J2ME(Java 2 Platform Micro Edition )—小型版(J2ME)是致力于消费产品和嵌入式设备的最佳解决方案
J2EE
J2EE已经成为开发商创建电子商务应用的事实标准。正是认识到J2EE平台作为一种可扩展的、全功能的平台,可以将关键的企业应用扩展到任何Web浏览器上并可适合多种不同的Internet数据流、可连接到几乎任何一种传统数据库和解决方案、使企业经理根据多家企业所提供的产品和技术开发和部署最佳的解决方案进而降低开发网络化应用的费用和复杂性这一巨大优势,很多厂家都表示将对J2EE给予支持,并将J2EE技术作为大型BtoB市场和海量交易处理的安全稳定的端到端平台。J2EE技术的基础就是J2SE标准版,它巩固了标准版中的许多优点。其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。它为灵活配置各种多层企业应用软件,特别是B2B、B2C等电子商务应用,提供了强大的服务功能。最近又新加了Connector API服务,使企业应用的开发和部署有了一系列成熟的技术。
J2SE
J2SE是Java 2平台的标准版, 它适用于桌面系统,提供CORBA标准的ORB技术,结合Java的RMI支持分布式互操作环境。它运行在Java虚拟机上。在引入了Java IDL后, J2SE支持IIOP通信。它是高可移植性、异构性的实现环境和健壮平台,也是实现可伸缩性、可移植性、分布式异构互操作应用软件开发的标准平台。
J2ME
J2ME提供了HTTP高级Internet协议,使移动电话能以Client/Server方式直接访问Internet的全部信息,不同的Client访问不同的文件,此外还能访问本地存储区,提供最高效率的无线交流。J2ME是Java 2平台的微型版,它分成CDC(connected device configuration)和CLDC(connected limited device configuration)两部分。CDC运行在连接虚拟机上,为手提式计算机一类较复杂的移动设备提供应用平台;CLDC运行在核心虚拟机(KVM)上,它实现MIDP(Mobile Information Device Profile)移动信息设备应用平台,即针对手机之类的设备建立移动计算平台。
在小型的J2ME(Java 2 Micro Edition)方面,主要是应用在内存容量小、体积也较小的电子装置上。小至智能卡、行动电话,个人数字助理都是运用J2ME的最佳平台。Java在Palm的应用上,PalmOS 4.0内含KJava,Sun也推出针对PalmOS使用的J2ME版本。所以,以既有的Java程序设计知识,就可以在Palm PDA上开发出Palm的各式各样应用系统。Java和Palm这两个标准平台的结合,将是下一波PDA应用的趋势。Java在手机的应用上,Nokia、Motorola、Ericsson 都将推出利用J2ME技术的新手机,所以Java程序设计师有更多的平台可供施展。此种结合J2ME及无线通讯技术的无线开放应用平台,将提供行动商务极佳的解决方案。
在中型的J2SE(Java 2 Standard Edition)方面,Sun推出一个新的解决方案,称为Java Web Start。原先的Java Applet是在WebBrowser 中间开出一块方形区域来执行Java程序,但是这样在执行效能和兼容性上都受限于原有的 Web Browser。现在新推出的Java Web Start则是在操作系统上直接执行的Java Application,但是可以在网页上激活。如此一来既可和网页结合,在执行上也更快、更有效率。并且,Sun和IBM都将推出支持64位运算的Java版本,这对一般计算机上执行的客户端Java应用系统的开发将会是一大利器。
另外在大型的J2EE(Java 2 Enterprise Edition)应用上,可以说"J2EE"已经成为服务器运算环境的标准。Java Servlets、JSP(Java ServerPages)、EJB(Enterprise JavaBeans)、JavaMail、JDBC、JMS等,都是各家厂商产品开发的重点方向。J2EE兼容的是一般Intel个人计算机(Linux、Windows.....)、麦金塔以及各家高效能高稳定度的UNIX伺服主机,未来必定成为服务器运算市场上的主要选择之一。
除了以上这三大Java组合之外,Java和XML的整合也是未来的重点。Sun公司已经推出Java处理XML的标准延伸API - Java API for XML Parsing (JAXP),可以让各家所制作的XML解析器有接口上的标准。所以在Java程序中,只要了解一套API(JAXP)就可以完全处理XML文件,让XML的应用更加方便。Java这个跨平台的开发环境,加上XML这个跨平台的资料格式,此种跨平台优势组合势将成为未来讯息传递及资料交换的主要应用技术,如虎添翼地结合成一个最佳的跨平台解决方案。
藉由J2SE (Java 2 Standard Edition)可以开发在PC上的应用软件,藉由J2ME (Java 2 Micro Edition) 可以跨足更广大的家电、智能卡、电子装置等市场,再藉由J2EE (Java 2 Enterprise Edition ) 可以整合伺服主机运算环境。Java技术的应用范围几乎已经无所不在,Java技术更可以在网际网络及电子商务各领域中,提供全方位的解决方案。
随着应用领域的不同,Java 有许多 API(Application Programming Interface),这些 API 分成三大类:
· Java Core API:由 Sun 制定的基本 API,任何 Java 平台都必须提供。
· Java Standard Extension API (javax):由 Sun 制定的扩充 API,Java 平台可以选择性地提供或加装。
· 厂商或组织所提供的 API:由各家公司或组织所提供。
其中 Core API 和 Standard Extension API 已经逐渐涵盖了大部份的信息应用领域,例如多媒体、数据库、Web、企业运算、语音、实时系统、网络、电话、影像处理、加解密、GUI、分布式运算 ......。如果你有某项需求尚未有标准的 Java API 可遵循,你可以向 Sun 提出制定新 API 的请求。经过审核之后,你的要求可能会通过、驳回 ...... 等。如果通过,就会开始进入制定 API 的程序。Java API 的制定过程因为公开,且经过许多业界技术领先公司的共同参与,所以相当完善而优异。
EJB的生态环境
在sun公司提供的EJB规范中,我们一个完整的基于EJB的分布式计算结构由六个角色组成,这六个角色可以由不同的开发商提供,每个角色所作的工作必须遵循Sun公司提供的EJB规范,以保证彼此之间的兼容性。
EJB组件开发者: 开发并销售 EJB。
应用组合者: 将不同的 EJB 搭建成应用。
部署者: 使用相应工具在运行环境下配置 EJB。
EJB 服务器提供者: 开发并销售 EJB 服务器
EJB 容器供应商: 开发并销售 EJB 容器
系统管理员: 监视运行时情况\r
1、EJB组件开发者(Enterprise Bean Provider)
EJB组件开发者负责开发执行商业逻辑规则的EJB组件,开发出的EJB组件打包成ejb-jar文件。EJB组件开发者负责定义EJB的remote和home接口,编写执行商业逻辑的EJB class,提供部署EJB的部署文件(deployment descriptor)。部署文件包含EJB的名字,EJB用到的资源配置,如JDBC等。EJB组件开发者是典型的商业应用开发领域专家。
EJB组件开发者不需要精通系统级的编程,因此,不需要知道一些系统级的处理细节,如事务、同步、安全、分布式计算等。
2、应用组合者(Application Assembler)
应用组合者负责利用各种EJB组合一个完整的应用系统。应用组合者有时需要提供一些相关的程序,如在一个电子商务系统里,应用组合者需要提供JSP(Java Server Page)程序。
应用组合者必须掌握所用的EJB的home和remote接口,但不需要知道这些接口的实现。
3、部署者(Deployer)
部署者负责将ejb-jar文件部署到用户的系统环境中。系统环境包含某种EJB Server和EJB Container。部署者必须保证所有由EJB组件开发者在部署文件中声明的资源可用,例如,部署者必须配置好EJB所需的数据库资源。
部署过程分两步:部署者首先利用EJB Container提供的工具生成一些类和接口,使EJB Container能够利用这些类和接口在运行状态管理EJB。 部署者安装EJB组件和其他在上一步生成的类到EJB Container中。 部署者是某个EJB运行环境的专家。
某些情况下,部署者在部署时还需要了解EJB包含的业务方法,以便在部署完成后,写一些简单的程序测试。
4、EJB 服务器提供者(EJB Server Provider)
EJB 服务器提供者是系统领域的专家,精通分布式交易管理,分布式对象管理及其它系统级的服务。EJB 服务器提供者一般由操作系统开发商、中间件开发商或数据库开发商提供。
在目前的EJB规范中,假定EJB 服务器提供者和EJB 容器提供者来自同一个开发商,所以,没有定义EJB 服务器提供者和EJB容器提供者之间的接口标准。
5、EJB 容器提供者(EJB Container Provider)
EJB 容器提供者提供以下功能:
提供EJB部署工具为部署好的EJB组件提供运行环境 。EJB容器负责为EJB提供交易管理,安全管理等服务。
EJB 容器提供者必须是系统级的编程专家,还要具备一些应用领域的经验。EJB 容器提供者的工作主要集中在开发一个可伸缩的,具有交易管理功能的集成在EJB 服务器中的容器。EJB 容器提供者为EJB组件开发者提供了一组标准的、易用的API访问EJB 容器,使EJB组件开发者不需要了解EJB服务器中的各种技术细节。
EJB容器提供者负责提供系统监测工具用来实时监测EJB容器和运行在容器中的EJB组件状态。
6、系统管理员(System Administrator)
系统管理员负责为EJB服务器和容器提供一个企业级的计算和网络环境。
系统管理员负责利用EJB 服务器和容器提供的监测管理工具监测EJB组件的运行情况。
将责任分离的另一个好处是在代码级上,可以将基于EJBs的系统逻辑的分派给更适合的专家。SUN的EJB规范建议使用几个独立的角色,对于确定运作环境的责任链是非常重要的。举例说,EJB提供者是由商业专家和分析人员扮演的角色,他们确定一个组织内的最佳信息流程。但是仍旧有Second Domain Expert,如应用程序汇编人员,他们集成不同的EJB组件并确保它可以确保满足应用程序的需求。
还有两种角色归入到系统级的部分,第一个是配置人员,他们负责实际的安装和配置基于EJB的系统。这需要有设置目录服务和集成现有应用程序的经验。第二个是系统管理员,他们要提供全天的监视和支持,确保应用程序正常运作。尽管系统管理员这个角色不需要是Java编程专家,但是他需要能够应付以下问题:
设置Java Virtual Machine (JVM)并关联系统环境参数(如:CLASSPATH)
使用Java Archive (jar)命令保存类文件
懂得WEB服务器和Servlet的工作原理。
要能通过监视运行中程序的状态确定优化方法。
很明显,有些角色是可以交叉的,比如系统管理员和配置人员。尽管配置人员可能是将类文件复制到服务器而系统管理员需要确定配置人员是否复制到了正确的位置。
……