使用 NetBeans IDE 4.1 创建 J2EE 应用程序客户端
John Jullion-Ceccarelli 和 Petr Blaha
由于资源限制,NetBeans IDE 4.1 没有包含对企业应用程序中应用程序客户端的自动支持。该功能将在即将到来的版本中得到支持。若要将常规的 Java 应用程序项目用作 J2EE 应用程序客户端,必须手动创建并配置一些部署描述符,然后将一些 JAR 文件添加到类路径。
第一个要问的问题是,为什么首先要使用完全成熟的 J2EE 应用程序客户端。毕竟,任何 Java 应用程序可以通过其远程接口来访问任何 EJB 模块。在企业应用程序中注册应用程序客户端的主要原因是,这样做让应用程序可以访问运行在企业应用程序服务器上的服务和功能。
这些功能中最普通的就是安全性。如果应用程序客户端访问受安全方法保护的方法,则必须在企业应用程序中注册应用程序客户端,并声明它是适当安全角色的一部分。
在本例中,我们将为来自 Building Secure Enterprise Beans in NetBeans IDE 的企业应用程序创建应用程序客户端。您可以在这里下载已完成的企业应用程序项目。
入门
开始之前,必须在计算机上安装 Sun Java System (SJS) Application Server Platform Edition 8.1(下载)。您无法将企业应用程序部署到绑定的 Tomcat 服务器。还必须在 IDE 中注册应用程序服务器,通过选择 Tools > Server Manager。
在应用程序服务器上配置用户和组
在我们的示例中,仅 bank_users 的用户可以访问我们的企业 bean。我们将在 SJS Application 服务器上的 file 安全领域中创建 bank_users 组的用户。
- 在 Runtime 窗口双击应用程序服务器节点启动它,然后选择 Start/Stop Server。
- 右键单击应用服务器节点,然后选择 Show Admin Console。登录到管理控制台,然后在左导航栏中选择 Configuration > Security > Realms > file。
- 在管理控制台的中间框架中单击 Manage Users 按钮。在 Current Users 下,单击 New 按钮。
- 键入 manager 作为 User ID,password 作为 Password,bank_users 作为 Group List。然后单击 OK。

