ITPub博客

首页 > 应用开发 > Java > 带你步入J2EE殿堂:最易懂的J2EE实例 (转)

带你步入J2EE殿堂:最易懂的J2EE实例 (转)

原创 Java 作者:gugu99 时间:2007-10-14 13:17:59 0 删除 编辑
带你步入J2EE殿堂:最易懂的J2EE实例 (转)[@more@]

  J2EE构建企业模型(一)

  windows2000下安装J2EE和部署J2EE应用程序
  Charly(09/05/2001)

1. 安装
可以从以下网址下载一个J2EE SDK(j2sdkee-1_3-beta2-win.exe):Java.sun.com/DOWNLOAD5?referer=&download-name=j2sdkee-1_3-beta2-win.exe&config-file=j2sdkee-1_3-beta2.config&platform=win&domain-checked=unknownhostname&DEbug=&document=license&button=ACCEPT">http://java.sun.com/Download5?referer=&download-name=j2sdkee-1_3-beta2-win.exe&config-file=j2sdkee-1_3-beta2.config&platform=win&domain-checked=unknownhostname&DEBUG=&document=license&button=ACCEPT 。如果这个地址不行,很可能是Sun的页面更新了的缘故,不要紧,可从这里下载:http://java.sun.com/j2ee/j2sdkee-beta/index.html 。建议从后面那个地址下载,这样可有更多的选择余地,特别是Sun将J2EE SDK升级了的话。也许你已装了旧版的J2EE SDK 产品,如果是,在安装新下载的J2EE SDK之前请先卸载或删掉旧版的J2EE SDK。运行j2sdkee-1_3-beta2-win.exe,按安装步骤安装好J2EE SDK。这里假设你的J2EE SDK安装在:C:j2sdkee1.3 目录下。

2. 设置环境变量
在运行J2EE SDK之前,你必须设置以下环境变量:
J2EE_HOME - 你的J2EE SDK所安装的目录。如本例中的:C:j2sdkee1.3 。
JAVA_HOME - 你的Java 2 SDK 所安装的目录。
PATH - 设置为你安装J2EE SDK目录下的bin目录。如本例的的:C:j2sdkee1.3bin 。
ClassPath - 增添%J2EE_HOME%libj2ee.jar到ClassPath中。本例中也可写为:C:j2sdkee1.3libj2ee.jar

3. 运行J2EE
Dos命令行敲入以下命令:
  %J2EE_HOME%binj2ee -verbose
显示以下信息表示运行成功:(不同的版本显示可能不同)
  J2EE server listen port: 1050
  Naming service started:1050
  Binding Datasource, name = jdbc/EstoreDB, url = JDBC:cloudscape:Rmi:CloudscapeDB;create=true
  Binding DataSource, name = jdbc/DB2, url = jdbc:cloudscape:rmi:CloudscapeDB;create=true
  Binding DataSource, name = jdbc/Cloudscape, url = jdbc:cloudscape:rmi:CloudscapeDB;create=true
  Binding DataSource, name = jdbc/InventoryDB, url = jdbc:cloudscape:rmi:CloudscapeDB;create=true
  Binding DataSource, name = jdbc/DB1, url = jdbc:cloudscape:rmi:CloudscapeDB;create=true
  Binding DataSource, name = jdbc/XACloudscape, url = jdbc/XACloudscape__xa
  Binding DataSource, name = jdbc/XACloudscape__xa, dataSource = Mailto:COM.cloudscape.core.RemoteXaDataSource@330913">COM.cloudscape.core.RemoteXaDataSource@330913
  Starting JMS service ... Initialization complete - waiting for client requests
  Binding : < JMS Destination : jms/Queue , javax.jms.Queue >
  Binding : < JMS Destination : jms/Topic , javax.jms.Topic >
  Binding : < JMS Cnx Factory : jms/TopicConnectionFactory , Topic , No properties >
  Binding : < JMS Cnx Factory : TopicConnectionFactory , Topic , No properties >
  Binding : < JMS Cnx Factory : jms/QueueConnectionFactory , Queue , No properties >
  Binding : < JMS Cnx Factory : QueueConnectionFactory , Queue , No properties >
  Starting web service at port:8000
  Starting secure web service at port:7000
  apache tomcat/4.0-b4-dev
  Starting web service at port:9191
  Apache Tomcat/4.0-b4-dev
  J2EE server startup complete.

