| 
| 
| 开发第一个分布式的j2ee应用 |  
| 时间:2014-05-04 10:05:00  来源:不详  作者:佚名 |  
| | 这里先引用Charly的Wi 
 | ndows2000下安装J2EE和部署J2E 
 | E应用程序中的部门内容 
 | 
 | 可以从以下网址下载一 java.sun.com/j2ee/j2sdke
 是,在安装新下载的J2EE之
 1_3-beta2-win.exe,按安
 录下。
 
 | 个J2EE(j2sdkee-1_3-beta2-wi e-beta/index.html。也许你已
 前请先卸载或删掉旧版的J2EE S
 装步骤安装好J2EE。这里假设你
 
 
 | n.exe):http:// 装了旧版的J2EE SDK 产品,如果
 DK。运行j2sdkee-
 的J2EE安装在:C:j2sdkee1.3 目
 
 
 | 
 
 | 在运行J2EE SDK之前,你必须设置以下环境变量: | 
 | J2EE_HOME - 你的J2EE 
 | SDK所安装的目录。如本例中的 
 | :C:j2sdkee1.3 。 
 | 
 | JAVA_HOME - 你的Java 2 SDK 所安装的目录。 | 
 | PATH - 设置为你安装J2EE SDK目录 
 | 下的bin目录。如本例的的:C:j2sdkee1.3bin 。 
 | 
 | ClassPath - 增添%J2EE_HOME%lib C:j2sdkee1.3libj2ee.jar
 
 | j2ee.jar到ClassPath中。本例中也可写为: 
 
 | 
 
 | %J2EE_HOME%binj2ee -verbose | 
 | 显示以下信息表示运行成功:(不同的版本显示可能不同) | 
 | J2EE server listen port: 1050 | 
 | Naming service started:1050 | 
 | Binding DataSource, rmi:CloudscapeDB;create=
 
 | name = jdbc/EstoreDB, url = true
 
 | jdbc:cloudscape: 
 
 | 
 | Binding DataSource, name = jdbc/ pe:rmi:CloudscapeDB;create=true
 
 | DB2, url = jdbc:cloudsca 
 
 | 
 | Binding DataSource, e:rmi:CloudscapeDB;creat
 
 | name = jdbc/Cloudscape, url e=true
 
 | = jdbc:cloudscap 
 
 | 
 | Binding DataSource, pe:rmi:CloudscapeDB;crea
 
 | name = jdbc/InventoryDB, url te=true
 
 | = jdbc:cloudsca 
 
 | 
 | Binding DataSource, loudscapeDB;create=true
 
 | name = jdbc/DB1, url = jdbc: 
 
 | cloudscape:rmi:C 
 
 | 
 | Binding DataSource, name = jdbc/ 
 | XACloudscape, url = jdbc/XACloudscape__xa 
 | 
 | Binding DataSource, name = jdbc/ COM.cloudscape.core.RemoteXaDataSour
 
 | XACloudscape__xa, dataSource = ce@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 
 | 
 | Starting web service at port:9191 | 
 | J2EE server startup complete. | 
 
 | 启动成功后,在IE浏 览 器 中 访 主 页 信 息 。
 
 | 问 HTTP://localhost:8000 可 以 看 到 默 认 的 
 
 | 
 
 | J2EE应用程序一般使用 也少不了EJB的作用。本例
 Hello,Remote Object”。
 客户端收到此应答后打印它
 
 | RMI(远程方法调用)来完成客 为一个J2EE应用程序:客户端向
 服务器收到该问候语后打印该问
 。
 
 | 户端与服务器的交互。当然,其间 服务器发送一个问候语:“
 候语,并返回一字符串作为应答。
 
 
 | 
 
 
 | * 定义一个新的接口继 出
 
 | 承javax.ejb.EJBObject。新定 
 
 | 义的接口中的每一个方法都必须抛 
 
 | 
 | * java.rmi.RemoteException异常。 | 
 | public interface RemoteInterface 
 | extends javax.ejb.EJBObject 
 | 
 | public String messag 
 | e(String str)throws java.rmi 
 | .RemoteException; 
 | 
 
 
 | * 定义一个类来实现javax.ejb.Sess 口中所定义的方法。
 
 | ionBean接口。并在该类中实现在第一步中编写的接 
 
 | 
 | public class RemoteO 
 | bject implements javax.ejb.S 
 | essionBean 
 | 
 | public String messag 
 | e(String str)throws java.rmi 
 | .RemoteException 
 | 
 | System.out.println("Remote Objec (从客户端)接收到的字符串。
 
 | t Received From Client: ""+str+"""); //打印 
 
 | 
 | return "Hello,I'm Re 一应答字符串。
 
 | mote Object,I received your 
 
 | message: '"+str+"'"; //返回 
 
 | 
 
 | public void ejbCreate() {} | 
 | public void ejbRemove() {} | 
 | public void ejbActivate() {} | 
 | public void ejbPassivate() {} | 
 | public void setSessionContext(ja 
 | vax.ejb.SessionContext sc) {} 
 | 
 
 
 | * 定义一个类继承javax.ejb.EJBHome 。 | 
 | public interface RemoteHome exte 
 | nds javax.ejb.EJBHome 
 | 
 | RemoteInterface crea b.CreateException;
 
 | te()throws java.rmi.RemoteEx 
 
 | ception,javax.ej 
 
 | 
 
 
 | public static void main(String[] args) | 
 | javax.naming.Context 
 | initContext=new javax.namin 
 | g.InitialContext(); 
 | 
 | Object obj=initContext.lookup("H 。
 
 | elloWorld"); //远程查找,由名字得到对应的对象 
 
 | 
 | RemoteHome home=(RemoteHome)java ct.narrow(obj,RemoteHome.class);
 
 | x.rmi.PortableRemoteObje 
 
 | 
 | RemoteInterface remote=home.create(); | 
 | String receiveFromRe 用
 
 | mote=remote.message("Hello,R 
 
 | emote Object!"); //远程方法调 
 
 | 
 | System.out.println(" iveFromRemote+""");
 
 | Client Received From Remote 
 
 | Object: ""+rece 
 
 | 
 
 | 假设以上四个Java文件存于C:HelloWorld下,编译它们如:C:HelloWorld>javac *.java 。 | 
 
 
 | 启动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便完成了部署工作。 | 
 
 
 | 新开一个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程序了吧? | 
 | 可是现在有一个问题, 叫什么分布系统吗?是不是
 
 | ejb和j2ee的优点是在哪儿?什 有点可笑》现在下面我就教大家
 
 | 么是分布式的,在一台机器上那还 怎么把上面的程序变成分布式的。
 
 | 
 | 如果您直接把client.c home和remote接口,这两个
 还需要这个包。把那个包也
 ,程序怎么知道你要连的服
 
 | lass copy 到其他的机器上,肯 文件在什么地方呢?在hellocli
 copy过去,执行一下,还是不可
 务器在哪儿呀?所以原来的clie
 
 | 定执行不了。因为你还需要一个 ent.jar这个包里面!:)所以你
 以。因为你的jndi名,只是个名字
 nt代码你需要做如下的改动。
 
 | 
 
 | Properties env = new Properties(); | 
 | env.put(javax.naming ndi.cosnaming.CNCtxFacto
 
 | .Context.INITIAL_CONTEXT_FAC ry");
 
 | TORY, "com.sun.j 
 
 | 
 | env.put(javax.naming.Context.PRO 
 | VIDER_URL,"iiop://wcy:1050"); 
 | 
 | //javax.naming.Conte 
 | xt initContext=new javax.nam 
 | ing.InitialContext(env); 
 | 
 | Context initContext 
 | = new InitialContext(env); 
 | 
 
 | Object obj=initContext.lookup("H 。
 
 | elloWorld"); //远程查找,由名字得到对应的对象 
 
 | 
 | RemoteHome home=(Rem w(obj,RemoteHome.class);
 
 | oteHome)javax.rmi.PortableRe 
 
 | moteObject.narro 
 
 | 
 | RemoteInterface remote=home.create(); | 
 | String receiveFromRemote=remote. 用
 
 | message("Hello,Remote Object!"); //远程方法调 
 
 | 
 | System.out.println(" iveFromRemote+""");
 
 | Client Received From Remote 
 
 | Object: ""+rece 
 
 | 
 
 | 重新编译javac *.java成功后。把这个新的类copy到其他的机器上 | 
 | 打入java -classpath 
 | %J2EE_HOME%libj2ee.jar;.;H 
 | elloWorldClient.jar; Client 
 | 
 
 |  |  |  |