-
下载完整的企业应用程序,然后将其解压缩到您的计算机上。
- 按 Ctrl-Shift-O 打开 Secure 项目。请确认已选中 Open Required Projects 复选框。IDE 应打开三个项目:
- Secure
- Secure-EJBModule
- Secure-WebModule
- 右键单击 Secure 项目,然后选择 Run Project。IDE 将构建并部署该项目,然后在外部浏览器打开 AccountState servlet。
- 在对话框中输入用户名 (manager) 和密码 (password),然后单击 OK。servlet 应返回以下输出:
In account manager is 250$
编写应用程序客户端代码
我们企业应用程序包括一个简单的会话 bean 和尝试访问它的 web 客户端。应用程序客户端仅尝试调用 getStatus 方法,并向它发送用户名 somename。
设置应用程序客户端项目
- 选择 File > New Project (Ctrl-Shift-N),然后从 General 类别中选择 Java Application 模板。单击 Next。
- 将应用程序命名为 SecureClient 并指定该项目的位置。保留其他设置为默认值,然后单击 Finish。IDE 将创建项目,并在 Source Editor 中打开 secureclient.Main.java。
- 右键单击 SecureClient 项目的 Libraries 节点,然后选择 Add JAR/Folder 将以下内容添加到类路径:
- 应用程序服务器的 lib 目录中的 j2ee.jar 文件
- Secure-EJBModule 项目的 dist/jar 目录
编写应用程序客户端代码
Call Enterprise Bean 命令不能用于通用 Java 应用程序项目,因此您必须自己输入获得企业 bean 的远程接口参考的代码。
- 在 Main.java 中,将以下粗体表示的代码添加到 main 方法中:
...
public static void main(String[] args) throws Exception {
// TODO code application logic here
Context ctx = new InitialContext();
Object objRef = ctx.lookup("java:comp/env/ejb/AccountStatusBean");
AccountStatusRemote account =
((AccountStatusRemoteHome)PortableRemoteObject.narrow(objRef,
AccountStatusRemoteHome.class)).create();
System.out.println(account.getStatus("somename"));
}
...
- 按下 Alt-Shift-F 生成任何所需的 import 语句。
配置部署描述符和构建脚本
需要执行一些步骤来设置项目:
- 创建应用程序客户端部署描述符。
- 编辑企业应用程序的部署描述符,以添加应用程序客户端。
- 将应用程序客户端 JAR 文件包含在企业应用程序中。
- 修改构建脚本,将部署描述符包含在应用程序客户端 JAR 文件中。
- 修改构建脚本,以运行应用程序客户端。
创建应用程序客户端部署描述符
- 在 SecureClient/src 文件夹中创建名为 conf 的文件夹。
- 在 SecureClient/src/conf 文件夹中创建名为 application-client.xml 的文件夹。(如果使用 New XML 向导创建文件,则使用 Well-Formed XML Document 选项。)
- 将 application-client.xml 的主体更改为:
<?xml version="1.0" encoding="UTF-8"?>
<application-client version="1.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/application-client_1_4.xsd">
<display-name>SecureClient</display-name>
<ejb-ref>
<ejb-ref-name>ejb/AccountStatusBean</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>ejb.AccountStatusRemoteHome</home>
<remote>ejb.AccountStatusRemote</remote>
</ejb-ref>
</application-client>
该代码仅设置了模块的显示名称,并注册 AccountStatusBean 的 EJB 参考。
- 在 SecureClient/src/conf 文件夹中,创建名为 sun-application-client.xml 的 XML 文件。
- 将 sun-application-client.xml 的主体更改为:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-application-client
PUBLIC '-//Sun Microsystems, Inc.//DTD Application Server 8.1 Application Client 1.4//EN'
'http://www.sun.com/software/appserver/dtds/sun-application-client_1_4-1.dtd'>
<sun-application-client>
<ejb-ref>
<ejb-ref-name>ejb/AccountStatusBean</ejb-ref-name>
<jndi-name>ejb/AccountStatusBean</jndi-name>
</ejb-ref>
</sun-application-client>
该代码仅将 EJB 参考(JNDI 名称为 ejb/AccountStatusBean)映射到应用程序服务器上的实际 bean。
- 保存文件。
配置企业应用程序部署描述符
- 在 Projects 窗口中,展开 Secure 项目的 Configuration Files 节点,右键单击 application.xml,然后选择 Edit。
- 将以下粗体表示的代码添加到根 application 元素:
...
</module>
<module>
<java>SecureClient.jar</java>
</module>
<security-role>
...
- 保存文件。
在企业应用程序中打包应用程序客户端 JAR 文件
- 右键单击 Secure 项目节点,然后选择 Properties。
- 在对话框的左窗格中选择 Build > Packaging。
- 在 Additional Content to Include 中,单击 Add Project 并将添加 SecureClient 项目的项目目录。
配置构建脚本
现在必须对构建脚本做些修改来打包部署描述符,然后作为 J2EE 应用程序客户端运行。
- 在 Files 窗口中,展开 SecureClient 节点,然后双击 build.xml。
- 将以下目标添加到 build.xml:
<!--
Makes sure the IDE can find the Application Server install directory
and sets the appclient executable name depending on platform
-->
<target name="-pre-init">
<fail unless="com.sun.aas.installRoot">
J2EE home property - neither j2ee.home nor com.sun.aas.installRoot(NetBeans) is set.
</fail>
<property name="j2ee.home" value="${com.sun.aas.installRoot}" />
<condition property="appclient.name" value="appclient">
<and>
<os family="unix"/>
<os family="Linux"/>
</and>
</condition>
<condition property="appclient.name" value="appclient.bat">
<and>
<os family="Windows"/>
</and>
</condition>
<condition property="package-appclient.name" value="package-appclient">
<and>
<os family="unix"/>
<os family="Linux"/>
</and>
</condition>
<condition property="package-appclient.name" value="package-appclient.bat">
<and>
<os family="Windows"/>
</and>
</condition>
</target>
<!--
Target that copies J2EE app client deployment descriptors to jar
-->
<target name="-pre-jar">
<!-- copy EJB interfaces -->
<copy todir="${build.classes.dir}">
<fileset dir="${file.reference.build-jar}">
<include name="**/*.class"/>
</fileset>
</copy>
<!-- copy configuration files -->
<mkdir dir="${build.classes.dir}/META-INF" />
<copy todir="${build.classes.dir}/META-INF">
<fileset dir="${src.dir}/conf">
<include name="*.xml"/>
</fileset>
</copy>
</target>
<target name="run" depends="init,compile">
<exec executable="${j2ee.home}/bin/${appclient.name}">
<arg line="-client ${dist.jar}"/>
</exec>
</target>
<target name="package-appclient" depends="init">
<exec executable="${j2ee.home}/bin/${package-appclient.name}" dir="${dist.dir}"/>
</target>
- 保存文件。
运行应用程序
- 清理并构建 Secure 企业应用程序,然后将其部署到应用程序服务器。
- 右键单击 SecureClient 项目节点,然后选择 Run project。
- 在对话框中输入用户名 (manager) 和密码 (password),然后单击 OK。Output 窗口应显示以下输出:
In account somename is 250