启动成功后,在IE浏 览 器 中 访 问 HTTP://localhost:8000 可 以 看 到 默 认 的 主 页 信 息 。

4. 编写和运行HelloWorld程序
J2EE应用程序一般使用RMI(远程方法调用)来完成客户端与服务器的交互。当然,其间也少不了EJB的作用。本例为一个J2EE应用程序:客户端向服务器发送一个问候语:“Hello,Remote object”。服务器收到该问候语后打印该问候语,并返回一字符串作为应答。客户端收到此应答后打印它。

RemoteInterface.java

/**
 * 第一步:
 * 定义一个新的接口继承javax.ejb.EJBObject。新定义的接口中的每一个方法都必须抛出
 * java.rmi.RemoteException异常。
 */
public interface RemoteInterface extends javax.ejb.EJBObject
{
  public String message(String str)throws java.rmi.RemoteException;
}

RemoteObject.java

/**
 * 第二步:
 * 定义一个类来实现javax.ejb.SessionBean接口。
 * 该类必须申明为public并且不能为abstract或final
 * 该类包含一个不带参数的public构造器
 * 该类不能定义finalize方法
 * 在该类中实现一个或多个ejbCreate方法
 * 在该类中实现(第一步中定义的)企业方法
 */
public class RemoteObject implements javax.ejb.SessionBean
{
  public String message(String str)throws java.rmi.RemoteException
  {
  System.out.println("Remote Object Received From Client: ""+str+"""); //打印(从客户端)接收到的字符串。
  return "Hello,I'm Remote Object,I received your message: '"+str+"'"; //返回一应答字符串。
  }
 
  public RemoteObject() {}
  public void ejbCreate() {}
  public void ejbRemove() {}
  public void ejbActivate() {}
  public void ejbPassivate() {}
  public void setSessionContext(javax.ejb.SessionContext sc) {}
}

RemoteHome.java

/**
 * 第三步:
 * 定义一个类继承javax.ejb.EJBHome 。
 */
public interface RemoteHome extends javax.ejb.EJBHome
{
  RemoteInterface create()throws java.rmi.RemoteException,javax.ejb.CreateException;
}

Client.java

/**
 * 第四步:
 * 定义客户端类。
 */
public class Client
{
  public static void main(String[] args)
  {
  try
  {
  javax.naming.Context initContext=new javax.naming.InitialContext();
  Object obj=initContext.lookup("HelloWorld"); //远程查找,由名字得到对应的对象
  RemoteHome home=(RemoteHome)javax.rmi.PortableRemoteObject.narrow(obj,RemoteHome.class);
  RemoteInterface remote=home.create();
  String receiveFromRemote=remote.message("Hello,Remote Object!"); //远程方法调用
  System.out.println("Client Received From Remote Object: ""+receiveFromRemote+""");
  }
  catch(Exception e)
  {
  e.printStackTrace();
  }
  }
}

假设以上四个Java文件存于C:HelloWorld下,编译它们如:C:HelloWorld>javac *.java 。

