您的位置:首页 > 移动开发

使用 WebSphere Studio Application Developer 构建 J2EE 应用程序客户机

2005-10-27 09:27 761 查看
介绍
J2EE 应用程序客户机(application client)已经悄悄的于去年被引入到了 J2EE 规范中。由于开发人员对该应用程序客户机的用途和功能了解不多,使得很多开发者偏爱常规的 Java应用程序、applet 或 Web 应用程序。本文讲解了应用程序客户机的使用以及使用它们的好处,从而帮助您确定它们是否适合于您的应用。它还提供了关于在 WebSphere®Studio Application Developer 内建立以及开发应用程序客户机的信息。
应用程序客户机很像常规的 Java 应用程序。它们包含一个可执行的
main()
方法,它们被持续执行直到虚拟机停止。它们是典型的“胖客户”应用程序可以作为连接到一组持久性EJB bean和实现业务逻辑的 EJB bean 的 GUI,或者作为在网络上提供服务的服务器应用程序来运行。但是,应用程序客户机有几个超出常规 Java 应用程序的优点,因为它是在轻量级的服务器容器中运行,该容器可以给应用程序客户机提供往往只对其它 J2EE 组件可用的服务。
J2EE 应用程序客户机优于常规 Java 应用程序的几个方面:
能够在服务器容器内运行,提供更丰富的 API。
使用
java:comp
名称空间间接地引用 EJB bean。
使用 J2EE 的安全性,包括认证和特定于服务器的功能,J2EE 安全性可能包括像单点登录这样的功能。
保证 Java 2 平台 API 是可用的,及容器扩展API的可用性。
简单的 JNDI 查找,因为初始的上下文属性是从容器处获得的。
像其它 J2EE 组件那样被打包,提供可移植性、容易部署和彻底打包。它还支持这样一种 J2EE 概念:为了移到另一个服务器,部署者可以不更改代码,只修改部署信息。
本文基于 Application Developer,版本 4.02。如果您正在使用版本 4.0,那么在用到本文所讨论的主题之前,您必须进行升级。
创建应用程序客户机资源
在 Application Developer 中,您使用应用程序客户机工程来创建应用程序客户机。像 Web 和 EJB 工程一样,该工程包含应用程序客户机的扩展内容。当您在
appClientModule
文件夹内做了更改,您所做的更改将自动被复制到(Java 类被编译到)
bin
文件夹。
本文假设您已经用一个 EJB 工程创建了 EAR 应用程序,该 EJB 工程包含您的应用程序客户机需要连接的 EJB。一旦您创建了这个应用程序客户机工程,您应该做的第一件事是更新该应用程序客户机,使它能够看到它将需要的所有的 EJB 类或实用程序 JAR。您可以使用 Edit Module Dependencies 对话框来更新 Java 构建路径(用于编译时)并创建一个
MANIFEST.MF
文件(用于运行时)。请执行下面的步骤:
鼠标右键单击该应用程序客户机工程,然后选择 Edit Module Dependencies
检查该应用程序客户机将要依赖的 EJB 工程或实用程序 JAR 文件。
单击 OK。这将更新该应用程序客户机的构建类路径(classpath),使其包含来自 EAB 工程的 EJB 工程或实用程序 JAR 文件。它还将在这个应用程序客户机工程中生成一个清单文件。该清单文件将运行时 classpath 设置为包含 EJB 工程或实用程序 JAR 文件,使它们能够在运行时被找到。
现在,您可以在该应用程序客户机工程内创建 Java 应用程序类了。下面的清单 1 展示了一个样本应用程序,它包含一个
main()
方法,并且调用绑定到 test/HelloWorld 这个 JNDI 名称的 HelloWorld EJB 上的方法。请注意该样本没有象通常情况下那样建立包含
InitialContextFactory
ProviderURL
的“属性”对象。因为该类将被作为应用程序客户机运行,所以它将自动从应用程序客户机容器获得这些属性。
清单 1. 样本应用程序客户机类。
package com.test;

import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import com.ejb.hello.*;

