// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= 在 GlassFish Server 上创建和运行应用程序客户端
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: 在 GlassFish Server 上创建和运行应用程序客户端 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, 在 GlassFish Server 上创建和运行应用程序客户端

本教程介绍了如何创建简单的应用程序客户端，以及如何访问部署到 GlassFish Server 3 的 Enterprise JavaBean (EJB)。在本教程中，将首先创建一个包含简单会话 Bean 的企业应用程序以及一个包含该会话 Bean 远程接口的 Java 类库项目。然后，将创建一个应用程序客户端，以通过类库中的远程接口访问会话 Bean。包含远程接口的类库 JAR 将添加到企业应用程序和应用程序客户端的类路径中。

*教程练习*

* <<Exercise_10,创建 Java 类库>>
* <<Exercise_20,创建 EJB 模块>>
* <<Exercise_22,创建会话 Bean>>
* <<Exercise_23,添加业务方法>>
* <<Exercise_24,部署企业应用程序>>
* <<Exercise_30,创建应用程序客户端>>
* <<Exercise_32,添加类库>>
* <<Exercise_30,运行应用程序客户端>>

*要学习本教程，您需要具备以下软件和资源。*

|===
|软件或资源 |要求的版本 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |7.2、7.3、7.4、8.0、Java EE 版本 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java 开发工具包 (JDK)+] |版本 7 或 8 

|GlassFish Server Open Source Edition |3.x、4.x 
|===

*先决条件*

本文档假定您具备以下技术的一些基本知识或编程经验：

* Java 编程
* NetBeans IDE

您可以下载link:https://netbeans.org/projects/samples/downloads/download/Samples/JavaEE/EntAppClientEE6.zip[+已完成项目的 zip 档案文件+]。如果使用的是 GlassFish 3.0，请使用 link:https://netbeans.org/projects/samples/downloads/download/NetBeans%20IDE%206.8/JavaEE/entappclient.zip[+NetBeans IDE 6.8 项目的 zip 档案+]。


== 创建 Java 类库

在本部分中，将创建一个要包含 EJB 远程接口的 Java 类库项目。该远程接口充当 EJB 的 API，供客户端用来与 EJB 通信。

库 JAR 可方便地分发到可能需要调用 EJB 的任何客户端。客户端在需要访问 EJB 时，只需将库 JAR 添加到项目类路径中即可。EJB 实现使用相同的 JAR 来实现该接口。

1. 选择 "File"（文件）> "New Project"（新建项目）（Ctrl-Shift-N 组合键；在 Mac 上为 ⌘-Shift-N 组合键），然后在 "Java" 类别中选择 "Java Class Library"（Java 类库）。单击 "Next"（下一步）。
2. 键入 *EJBRemoteInterface* 作为项目名称。单击 "Finish"（完成）。

image::images/appclient-newclasslibrary.png[title="新建类库项目向导"]

单击 "Finish"（完成），此时 IDE 将创建一个 Java 类库项目。在下一部分中，将创建一个 Java EE 企业应用程序和 EJB 模块。然后，将使用向导在类库项目中创建一个会话 Bean 以及会话 Bean 的远程接口。应用程序客户端将通过类库中的接口访问该会话 Bean。


== 创建 EJB 模块

在本部分中，将创建一个企业应用程序和 EJB 模块。在创建 EJB 时，应将 EJB 作为企业应用程序的一部分进行创建，然后将其作为 EAR 档案打包并部署到服务器中。


=== 创建企业应用程序

在本部分中，将使用新建项目向导创建一个包含 EJB 模块的企业应用程序。该向导提供了一个在创建应用程序时创建 EJB 模块的选项。

1. 选择 "File"（文件）> "New Project"（新建项目），然后在 "Java EE" 类别中选择 "Enterprise Application"（企业应用程序）。单击 "Next"（下一步）。
2. 键入 *EntAppEJB* 作为项目名称。单击 "Next"（下一步）。
3. 选择 GlassFish Server 作为服务器。
4. 确认选择了 "Create EJB Module"（创建 EJB 模块）并取消选择 "Create Web Application Module"（创建 Web 应用程序模块）。单击 "Finish"（完成）。

image::images/appclient-newentappejb.png[title="在新建企业应用程序向导中选中了 "Create EJB Module"（创建 EJB 模块）"]

