2004年08月03日

Java传说之风云再起

—————————献给所有追求进步、热爱和平、热爱生命的朋友

胡德平(中国Java联盟/www.javaunion.org)

一、Java语言的发展历程
Java语言(简称Java)的诞生对IT产业带来了一次变革,从某些意义上讲对人们的日常生活也产生了深远的影响。Java作为一种类C/C++,但其平台无关性和与互联网发展紧密结合,预计未来必定成为互联网和计算机应用的主流。Java当之无愧地被纽约时报评为1995年的十大科技成果之一,Java将作为一项重大发明载入科技史册! 微软总裁比尔.盖茨曾在观察了一段时间后,十分惭愧地说:“Java是长时间以来最卓越的程序设计语言”,并确定微软整个软件开发的战略从PC单机时代向着以网络为中心的计算时代转移,而购买Java则是他的重大战略决策的实施部署。当然微软与SUN也曾为纯Java对峙法庭,微软必将直接或间接将Java技术融入到其产品体系中。SUN Microsoft公司的总裁Scott McNealy认为Java为Internet 和WWW开辟了一个崭新的时代。

环球信息网WWW的创始人Berners-Lee说:计算机事业发展的下一个浪潮就是Java,并且将很快发生。所以,使用Java已成大势所趋!

Microsoft和IBM两大公司都在Internet上销售用Java编写的软件,IBM著名Java开发集成环境Visual Age For Java、网站集成平台Webspere,Microsoft的VJ++都是目前主要常见的Java开发环境或产品。

另外,Apple、HP、IBM、Microsoft、Novell、SGI、SCO、Tandem等公司均在各自开发的操作系统中加入了Java开发运行环境,而负责开发并推广Java技术的Javasoft公司(这是SUN下属的一个子公司),通过颁发许可证的办法来允许各家公司把Java虚拟机和Java的Applets类库嵌入他们开发的操作系统, 这样各类开发人员就能更容易地选择多种平台来使用Java 语言编程, 不同的用户也就可以脱离Web浏览器来运行Java应用程序,这无疑是很受广大用户的欢迎的, 也为Java语言的应用开拓了极为广阔的前景。

1996年6月7日,由SUN公司和台湾经济事务部信息发展局、 台湾信息技术研究所等单位牵头,成立了一个“台湾Java联盟”,有多个台湾著名计算机公司参与,并在台北建立 “Java开发中心”,在新竹建立 “Java语言实验室”,以掀起台湾开发与应用Java语言的热潮。香港则在1996年4月就举行了全岛的Java杯比赛, 在计算机界掀起了学习Java的热潮(尤其是在大学生中,出现了一批Java迷)。1996至1998年,SUN公司与国内清华大学、北京大学的著名高校合作,成立10个“Java教育中心”;与中软、邮电部等机构合作成立培训中心、开发中心;在北京、天津和上海成立研究开发基地。每年一度的JavaOne大会几乎都会推出让Java更受人欢迎的新技术,曾经有人预言:Java将是网络上的“世界语”,将会被未来所证实。

1998年,由于Java在安全、性能等方面到了一个关键阶段,甚至Java被列入了世纪末十大必然死亡的技术之一,十大科技成果被预言必将死亡实在是幽了一个默。1998至今,随着Java2一系列新技术如JAVA2D、JAVA3D、 SWING、 JAVA SOUND、 EJB、 SERVLET、 JSP、 CORBA、XML、JNDI等等的引入以及JVM自身的安全策略完善、效率提高,新一轮Java热潮再次被掀起。目前,国内电子商务、金融、证券、邮电、电信等行业的大部分系统几乎都正在或者准备采用部分Java技术来实现。此外国内也出现了致力于Java技术推广和开发的非盈利组织中国“Java阵线联盟”(javaunion.org)以及一批作为该组织成员的个人Java技术网站,预计一两年内Java应用将被国内广大行业用户所接受,Java技术水平也将逐步与世界同步。

二、Java语言的特点

Java语言具有能独立于平台而运行、面向对象、可对动态画面进行设计与操作、坚固性等特点,又具有多线程、内置校验器用来防止病毒入侵等功能,所以用来在Internet上研制与开发软件时,特别受到用户的欢迎。

