这种客户端就如它的名字一样,它独立于J2EE,不是J2EE的组件。它一般用于测试我们开发的EJB。下面是一个具体的例子,它访问的EJB是上边的那个Stateless Session Bean。
打开一个dos窗口,使用如下的指令编译我们的代码(请根据自己的环境对里面的参数作相应调整):
D:\j2sdkee1.3\myapp\HELLOW~1>javac -classpath .;d:\j2sdkee1.3\lib\j2ee.jar MyStandAloneClient.java
编译完成后在运行这个例子之前,要在我们的J2EE 服务器上发布我们所实现的EJB。这里我使用的J2EE服务器是J2EE SDK 1.3,有关它的介绍请见本文的附录1--J2EE SDK1.3介绍。如何在它上边发布HelloWorld EJB的详细步骤请见附录2--发布HelloWorld Staless Session Bean。
在服务器已经启动,EJB已经发布的情况下,让我们来运行一下上边的例子,使用如下的命令运行:
D:\j2sdkee1.3\myapp\HELLOW~1>java -classpath ".;d:\j2sdkee1.3\lib\j2ee.jar;helloworldClient.jar" MyStandAloneClient
这样你就可以在J2EE Server控制台上看到我们的MyStandAloneClient调用sayHello方法所打印出来的"Hello :)"(使用j2ee -verbose启动服务器)。
J2EE Application Client
它和Stand alone Client很像,也是一个java application,但不同的是这种客户端是J2EE组件的一种。所以要想使用这种客户端,你就要用相应J2EE服务器的应用发布工具将它发布到服务器上。因为它是J2EE的组件,它与Stand alone Client最大不同在于它可以使用J2EE提供的服务。比如它可以由J2EE统一进行安全认证,在你运行J2EE Application Client时系统会自动弹出一个认证窗口,你输入J2EE服务器上许可的用户名和密码后才能运行这个程序,从而访问J2EE Server上的EJB。它给我们开发带来的好处是可想而知的。
还有在J2EE Application Client中,你可以通过为已有的EJB加入JNDI参考来用自己定义的JNDI名称访问EJB。例如在我的例子中是通过下面的代码来得到EJB对象的: Object objref = initial.lookup("java:comp/env/ejb/hai");
大家也许记得在Stand alone Client例子中,我是通过"HelloWorld"JNDI名称得到同样的对象的。而这里却是"ejb/hai"。用不同的JNDI名称来访问同一个EJB。这样做的好处就是你可以随意更改你的EJB的JNDI名称,而J2EE Application Client程序代码不需要有任何更改,只需要修改EJB参考中的对应关系就可以了。这里是源代码:
2 import javax.naming.InitialContext;
3 import javax.rmi.PortableRemoteObject;
4 import com.javausr.example.HelloWorld;
5 import com.javausr.example.HelloWorldHome;
6 public class MyJ2EEAPPClient {
7 public static void main(String[] args) {
8 try {
9 //创建jndi初始化环境
10 Context initial = new InitialContext();
11 //找到ejb的Remote Home Interface
12 Object objref = initial.lookup("java:comp/env/ejb/hai");
13 HelloWorldHome home =
14 (HelloWorldHome)PortableRemoteObject.narrow(objref,
15 HelloWorldHome.class);
16 //初始化ejb,得到Remote Interface
17 HelloWorld helloWorld = home.create();
18 //调用商业方法sayHello()
19 helloWorld.sayHello();
20 System.exit(0);
21 } catch (Exception ex) {
22 System.err.println("Caught an unexpected exception!");
23 ex.printStackTrace();
24 }
25 }
26 }
27
你会发现在代码上除了上面提到的JNDI名称不同外,没有其他什么不同。但是我们不能像对Stand alone Client那样,编译完后就运行它,而要先创建一个J2EE Application Client组件,并把它加入到我们的应用中。有关这个创建过程请参考文章附录3--创建J2EE Application Client组件。
创建好J2EE Application Client组件并将我们的应用发布后,现在就可以运行我们的J2EE Application Client了。这里我们要用到J2EE SDK1.3为我们提供的一个运行J2EE Application Client的批处理命令runclient(在\bin 目录下,将它拷到含有编译后的class文件的目录中)。最后我们使用如下的命令运行: D:\j2sdkee1.3\myapp\HELLOW~1>runclient -client helloworld.ear -name J2EEAPPClient
这时会出现一个认证窗口,输入用户名guest和密码guest123(系统缺省提供的用户):
然后就可以在J2EE Server的控制台看到结果了,输出Hello :)。
相应的在我们运行J2EE Application Client的控制台也会在执行过程中打印出如下信息:
2 Username = null
3 Binding name:`java:comp/env/ejb/hai`
4 Unbinding name:`java:comp/env/ejb/hai`
5
从发布J2EE Application Client组件过程以及运行过程,你已经看到了它与Stand Alone Client的两个最大的不同,一个是我们重新用另一个JNDI参考名称"hai"来访问EJB,另一个是在运行的时候系统会对我们进行认证。J2EE Application Client可以有很多实际的用途,比如可以用它在我们的系统中实现后台管理功能。
这篇文章是我自己在学习J2EE时的一些心得。对J2EE而言,核心当然还是EJB,尤其是EntityBean。