单击 "Finish"（完成），此时 IDE 将创建一个企业应用程序和 EJB 模块。在 "Projects"（项目）窗口中，您可以看到在企业应用程序项目的 "Java EE Modules"（Java EE 模块）节点下面列出了 EJB 模块项目。

image::images/appclient-projects-entappejb1.png[title="显示已打开项目的 "Projects"（项目）窗口"]

您可以看到，现在 "Projects"（项目）窗口中列出了三种类型的项目：类库、企业应用程序和 EJB 模块。


=== 创建会话 Bean

在本练习中，将使用向导在 EJB 模块项目中创建一个会话 Bean。在该向导中，还将在类库项目中创建会话 Bean 的远程接口。

1. 右键单击 EJB 模块项目，然后选择 "New"（新建）> "Session Bean"（会话 Bean）。
2. 键入 *MySession* 作为 EJB 名称。
3. 键入 *ejb* 作为包名。
4. 选择 "Stateless"（无状态）作为会话类型。
5. 选择 "Create Interface"（创建接口）的 "Remote"（远程）选项。
6. 从下拉列表中选择 *EJBRemoteInterface* 项目。单击 "Finish"（完成）。

image::images/appclient-wizard-newsessionbean.png[title="新建会话 Bean 向导"]

单击 "Finish"（完成），此时 IDE 将在 EJB 模块的  ``ejb``  包中创建会话 Bean，然后在编辑器中打开该类。您可以看到  ``MySession``  实现了  ``MySessionRemote``  接口，并将 EJBRemoteInterface JAR 添加为 EJB 模块的库。

该向导还会在 EJBRemoteInterface 项目的  ``ejb``  包中创建一个名为  ``MySessionRemote``  的远程接口。IDE 自动添加 EJB 接口所需的 Java EE 6 API 库。

image::images/appclient-projects-entappejb2.png[title="显示会话 Bean 和远程接口的 "Projects"（项目）窗口"] 


=== 添加业务方法

在本练习中，将在会话 Bean 中创建一个简单的业务方法以返回字符串。

1. 在 MySession 的编辑器中右键单击，选择 "Insert Code"（插入代码）（Alt-Insert 组合键；在 Mac 上为 Ctrl-I 组合键），然后选择 "Add Business Method"（添加 Business 方法）。
2. 键入 *getResult* 作为方法名，键入 "String"（字符串）作为返回类型。单击 "OK"（确定）。
3. 进行以下更改，以修改  ``getResult``  方法来返回字符串。

该类应如下所示。


[source,java]
----

@Stateless
public class MySession implements MySessionRemote {

    public String getResult() {
        return *"This is My Session Bean"*;
    }
}
----

[start=4]
. 保存所做的更改。

现在，您已创建了一个企业应用程序，其中包含通过远程接口公开的简单 EJB。您还创建了一个独立类库，其中包含可分发给其他开发者的 EJB 接口。如果开发者要与远程接口公开的 EJB 进行通信，并且不需要具有 EJB 源代码，则可以在项目中添加该库。在修改 EJB 的代码时，如果任何接口发生变化，您只需要分发更新的类库的 JAR。

在使用 "Add Business Method"（添加 Business 方法）对话框时，IDE 自动在远程接口中实现该方法。


=== 部署企业应用程序

现在，您可以构建并运行企业应用程序。在运行应用程序时，IDE 会将 EAR 档案部署到服务器中。

1. 右键单击 EntAppEJB 企业应用程序，然后选择 "Deploy"（部署）。

在单击 "Deploy"（部署）后，IDE 将构建企业应用程序，并将 EAR 档案部署到服务器中。如果在 "Files"（文件）窗口中查看，则可以看到 EJBRemoteInterface JAR 是与应用程序一起部署的。

如果在 "Services"（服务）窗口中展开 GlassFish Server 的 "Applications"（应用程序）节点，则可以看到部署了 EntAppEJB。


== 创建应用程序客户端

在本部分中，将创建一个企业应用程序客户端。在创建应用程序客户端时，项目需要将 EJBRemoteInterface Java 类库作为库来引用 EJB。

在运行企业应用程序时，IDE 会在 EAR 档案中将应用程序客户端和 Java 类库 JAR 打包。如果要从应用程序客户端中访问 JAR，则必须在 EAR 中将库 JAR 与应用程序客户端一起打包。


=== 创建企业应用程序