Java语言的有点主要表现在:简单、面向对象、自动的内存管理、分布计算、稳定、安全、解释执行、结构中立、平滑移植、多线程、以及异常处理等方面。

1、 简单
由于Java的结构类似于C和C++,所以一般的熟悉C与C++语言的编程人员稍加学习就不难掌握Java的编程技术了。Java所具有的自动内存管理机制也大大简化了Java程序设计开发。

2、 面向对象
简单的说,面向对象设计是一种以数据(对象)以及其接口为重心的程序设计技术,面向对象的设计可以说是定义程序模块如何“即插即用”的机制。Java的面向对象机制实际上可以看作是C++面向对象机制的延伸。Java提供了简单的类机制和动态的构架模型,对象中封装了它的状态变量和方法(函数、过程),实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或者重新定义父类或者超类所提供的过程,从而实现代码的复用。

3、 自动内存管理
Java的自动无用内存回收集(auto garbage collectino)实现了内存的自动管理,因此简化了Java程序开发的工作,早期的gc(garbage collectino)对系统资源抢占太多而影响整个系统的运行,Java2对gc进行的改良使Java的效率有了很大提高。Gc的工作机制是周期性的自动回收无用存储单元。Java的自动内存回收机制简化程序开发的同时,提高了程序的稳定性和可靠性。

4、 分布计算
Java为程序开发提供了java.net包,该包提供了一组使程序开发者可以轻易实现基于TCP/IP的分布式应用系统。此外,Java还提供了专门针对互联网应用的类库,如URL、Java mail等等。

5、 稳定性
人们最常见的应用程序错误就是“非法访问xxx内存”,其实质是程序指针使用出错。Java拥有一种指针(pointer)模型,能够排除发生内存被覆盖和毁损数据的可能性。Java不采用指针算术法,而是提供真正的数组(Array),运行程序下标检查;另外,它也不会发生有对象类型转换将一个任意数转换成指针的情形。Java的自动内存管理在减少编程工作的同时,大大减少了运行态错误。

6、 安全性
Java的设计目的是提供一个用于网络/分布式的计算环境。因此,Java强调安全性,如确保无病毒、小应用程序运行安全控制等等。Java的验证技术是以公钥(public-key)加密算法为基础,而且从环境变量、类加载器、文件系统、网络资源和名字空间等方面实施安全策略。

7、 解释执行
Java解释器(interpreter)可以直接在任何已移植的解释器的机器上解释、执行Java字节代码,不需重新编译。当然,其版本向上兼容,因此如果是高版本环境下编译的Java字节吗到底版本环境下运行也许会有部分问题。

8、 跨异构环境
Java是网络空间的“世界语”,编译后的Java字节码是一种“结构中立性(architecture neutral)的目标文件格式,可以在所有提供Java虚拟机(JVM)的多种不同主机、不同处理器上运行。

9、 平滑移植
“write once,run every where!”也许是Java最诱人的特点。用Java开发而成的系统其移植工作几乎为零,一般情况下只需对配置文件、批处理文件作相应修改即可实现平滑移植。

10、 多线程
Java的多线程(multithreading)机制使程序可以并行运行。Java还有一组同步化基本单元,他们是以广泛使用的C.A.R.Hoare监视器与条件变量图为基础的。同步机制保证了对共享数据的正确操作。多线程使程序设计者可以用不同的线程分别实现各种不同的行为,而不需要采用全局的事件循环机制,因此,使用Java语言可以非常轻松地实现网络上的实时交互行为。

11、 异常处理
C语言程序员大都有使用goto语句来做条件跳转,Java编程中不支持goto语句。Java采用异常模型使程序的主流逻辑变得更加清晰明了,并且能够简化错误处理工作。

12、 可扩充
Java目前发布的j2EE标准主要为采用Java技术为企业提供全面解决方案提供了一个技术规范框架,规划了一个利用现有和未来各种java技术整合解决企业应用远景蓝图。