public class ClientApplication {
public static void main(String[] args) {
try {
InitialContext context = new InitialContext();
Object obj = context.lookup("test/HelloWorld");

HelloWorldHome home = (HelloWorldHome)
PortableRemoteObject.narrow(obj, HelloWorldHome.class);
HelloWorld bean = home.create();
System.out.println("The HelloWorld bean says " +
bean.sayHello("Tim"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
在您创建了包含
main()
方法的这个类之后,您将需要把
main
类添加到该应用程序客户机的清单文件中。如果您没有设置这个
main
类,那么该应用程序客户机容器将无法找到这个启动类并且启动您的应用程序。请执行下面的步骤:
打开包含在
appClientModule/META-INF
文件夹中的
MANIFEST.MF
文件。(该文件自动地由Edit Module Dependencies 对话框创建。)添加下面的代码行,其中 com.test.ClientApplication是包含
main()
方法的类的名称:
Main-Class: com.test.ClientApplication
下面的清单 2 展示了一个示例清单文件。您的清单文件应该看起来与这个文件类似。
保存,然后关闭编辑器。
清单 2. 样本 MANIFEST.MF 文件
Manifest-Version: 1.0
Class-Path: HelloWorldEJB.jar
Main-Class: com.test.ApplicationClient
使用 java: JNDI 名称空间(可选的)
使用应用程序客户机的一个主要的好处是,当从 JNDI 名称空间查找 EJB bean 时,可以选择使用
java: JNDI
名称空间。
java:
名称空间在应用程序代码和 EJB bean 之间提供了额外的间接层。主要的目的之一是,通过修改绑定文件并且不对 Java 代码做任何更改,使您能够切换到使用新的 JNDI 名称(例如,如果移动了 EJB bean)。
Application Developer,版本 4.0 不包括对应用程序客户机所包含的
application-client.xml
或特定于 WebSphere 的绑定文件的任何编辑器支持。但是,这些文件相当小,您可以使用文本编辑器手工修改它们。
application-client.xml
文件是 J2EE 规范的一部分,并且它包含使用 java:comp 引用 EJB bean 的信息。在部署时,这些 EJB 引用通过特定于 WebSphere 的
ibm-application-client-bnd.xmi
文件绑定到特定的 EJB bean。要更新这些文件:
使用文本编辑器,打开
appClientModule/META-INF
文件夹中的
application-client.xml
文件。
下面的清单 3 展示了一个示例
application-client.xml
文件。将突出显示为蓝色的部分添加到该文件的副本中。 清单 3. 样本 application-client.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application-client PUBLIC "-//Sun Microsystems, Inc.//
DTD J2EE Application Client 1.2//EN"
"http://java.sun.com/j2ee/dtds/application-client_1_2.dtd">
<application-client id="Application-client_ID">
<display-name>Sample Application Client</display-name>

<ejb-ref id="EjbRef_1">
<description>HelloWorldExample</description>
<ejb-ref-name>ejb/Hello</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>com.ejb.hello.HelloWorldHome</home>
<remote>com.ejb.hello.HelloWorld</remote>
</ejb-ref>
</application-client>
ejb-ref-name
元素改为您的应用程序客户机将用来查找 EJB bean 的名称。该约定以
ejb/
开头,但这是可选的。
通过分别更改 home 和 remote 元素,指定本地和远程接口类名或者您的 EJB bean。
如果在这个文件中有多个 EJB 引用,那么每次引用,标识将加一。
保存,然后关闭编辑器。
appClientModule/META-INF
文件夹内创建
ibm-application-client-bnd.xmi
文件。
使用文本编辑器打开该文件。
下面的清单 4 展示了该文件的一些示例内容。您可以将这个示例复制到您的编辑器中,并且将
jndiName
属性修改为 EJB bean 实际的 JNDI 名称。如果有多个 EJB 引用,
bindingEjbRef
元素的
href
参数应该以
application-client.xml
文件中指定的标识结束。
保存,然后关闭编辑器。
清单 4. 样本 ibm-application-client-bnd.xmi 文件
<clientbnd:ApplicationClientBinding xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:clientbnd="clientbnd.xmi"
xmlns:commonbnd="commonbnd.xmi" xmlns:common="common.xmi"
xmlns:client="client.xmi" xmi:id="Application-client_ID_Bnd">
<ejbRefs xmi:id="EjbRefBinding_1" jndiName="test/HelloWorld">
<bindingEjbRef href="META-INF/application-client.xml#EjbRef_1"/>
</ejbRefs>
<applicationClient
href="META-INF/application-client.xml#Application-client_ID"/>
</clientbnd:ApplicationClientBinding>
最后一步是将 Java 应用程序修改为使用 java:comp 查找,而不是直接引用 EJB。如下面的清单 5 所示,更改执行查找的 Java 代码,其中
ejb/Hello
是您在
application-client.xml
文件中输入的
ejb-ref-name

清单 5. 使用 java: JNDI 查找
Object object = context.lookup("java:comp/env/ejb/Hello");
现在,您已经完成了将
java:comp
查找添加到您的客户应用程序的工作。该工程现在应该看起来像下面的图 1 那样。
图 1.工程



运行应用程序客户机
在您可以在 Application Developer 内运行 J2EE 应用程序客户机之前,对于“WebSphere 测试环境”(WebSphere Test Environment),您将需要一个 e-fix。没有这个 e-fix,当运行应用程序客户机工程时,WebSphere 不支持松散模块(与在 Application Developer 工作区一样,“企业应用程序”(Enterprise Application)内不直接包含这些模块)。请执行下面的步骤:
使用 Web 浏览器来转到 WebSphere 支持Web 站点,然后进入 All e-fixes, fixpaks, and tools的链接(或者直接进入 e-fixes)。
下载 PQ58388 的 e-fix。(在本文发布时,这个 e-fix 还不可用。它将尽快被发布到 WebSphere 支持站点。如果 e-fix 还不可用,那么您可以将您的应用程序客户机作为常规 J2EE 客户运行。)
按照在线帮助 WebSphere Application Server maintenance releases这一部分的指导来使用 e-fix。
虽然应用程序客户机正如任何其它 Java 应用程序一样有一个可以调用的
main()
方法,但是直接执行它将不会给服务器容器初始化安全性和名称空间支持的机会。直接执行它还将使用常规 Java 类装入器(classloader),而不是服务器的应用程序客户机类装入器。为了正确运行应用程序客户机,在 Application Developer 中使用应用程序客户机启动程序。该启动程序启动服务器,并使它指向包含该应用程序客户机的 EAR 文件。一旦服务器初始化了应用程序客户机容器,并且准备好启动代码,它将自动调用您的应用程序客户机的
main()
方法。从此以后,您的应用程序客户机将正常地执行,并且可以使用所有容器的服务。
要设置启动一个应用程序客户机:
如果工具栏上的 Debug/Run 按钮不可用,那么切换到其它透视图,或者执行下面的步骤,将它们添加到当前的透视图中。

选择 Perspective => Customize...菜单。
展开 Other,然后选择 Run/Debug
单击 OK

在 Navigator 内选则该应用程序客户机工程。鼠标右键单击并选择 Properties
选择对话框左边的 Launcher,然后使用组合框来选择 Application Client Launcher
单击 OK
上面的步骤只需要执行一次。既然该工程已经就绪,那么您可以启动您的应用程序客户机了:
选择该应用程序客户机工程的
main
类。
单击 RunDebug工具栏按钮来启动这个“应用程序客户机启动程序”(Application Client Launcher)。这样应该会启动该应用程序客户机容器并调用您的
main
类。下面的清单 6 展示了运行该应用程序客户机之后,控制台内的样本输出。
清单 6. 启动一个应用程序客户机。
IBM WebSphere Application Server, Release 4.0
J2EE Application Client Tool, Version 1.0
Copyright IBM Corp., 1997-2001

WSCL0012I: Processing command line arguments.
WSCL0001I: Command line, property file,
and system property arguments resolved to:
File to launch         = C:/wsad/eclipse/workspace/AppClientEAR

CC Property File       = C:/wsad/eclipse/plugins/
com.ibm.etools.websphere.tools/client.properties
Client Jar File        =
BootstrapHost          = localhost
BootstrapPort          =
Trace enabled          = false
Tracefile              = null
Init only              = false
Classpath Parameter    = C:/wsad/eclipse/workspace/AppClient/bin
Application Parameters =

WSCL0013I: Initializing the J2EE Application Client Environment.WSCL0025I: Binding EJB reference object:
JNDI name: ejb/Hello ==> test/HelloWorld
Description: HelloWorldExample
WSCL0031I: The object was bound successfully.

resourceUrlString= [C:/wsad/eclipse/workspace/AppClient/bin,
C:/wsad/eclipse/workspace/AppClientEJB/bin,
C:/wsad/eclipse/workspace/AppClient/bin]
WSCL0035I: Initialization of the J2EE Application
Client Environment has completed.
WSCL0014I: Invoking the Application Client class ClientApplication
The HelloWorld bean says Hello, Tim!
如果您需要给 WebSphere 的应用程序客户机启动程序传递附加的属性,那么请注意所使用的属性文件:
C:/wsad/eclipse/plugins/com.ibm.etools.websphere.tools/client.properties
。您可以在安装说明中找到该文件,然后添加附加属性。
在 Application Developer 内运行常规 J2EE 客户
或许您已经确定应用程序客户机不是适合您的应用程序的恰当解决方案,您只想要创建连接到 WebSphere 服务器的常规 Java 应用程序。在这种情况下,请注意 WebSphere 要求 Java 应用程序客户机在与服务器相同的 JDK 版本上运行。如果您正在使用不兼容的 JDK 版本,那么当试图连接服务器时,您可能会接收到像下面这样的错误。
java.lang.NoClassDefFoundError: com/ibm/rmi/iiop/GIOPVersionException
为了解决这个问题,在 Java 应用程序中使用同样的 JDK:
选择 Window => Preferences
选择 Java => Installed JREs
单击 New将 WebSphere JRE 添加到 JRE 列表中。WebSphere JRE 位于
eclipse/plugins/com.ibm.etools.server.jdk/bin
中。
鼠标右键单击这个 Java 工程,然后选择 Properties
选择 JRE,然后选择 Use custom JRE for launching
选择您刚添加的服务器 JRE
现在您的 Java 应用程序应该能够连接到 WebSphere,而不会有上面出现的错误。
结束语
J2EE 应用程序客户机为开发者编写连接 EJB bean 的应用程序提供了额外的服务和支持。它允许您的应用程序使用 J2EE 规范提供的
java: JNDI
名称空间和安全功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