在本练习中，将使用新建项目向导创建应用程序客户端项目。如果要部署到 GlassFish 3.1 或 4.x，则可以将应用程序客户端作为独立项目进行创建和运行。应用程序客户端再也不需要作为企业应用程序的一部分进行部署和运行。

NOTE: 如果要部署到 GlassFish 3.0.1，则需要在企业应用程序项目中将应用程序客户端创建为一个模块并运行企业应用程序。

1. 选择 "File"（文件）> "New Project"（新建项目），然后在 "Java EE" 类别中选择 "Enterprise Application Client"（企业应用程序客户端）。单击 "Next"（下一步）。
2. 键入 *EntAppClient* 作为项目名称。单击 "Next"（下一步）。
3. 选择 GlassFish Server 作为服务器。单击 "Finish"（完成）。

请注意，您不需要将项目添加到企业应用程序中。

image::images/appclient-wizard-newentappclient.png[title="在新建项目向导中选中了 "Create Application Client"（创建应用程序客户端）"]

单击 "Finish"（完成），此时 IDE 将创建应用程序客户端项目，并在编辑器中打开  ``Main.java`` 。


=== 添加类库

现在，需要将包含远程接口的类库添加到项目类路径中，使得应用程序客户端能够引用 EJB。现已打开类库项目，因此，您可以使用 "Call Enterprise Bean"（调用企业 Bean）对话框，以便生成调用 EJB 的代码。

如果类库项目未打开，则可以在 "Projects"（项目）窗口中将类库添加到项目中，方法是：右键单击 "Libraries"（库）节点，然后找到 EJBRemoteInterface 项目的 JAR。

1. 展开 EntAppClient 项目的 "Source Packages"（源包）节点，然后在编辑器中打开  ``Main.java`` 。
2. 在源代码中右键单击，选择 "Insert Code"（插入代码）（Alt-Insert 组合键；在 Mac 上为 Ctrl-I 组合键），然后选择 "Call Enterprise Bean"（调用企业 Bean），以打开 "Call Enterprise Bean"（调用企业 Bean）对话框。
3. 展开 EntAppEJB 项目节点，然后选择 "MySession"。单击 "OK"（确定）。

image::images/appclient-callenterprise.png[title=""Call Enterprise Bean"（调用企业 Bean）对话框"]

该对话框自动选择 "Remote"（远程）作为接口类型。在单击 "OK"（确定）后，IDE 将在  ``Main.java``  中添加以下标注。


[source,java]
----

@EJB
private static MySessionRemote mySession;
----

IDE 还将自动添加 EJBRemoteInterface 作为项目库。


[start=4]
. 修改  ``main``  方法，以便通过 MySessionRemote 接口检索  ``getResult``  方法的字符串。保存所做的更改。

[source,java]
----

public static void main(String[] args) {
        *System.err.println("result = " + mySession.getResult());*
    }
----


== 运行应用程序客户端

现在，您可以通过构建并部署 EntAppClient 项目来运行应用程序客户端。

1. 在 "Projects"（项目）窗口中右键单击 EntAppClient 项目，然后选择 "Run"（运行）。

此外，也可以展开源包并右键单击  ``Main.java``  类，然后选择 "Run File"（运行文件）。

在单击 "Run"（运行）后，IDE 将构建应用程序客户端项目，并将 JAR 档案部署到服务器中。您可以在 "Output"（输出）窗口中看到来自应用程序客户端的消息。

image::images/appclient-buildoutput.png[title=""Output"（输出）窗口中的结果"]

如果要创建其他 EJB，则只需将新的 EJB 远程接口添加到 EJBRemoteInterface 类库项目中即可。

link:/about/contact_form.html?to=3&subject=Feedback:%20Creating%20an%20Application%20Client[+请将您的反馈意见发送给我们+]



== 后续步骤

有关使用 NetBeans IDE 开发 Java EE 应用程序的更多信息，请参见以下资源：

* link:javaee-intro.html[+Java EE 技术简介+]
* link:javaee-gettingstarted.html[+Java EE 应用程序入门指南+]
* link:../../trails/java-ee.html[+Java EE 和 Java Web 学习资源+]

您可以在 link:http://download.oracle.com/javaee/6/tutorial/doc/[+Java EE 6 教程+]中找到有关使用 EJB 企业 Bean 的详细信息。

要发送意见和建议、获得支持以及随时了解 NetBeans IDE Java EE 开发功能的最新开发情况，请link:../../../community/lists/top.html[+加入 nbj2ee 邮件列表+]。