三、Java语言对软件开发技术的影响
曾有人预言:“Java语言的出现,将会引起一场软件革命”,这是因为Java语言能在执行码(二进制码)上兼容,这样以前所开发的软件就能运行在不同的机器上,只要所用的机器能提供Java语言解释器即可。时至今日,Java的优势已经不再仅限于跨平台和动态页面显示,更多的优势逐步在支持CORBA、WEB服务器后端处理以及应用整合等方面的到体现。

Java语言对现在以及未来软件工程和软件发展可能产生影响,可以从以下几个方面分析:
1. 软件工程
Java适用于WEB的许多特征比如平滑移植、安全、健壮和可扩展等为面向对象软件工程设计提供了实现工具和想向空间。遵循面向对象思想,软件生命周期的各个部分都将从面向对象的角度出发实现。比如用户需求分析将被划分成具有不同状态(数据)和行为的模块,不同模块之间的联系通过消息实现等等。

2.软件的开发方法
由于Java语言的面向目标的特性,越来越多的人在用O-O开发时都在选择使用Java技术与方法来开发,这与Java的面向对象特性、模块化特性、安全性以及适应IT技术发展密不可分。

3.WEB技术
Java提供的CGI、ASP替代方法servlet/jsp以及EJB都是与互联网发展需求相呼应的,由此可见Java在未来必然紧跟互联网发展趋势,采用Java解决企业基于WEB的应用是明智选择。

4.分布式计算
Java对CORBA、RMI(远程方法调用)、EJB、XML和网络处理的支持和应用,将使未来企业分布计算向其倾斜。

5.图形处理与多媒体效果
Java2以及以后版本提供了Swing、2D、3D、Sound等图形、图象和多媒体支持类库,弥补了早期Java版本在此方面的不足。Java的媒体处理能力使程序开发在的动画效果远比GUI技术更加逼真,尤其是利用WWW提供的巨大动画资源空间,可以共享全世界的动态画面的资源。

6. 产品开发
目前Java产品主要有基于WEB的实时信息发布系统、WEB邮件系统、用于企业分布式计算的消息传输系统、基于servlet/jsp/ejb开发的电子商务平台、提供servlet/jsp/ejb开发和运行环境的应用服务器、结合CORBA/XML等技术开发的分布计算支撑平台等等。另外用Java开发的多媒体软件可以实现集可视化、可听化、可操作化于一体的效果。

四、Java未来前景
由于Java语言具有上述优秀特性,所以其应用前景必然美好,未来发展肯定会与互联网的发展需求绑定:
1. 所有面向对象的应用开发;
2. 软件工程中需求分析、系统设计、开发实现和维护;
3. 中小型多媒体系统设计与实现;
4. 消息传输系统;
5. 分布计算交易管理应用(JTS/RMI/CORBA/JDBC等技术应用);
6. Internet的系统管理功能模块的设计,包括Web页面的动态设计、网站信息提供管理和交互操作设计等。
7. Intranet(企业内部网)上完全基于Java和WEB技术的应用开发;
8. WEB服务器后端与各类数据库连接管理器(队列、缓冲池);
9. 安全扫描系统(包括网络安全扫描、数据库安全扫描、用户安全扫描等);
10. 网络/应用管理系统;
11. 其它应用类型的程序。

五、学习建议
因为多种原因,目前我国对于Internet的研究与开发工作还是与国外尤其实美国有相对差距,但用Java语言进行开发的成功案例在各行各业还是有些,尤其实目前较为火热的电子商务网站系统。许多程序员或非程序员希望能够有目的、有步骤、系统的学习Java技术,我建议可以从以下层面来学习:

1、 Java语言基础
参加基础技术培训的目的在于此,该部分应该掌握内容有面向对象基础、Java语言基础语法、Java规范、Java虚拟机规范、编程规范以及常用开发工具使用等。

2、 全面了解Java高级技术概貌
全面了解Java高级技术概貌其实并不一定必须学习Java语言基础,有时需要知道将来可以学习什么、做什么是最重要的。Java高级技术目前大致有AWT工具使用、Swing组件使用、JavaBeans、Java2D、Drag-and-Drop、RMI-IIOP、JavaIDL、JDBC、JNDI、 JMAIL、JTS、Servlet/Jsp等,学习的最好方法不是到书店买书看,而是到Javasoft公司和其推荐的资源网站去阅读相关技术规范和API。