5. 部署应用程序
启动Application Dopolyment Tool:新开一个Dos窗口,键入以下命令,%J2EE_HOME%bindeploytool 。该工具启动速度可能比较慢,要耐心等待。启动成功后会出现主界面(此时不要关闭Dos窗口)。在该界面中选 择 File菜 单 ,再选New Application项。在 Application File Name 输 入 :C:HelloWorldHelloWorld.ear 。在 Application Disply Name 输 入 你所喜欢的显示名如:HelloWorld。点 击 OK,在主界面的树形结构Files-->Applications下将增加新的一项:HelloWorld。这意味着产生了一个新的应用程序。接下来我们要做的就是部署该应用程序。在主界面的树形结构下选中HelloWorld,然后再在主界面的File菜单中选取New-->Enterprise Bean,在弹出的名为“New Enterprise Bean - Introduction”窗口中选取Next跳过第一步,在接下来的一步中,Create New EJB File in Application项中选HelloWorld,在EJB Display Name中填上你喜欢的名字如:Hello World EJB,点击Edit按钮,在弹出的窗口中,Start Directory中填:C:HelloWorld,在Available Files中展开树形结构C:HelloWorld,选取RemoteInterface.class、RemoteObject.class、RemoteHome.class、Client.class四项,点Add按钮添加,然后按OK确定。此时在Contents框中增加了该四个class。点Next进入下一步。Session项选Stateless,意为不保存session状态。Enterprise Bean Class选RemoteObject。Enterprise Bean Name中填上你喜欢的名字如:Hello World Bean。Remote Home Interface中选RemoteHome,Remote Interface中选RemoteInterface。选Next进入下一步。接下来的步骤可直接点Finish。这时主界面的树形结构中Files-->Application-->Hello World中将出现Hello World EJB-->Hello World Bean子项。在主界面的树形结构下选中Hello World,然后再在主界面的Tools菜单中选取Deploy,将弹出新的窗口名为“Deploy Hello World - Introduction”。Object to deploy中选Hello World,Target server中选localhost,选中Retuen Client Jar,在Client Jar File Name中填上:C:HelloWorldHelloWorldClient.jar。选Next进入下一步,在Application框的JNDI Name框中双击并填上HelloWorld,注意必须与Client.java中Object obj=initContext.lookup("HelloWorld")的“HelloWorld”保持一致。点Next进入下一步。点Finish完成。这时将出现Deployment Progress窗口。如果有误,该窗口将出现异常信息。如果一切正常,点OK便完成了部署工作。

6. 运行应用程序
新开一个Dos窗口。进入C:HelloWorldClasses目录下运行:C: HelloWorldClasses>java -classpath  %J2EE_HOME%libj2ee.jar;.;HelloWorldClient.jar; Client 。运行成功则出现如下信息:Client Received From Remote Object: "Hello,I'm Remote Object,I received your message: 'Hello,Remote Object!'" 。而服务端Dos窗口(j2ee -verbose)中出现如下信息:Remote Object Received From Client: "Hello,Remote Object!" 。

本程序很适J2EE的入门,简单而明了。本程序由Charly设计编写,并由其本人多次运行确保无误。如不能正常运行,请检查你的环境变量设置是否正确,最好不要直接将以上各命令Copy到Dos窗口中运行,某些字符可能受中文全角字符的影响而不被识别。另外如果某个应用程序部署不成功,可以使用Application Deployment Tool主界面的Edit菜单的Delete项将这个应用程序(如:Hello World)或其子项删掉。此工具的右键功能几乎没有,愦憾。


7. 总结

J2EE模型:

Client-Side  Server-Side  Server-Side  Enterprise
Presentation  Presentation  Business Logic  Information System
+-------------+  +----------+  +----------+  +----------+
|  Browser  |  |  Web  |  |  EJB  |  |  |
|  |  |  Server  |  | Container|  |  |
|  +-------+  |  | +------+ |  | +------+ |  |  |
|  |Pure  |  |  | |JSP  | |  | |EJB  | |  |  |
|  |HTML  |  |  | |  | |  | |  | |  |  |
|  +-------+  |  | +------+ |  | +------+ |  |  |
|  |<:::::>|  |<:::::>|  |<:::::>|+--------+|
|  +-------+  |  | +------+ |  | +------+ |  ||  ||
|  |Java  |  |  | |JSP  | |  | |EJB  | |  ||  ||
|  |Applet |  |  | |  | |  | |  | |  ||  ||
|  +-------+  |  | +------+ |  | +------+ |  ||  ||
+-------------+  |  |  |  |  ||Database||
  |  |<::::::|::::::::::|::::::>||  &  ||
