开发第一个分布式的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
|
|
|
|
|