3、 有目的地选择深入掌握工作所需或感兴趣的技术方向
通常情况下,学习Java是因为对某些方面感兴趣或者是有方面的工作需求。因此无论为了个人兴趣还是更好的完成工作,几乎都只可能精于某几方面的技术,其它方面兼顾即可。

(注:如需引用、出版、发行请与作者联系,版权为中国Java阵线同盟所有)

胡德平
公元2000.08.10.21.30
于北京清华园

来源:
阅读:5578
日期:2000-11-14

J2EE编程起步

胡德平(hudeping@263.net, www.JavaUnion.org )

【编按】为了帮助国内J2EE初学者,将J2EE部分文档进行编译,期望能够对广大Java爱好者有所帮助。如有需要对发布在JavaUnion.org论坛中文章发表或转载需求,请与作者联系。

本文将通过简单例子,描述如何利用EJB开发、部署和运行一个客户机/服务器应用。例子的客户端作为Java独立应用运行,由ConverterClient.java类实现。它实现一个简单的实时会话,主要通过客户端应用调用服务器端EJB类ConverterEJB.java来实现。如果你已经安装了J2EE,则可以在doc/guides/ejb/examples/converter目录中找到这些例子。
为了实现本文所描述的简单例子,你需要完成以下任务:
·编写和编译EJB程序
·创建J2EE应用
·打包EJB(.jar)
·部署J2EE应用
·编写和编译客户端程序
·运行客户端
下面章节我们将就上述工作任务以及所涉及的知识点进行简单阐述。
前提
实现本文提供例子的前提是您安装了Javasoft.com或相关操作系统厂商网站下载的J2SE SDK,以及安装了相应操作系统版本的J2EE SDK(www.javasoft.com下载)并进行了正确配置。关于J2SE和J2EE的安装、配置和其它进一步信息,请参阅产品相关文档。
EJB编码
每个EJB程序必须要求编写下述代码:
·远程接口(Remote interface )
·本地接口(Home interface )
·实现组件(Enterprise bean class )
远程接口编码
远程接口定义了客户端能够调用的商业方法,这些商业方法是有服务器端的企业组件实现的,本文所涉及的Converter.java编码如下:
import javax.ejb.EJBObject;//引入必须的包
import java.rmi.RemoteException;

public interface Converter extends EJBObject {//必须继承EJBObject类
/*定义客户端可以调用的方法*/
public double dollarToYen(double dollars) throws RemoteException;
public double yenToEuro(double yen) throws RemoteException;
}
本地接口编码
本地接口定义了员徐客户端创建、查找或移动EJB的方法,本文所涉及的本地接口类ConverterHome接口只定义了一个create方法,返回远程接口类型,编码如下:
import java.io.Serializable;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;

public interface ConverterHome extends EJBHome {

Converter create() throws RemoteException, CreateException;
}
企业组件类(EJB)编码
本文中的企业组件(EJB)是一个无状态会话组件,命名为ConverterEJB.java,该组件实现了两个商业方法:dollarToYen和yenToEuro,与远程接口Converter所定义客户端可访问方法一致,该类编码如下:
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

public class ConverterEJB implements SessionBean {

public double dollarToYen(double dollars) {

return dollars * 121.6000;
}

public double yenToEuro(double yen) {

return yen * 0.0077;
}

public ConverterEJB() {}
public void ejbCreate() {}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
public void setSessionContext(SessionContext sc) {}
}
编译EJB
现在需要对上述三个类进行编译,在UNIX平台和NT/9X平台上的编译略有区别,分别如下编译:
UNIX:
1. 在下面的脚本compileEJB.sh中,将该成实际J2EE安装目录。
#!/bin/sh

J2EE_HOME=
CPATH=.:$J2EE_HOME/lib/j2ee.jar