+-------------+  |  |  |  |  ||legacy  ||
|  Desktop  |  |  |  |  |  ||Systems ||
|+-----------+|  |+--------+|  | +------+ |  ||  ||
||Java  ||<:::::>||Java  ||<:::::>| |EJB  | |<:::::>||  ||
||Application||  ||servlet ||  | |  | |  ||  ||
|+-----------+|  |+--------+|  | +------+ |  |+--------+|
+-------------+  |  |  |  |  |  |
  |  |  |  |  |  |
+-------------+  |  |  |  |  |  |
|Other Device |  |  |  |  |  |  |
|  +-------+  |  |+--------+|  |+--------+|  |  |
|  |J2EE  |  |<:::::>||J2EE  ||<:::::>||J2EE  ||<:::::>|  |
|  |Client |  |  ||Platform||  ||Platform||  |  |
|  +-------+  |  |+--------+|  |+--------+|  |  |
+-------------+  +----------+  +----------+  +----------+

Sun为rmi、Servlet(JSP)、JavaBean等Java技术摇旗呐喊已有多年。J2EE的出现不可谓不是一个大的综合和封装。它的出现应该说是这些技术走向成熟的结果。举个例子,JSP技术去年(2000年)在大中华范围的书店中都少有介绍,几近没有。现在业已铺天盖地。ASP似乎已成明日黄花,不过microsoft C#的推出是否会让它有所改变?有待观察。面对竞争对手的压力,Sun自然对J2EE寄予厚望。应该说,Sun的Java设计一直都很规格和严谨。在这方面,当今还没有其它哪门语言能与之匹敌。J2EE的设计自然也是大手笔。J2EE被设计成多层次的分布式的结构。客户端可包括浏览器,桌面应用程序,甚至其它设备如PDA程序。服务端可以为Web服务和应用(Application)服务,这分别是Servlet(JSP)和rmi技术的体现。客户端通过网络协议向服务端提出请求(Web服务或应用服务),该请求如果需要后台企业信息系统(如数据库)支持,服务端则直接或在EJB支持下来操作后台企业信息系统(如数据库),并将结果返回至客户端;如果不需要后台企业信息系统(数据库)支持,服务端则直接或在EJB支持下处理该请求,并将结果返回至客户端。当然其间各环节都少不了安全控制:J2EE的标 准 的 公 开 存 取 控 制 规 则 。应该说,J2EE的Web应用会取得很大成功,因为Servlet(JSP)在Web方面有数不尽的优势:速度快(比ASP、PHP可能快好几倍)、跨平台、稳定(这不能不说是得益于Java的规格和严谨)、成熟(实际应用已久且应用广泛)、功能强大。而J2EE的应用服务应该也算不错,只是其使用的标准界面swing实在是太耗资源且效率低。君不见,当今用Swing写的程序哪个不存在以下情形:程序启动时象国产拖拉机,轰隆轰隆地响--那是读硬盘声音(有些夸张,但不过分);界面刷新慢,明显的延时;操作不方便,快捷键和右键功能少(当然这与软件生产者有关,但Swing要负一部分责任)。此如说Sun的Forte4Java、J2EE SDK、ORACLE的Jdeveloper、IBM的websphere都有此症。作为程序员,我们也许还能接受,以不断提升硬件来迷补其不足(虽然至今还是不足)。但作为客户企业,你用Swing给人家做了一个ERP或其中的某一环节,用起来有如此顽症,怎么向人家解释?向他(她)说,这是用Swing写的,所以很慢?对不起,人家不会关心你用什么写的,人家给你的也许只有抱怨。除了界面部分外,J2EE的应用服务应该说是很不错的,如分布式计算。

 

 

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10748419/viewspace-976392/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 扭脚与跑步 (转)
请登录后发表评论 登录
全部评论
  • 博文量
    3122
  • 访问量
    2226361