javac -classpath “$CPATH” ConverterEJB.java ConverterHome.java Converter.java
2. 运行compileEJB.sh 脚本
Windows:
1. 在下面的compileEJB.bat批处理文件中,将 该为实际J2EE安装目录。
set J2EE_HOME=
set CPATH=.;%J2EE_HOME%\lib\j2ee.jar

javac -classpath %CPATH% ConverterEJB.java ConverterHome.java Converter.java
2. 运行批处理文件compileEJB.bat。
创建J2EE应用
你不能够直接将企业组件(EJB)部署到J2EE服务器,必须将组件加到一个J2EE 应用中然后再部署。在本节,你将创建一个叫做ConverterApp的新J2EE应用并保存为ConverterApp.ear。
1. 在命令行提示符下启动J2EE服务器:
j2ee ?verbose
(停止服务器命令 j2ee -stop.)

2. 在另一个终端窗口运行部署工具:
deploytool
(按F1获取部署工具帮助)

3. 创建新的J2EE应用
a. 在部署工具中选择“文件”菜单
b. 从“文件”菜单中选择“新应用”
c. 点击浏览
d. 在文件选择框中定位存放.ear文件的目录
e. 文件命名为ConverterApp.ear.
f. 点击“新应用”
g. 点击“确定”
企业组件(EJB)打包
本部分你将运行部署工具的创建EJB向导来完成下述任务:
·创建组件部署描述符
·将描述符和组件类打包为.jar文件
·将EJB.jar文件打包到J2EE应用ConverterApp.ear 文件
从“文件”菜单中选择创建EJB来开始创建新的EJB,这个向导将显示下面的对话框:
介绍对话框:
a. 阅读向导特性说明文档
b. 点击“下一步”
EJB JAR 对话框:
a. 在标有”Enterprise Bean will go in,” 的组合框中选择ConverterApp.
b.在JAR Display Name域输入ConverterJAR,声明EJB .jar文件包含该组件,该名字会在树形应用结构中呈现。
c. 点击增加内容文本域
d. 在内容编辑对话框顶部,输入包含.class文件的目录
e. 选择该目录下相关.class加入:Converter.class, ConverterEJB.class, 和ConverterHome.class.
f. 点击确定
g. 点击下一步
综合对话框:
a. 在组件类型中选择“会话”
b. 选择“无状态”
b. 在EJB类组合框中选择ConverterEJB.
c. 在本地接口组合框中选择ConverterHome.
d. 在远程接口组合框中选择Converter.
e. 在企业组件命名域中输入ConverterBean.
f. 点击下一步
环境入口对话框:
因为你可以跳过后面的对话框,所以可以点击完成结束创建EJB应用任务。
部署J2EE应用
现在J2EE应用中已经包含企业组件(EJB)了,可以对其进行部署。
1.指定企业组件的JNDI名字
a. 在应用部署波农工具中,在应用树形结构中选择ConverterApp
b. 选择JNDI名字标签
c. 在JNDI 名字域中,输入MyConverter并确认。 客户端将使用该名字来定位本地接口。
2.部署J2EE应用
a. 从工具菜单中选择“部署”
b. 在第一个对话框中选择ConverterApp为部署对象,Localhost为目标服务器
c. 选择标有”Return Client Jar.” 的选择框
d. 在文本域中敲入ConverterAppClient.jar的确切目录,如J2EE的例子目录doc/guides/ejb/examples/converter
e. 点击下一步
f. 在第二个对话框中,核实ConverterBean 的JNDI命名为MyConverter.
g.点击下一步
h. 在第三个对话框中点击结束
i. 在部署进程对话框中,点击OK完成部署
开发客户端
客户端程序ConverterClient是一个独立运行的Java应用,创建ConverterClient主要包括以下步骤:
1. 客户端编码
2. 客户端编译
客户端编码
ConverterClient.java 源码展示了EJB客户端最基本的任务实现,即:
·定位本地接口
·创建企业组件(EJB)
·调用商业方法
定位本地接口
ConverterHome接口定义了EJB声明周期方法如create,在中ConverterClient 可以调用create方法之前ConverterHome对象必须被实例化,包括三个步骤:
1. 创建JNDI命名上下文
Context initial = new InitialContext();
2. 查找与JNDI命名MyConverter绑定的对象
java.lang.Object objref = initial.lookup(“MyConverter”);
3. 限定指向ConverterHome对象的参考
ConverterHome home =
(ConverterHome) PortableRemoteObject.narrow(objref,
ConverterHome.class);
创建企业组件(EJB)实例
客户端通过调用本地接口ConvertHome对象的create方法创建ConverterEJB类对象, create 方法返回组件Converter类型的对象。然后,远程方法定义的在ConverterEJB实现的商业方法可以被客户端调用。当客户端调用create 方法时,EJB容器将实例化ConverterEJB,然后调用ConverterEJB.ejbCreate 方法。
Converter currencyConverter = home.create();
调用商业方法
完成上述任务后,调用商业方法就比较简单了。你调用Converter对象的方法, EJB容器将相应的调用运行在J2EE服务器中的ConverterEJB 实例的方法。客户端调用商业方法dollarToYen的代码如下:
double amount = currencyConverter.dollarToYen(100.00);
ConverterClient源码
下面是ConverterClient.java的完整源码:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

import Converter;
import ConverterHome;

public class ConverterClient {

public static void main(String[] args) {
try {
Context initial = new InitialContext();
Object objref = initial.lookup(“MyConverter”);

ConverterHome home =
(ConverterHome)PortableRemoteObject.narrow(objref,
ConverterHome.class);

Converter currencyConverter = home.create();

double amount = currencyConverter.dollarToYen(100.00);
System.out.println(String.valuesOf(amount));
amount = currencyConverter.yenToEuro(100.00);
System.out.println(String.valuesOf(amount));

currencyConverter.remove();

} catch (Exception ex) {
System.err.println(“Caught an unexpected exception!”);
ex.printStackTrace();
}
}
}
编译客户端代码
UNIX:
1. 在下面脚本compileClient.sh, 对 根据J2EE实际安装目录作相应改动。
#!/bin/sh

J2EE_HOME=
CPATH=.:$J2EE_HOME/lib/j2ee.jar

javac -classpath “$CPATH” ConverterClient.java
2. 运行脚本文件compileClient.sh
Windows:
1. 在下面批处理文件compileClient.bat中,对根据实际J2EE安装目录进行修改。
set J2EE_HOME=
set CPATH=.;%J2EE_HOME%\lib\j2ee.jar

javac -classpath %CPATH% ConverterClient.java
2. 运行批处理文件compileClient.bat
运行客户端
运行客户端你需要ConverterAppClient.jar文件,该文件包含允许客户端与EJB容器中EJB实例通信所需的存根类, ConverterAppClient.jar 文件在部署J2EE应用过程中创建。
UNIX:
1. 在下面脚本testClient.sh, 对 根据J2EE实际安装目录作相应改动。
#!/bin/sh

J2EE_HOME=
CPATH=$J2EE_HOME/lib/j2ee.jar:ConverterAppClient.jar:.

java -classpath “$CPATH” ConverterClient
2. 运行脚本文件testClient.sh
Windows:
1. 在下面批处理文件testClient.bat中,对根据实际J2EE安装目录进行修改。
set J2EE_HOME=
set CPATH=.;%J2EE_HOME%\lib\j2ee.jar;ConverterAppClient.jar

java -classpath “%CPATH%” ConverterClient
2. 运行批处理文件 testClient.bat
常见问题处理
当运行ConverterClient 时发现下面错误:
1. java.lang.ClassCastException
可能无法找到ConverterAppClient.jar文件。
2. java.lang.NoClassDefFoundError: ConverterClient
无法定位ConverterClient.class 文件。
3. java.lang.NoClassDefFoundError: javax/naming/Context
无法找到所需的j2ee.jar 文件,确认CLASSPATH设置。
4. javax.naming.NameNotFoundException: Lookup of name MyConverter failed.
J2EE服务器无法定位JNDI名字MyConverter所绑定的组件。
5. javax.naming.NamingException: Error accessing repository: Cannot connect to ORB at . . . .
J2EE服务器没有运行。