// 
//     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.
//

= NetBeans IDE 中的 Java EE 技术支持简介
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: NetBeans IDE 中的 Java EE 技术支持简介 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, NetBeans IDE 中的 Java EE 技术支持简介

NetBeans IDE 的开发是在 Java EE 和 Glassfish 团队的密切合作下完成的，它实现了与 Java EE 规范的完美集成，并使您可以最简便的方式在此 IDE 中使用该规范。NetBeans IDE 是您快速学习 Java EE 编程并使用它高效工作的最佳途径。

本文档介绍了 Java EE 规范的主要概念，并说明了这些规范与您目前的编程工作的关系。其中涵盖了以下主题：

image::images/netbeans-stamp-80-74-73.png[title="此页上的内容适用于 NetBeans IDE 7.2、7.3、7.4 和 8.0"]

* <<annotations,标注取代部署描述符>>
* <<ejb,简化的 EJB 软件开发>>
* <<injection,使用依赖关系注入来访问资源>>
* <<persistence,Java 持久性 API 模型>>
* <<webservice,Web 服务>>

您可以在 link:http://download.oracle.com/javaee/7/tutorial/doc/[+Java EE 7 教程+]和 link:http://download.oracle.com/javaee/6/tutorial/doc/[+Java EE 6 教程+]中找到有关开发和部署 Java EE 应用程序的更多信息。


== 标注取代部署描述符

Java EE 平台不需要部署描述符（Servlet 规范所需的部署描述符  ``web.xml``  文件除外），从而简化了部署过程。其他部署描述符（如  ``ejb-jar.xml``  以及在  ``web.xml``  中与 Web 服务相关的条目）已过时。J2EE 1.4 部署描述符通常很复杂，在填充它们时很容易出错。不过，Java EE 平台使用的是“标注”。标注是 Java 修饰符，与您在代码中指定的  ``public``  和  ``private``  类似。例如，EJB 3 规范（Java EE 规范的子集）为 Bean 类型、接口类型、资源引用、事务属性、安全性等定义了标注。JAX-WS 2.0 规范为 Web 服务提供了一组类似的标注。有些标注用来生成工件。另外一些标注用来描述代码。还有一些标注用来提供增强的服务，如安全性或特定于运行时的逻辑。总之，Java EE 平台为以下任务（以及其他任务）提供了标注：

* 定义和使用 Web 服务
* 开发 EJB 软件应用程序
* 将 Java 技术类映射到 XML
* 将 Java 技术类映射到数据库
* 将方法映射到操作
* 指定外部依赖关系
* 指定部署信息，其中包括安全属性

标注标有  ``@``  字符。在 IDE 中，当您创建了使用 Java EE 中的标注的类型时，将在生成的代码中提供相关的占位符。例如，当您使用 IDE 创建无状态会话 Bean 时，将生成以下代码，其中包括  ``@Stateless()``  标注：


[source,java]
----

package mypackage;

import javax.ejb.*;

@Stateless()
public class HelloWorldSessionBean implements mypackage.HelloWorldSessionLocal {

}
----

通过代码完成，您可以对特定于光标下的项的标注属性进行访问。例如，在  ``@WebService()``  标注的括号中按 Ctrl-空格组合键时，将显示以下内容：

image::images/jax-ws-annotate.png[]

每个属性都具有默认值。因此，除非您需要使用默认值以外的其他值，否则不必指定任何属性。在简单的示例中，使用默认值就可以了，这意味着您根本不需要提供属性。


== 简化的 EJB 软件开发

使用新的 EJB 3.0 API，可以简化开发者需要完成的工作并减少其工作量，从而让软件开发变得更轻松。换句话说，减少了使用的类和代码。之所以能够简化软件开发工作，是因为现在容器承担了更多的工作。下面是 EJB 3 的一些功能和优点：

* *很少需要类和接口*。由于容器现在负责公开所需的方法，您不再需要为 EJB 组件使用主接口和对象接口。您只需提供业务接口。您可以使用标注来声明 EJB 组件，并且通过容器来管理事务。
* *不再使用部署描述符*。您可以直接在类中使用标注来向容器指示以前在部署描述符中定义的依赖关系和配置。如果没有任何特殊说明，容器将使用默认规则来处理最常见的情况。
* *查找十分简单*。使用 `EJBContext` 可以直接在类中查找 JNDI 名称空间内的对象。
* *简化了对象关系映射*。通过新型 Java 持久性 API，您可以使用 POJO 中的标注将 Java 对象映射到关系数据库，从而使对象关系映射更加简单且透明。

在 IDE 中，您可以对企业 Bean 进行编码，就像对其他 Java 类进行编码一样，只需使用代码完成和编辑器提示来实现正确的方法并使类与其接口保持同步即可。您不需要使用特殊命令和对话框即可生成业务方法或 Web 服务操作等内容，但这些命令仍可帮助您熟悉 Java EE 代码语法。


== 使用依赖关系注入来访问资源

通过_依赖关系注入_，对象可以使用标注直接请求外部资源。这会使代码更为简洁，因为您不再需要将自己的代码与资源创建和查找代码混杂在一起。您可以在 EJB 组件、Web 容器和客户端中使用资源注入。

要请求资源注入，组件需要使用 `@Resource` 标注或针对一些专用资源的 `@EJB` 和 `@WebServiceRef` 标注。可以注入的资源如下：

* `SessionContext` 对象
* `DataSources` 对象
* `EntityManager` 接口
* 其他企业 Bean
* Web 服务
* 消息队列和主题
* 资源适配器的连接工厂

在 IDE 中，源代码编辑器为 Java EE 平台提供的资源注入标注提供了完整的代码完成。此外，当您运行诸如 "Call EJB"（调用 EJB）和 "Use Database"（使用数据库）之类的命令时，IDE 会自动将资源注入到文件中。


== Java 持久性 API 模型

Java EE 平台引入了 Java 持久性 API，后者是作为 link:http://jcp.org/en/jsr/detail?id=220[+JSR-220+] 的一部分开发的。Java 持久性 API 不但可以在 EJB 组件外部使用（例如，在 Web 应用程序和应用程序客户端中使用），而且还可以在 Java EE 平台之外的 Java SE 应用程序中使用。

Java 持久性 API 具有以下主要功能：

* *实体为 POJO*。与使用容器管理的持久性 (CMP) 的 EJB 组件不同，使用新 API 的实体对象不再是组件，并且不再需要包含在 EJB 模块中。
* *使对象关系映射标准化*。新规范标准化了处理对象关系映射的方式，使开发者不必再了解供应商特定的策略。Java 持久性 API 使用标注来指定对象关系映射信息，但仍支持 XML 描述符。
* *命名查询*。命名查询现在是以元数据表示的静态查询。查询可以是 Java 持久性 API 查询，也可以是本机查询。这样会使重用查询变得非常简单。
* *简单打包规则*。由于实体 Bean 是简单的 Java 技术类，因此它们几乎可打包到 Java EE 应用程序中的任意位置。例如，实体 Bean 可以是 EJB `JAR`、应用程序客户端 `JAR`、`WEB-INF/lib`、`WEB-INF/classes` 的一部分，甚至可以是企业应用程序档案 (EAR) 文件中实用程序 `JAR` 的一部分。通过这些简单的打包规则，您在使用来自 Web 应用程序或应用程序客户端的实体 Bean 时，将不再需要创建 EAR 文件。
* *分离的实体*。由于实体 Bean 为 POJO，因此它们可串行化，然后通过网络发送到其他地址空间并在不感知持久性的环境中使用。这样，您就不再需要使用数据传输对象 (DTO) 了。
* *EntityManager API*。应用程序程序员现在使用标准 EntityManager API 执行涉及到实体的`创建、读取、更新和删除` (CRUD) 操作。

IDE 提供了一些使用新 Java 持久性 API 的工具。您可以通过数据库自动生成实体类，也可以手动对实体类进行编码。IDE 还提供了用于创建和维护持久性单元的模板和图形编辑器。有关使用 Java 持久性 API 的详细信息，请参见 link:javaee-gettingstarted.html[+Java EE 应用程序入门指南+]。


== Web 服务

在 Java EE 平台中，通过使用标注显著改进和简化了 Web 服务支持。以下规范已应用于此领域中：JSR 224，Java API for XML-Based Web Services (JAX-WS) 2.0；JSR 222，Java Architecture for XML Binding (JAXB) 2.0 以及 JSR 181，Web Services Metadata for the Java Platform。


=== JAX-WS 2.0

JAX-WS 2.0 是 Java EE 平台中用于 Web 服务的新 API。作为 JAX-RPC 1.1 的后续版本，JAX-WS 2.0 保留了原有的 RPC 编程模型，同时在以下几方面进行了改进：数据绑定、协议和传输的独立性、对 Web 服务的 `REST` 样式的支持以及易开发性。

与 JAX-RPC 1.1 之间的主要区别在于：所有数据绑定现在均已委托给 JAXB 2.0。这使基于 JAX-WS 的 Web 服务可以完全使用 XML 方案，从而提高了互操作性和简单易用性。这两种技术已很好地集成在一起了，因此用户不必再为使用两套不同的工具而勉为其难了。从 Java 技术类开始开发时，JAXB 2.0 可以生成自动嵌入到 Web 服务描述语言 (WSDL) 文档内的 XML 方案文档，从而使用户无需手动执行这一容易出错的集成过程。

JAX-WS 2.0 可以为 SOAP 1.1、SOAP 1.2 和 XML/HTTP 协议提供现成的支持。协议可扩展性从一开始就是人们所希望实现的目标，JAX-WS 2.0 允许供应商支持其他协议和编码来获取更佳的性能（例如 FAST Infoset）或专用的应用程序。Web 服务（使用附件来优化大型二进制数据的发送和接收）可以利用 W3C 制订的 MTOM/XOP（“消息传输优化机制/XML 二进制优化打包”的简称）标准，且对编程模型没有任何不利的影响。（有关 link:http://www.w3.org/TR/2005/REC-soap12-mtom-20050125/[+MTOM/XOP+] 的信息，请查看此页。）在 Java EE 技术出现之前，定义 Web 服务需要使用长且复杂的描述符。现在，定义它却非常简单，只需将 `@WebService` 标注放置在 Java 技术类上即可。类上的所有公共方法会自动发布为 Web 服务操作，并且其所有参数都将使用 JAXB 2.0 映射到 XML 方案数据类型。


=== 异步 Web 服务

由于 Web 服务调用是通过网络来实现的，因此这种调用所花费的时间是无法预测的。由于必须等待服务器的响应，许多客户端（特别是交互式客户端，如基于 JFC/Swing 的桌面应用程序）的性能严重受损。为了避免出现这种性能降低的情况，JAX-WS 2.0 提供了新的异步客户端 API。使用此 API，应用程序编程人员将不再需要自己创建线程。只需通过 JAX-WS 运行时为其管理长时间运行的远程调用即可。

异步方法可以与 WSDL 生成的任何接口以及动态性更强的 `Dispatch` API 联合使用。为了方便起见，在导入 WSDL 文档时，您可以要求为 Web 服务定义的任何操作生成异步方法。

下面提供了两种使用模型：

* 在轮询模型中，发出调用。准备就绪后，请求结果。
* 在回调模型中，注册处理程序。在响应到达后，立即向您发出通知。

请注意，异步调用支持是在客户端上完全实现的，因此不需要对目标 Web 服务进行任何更改。

IDE 提供了一些处理 JAX-WS 的工具。您可以使用“新建文件”向导中的模板生成 JAX-WS 工件。可以通过 Web 服务定制编辑器创建异步 Web 服务。代码完成功能包括可在 Web 服务中使用的标注。


link:/about/contact_form.html?to=3&subject=Feedback:%20Intro%20to%20Java%20EE%205%20Technology[+发送有关此教程的反馈意见+]



== 后续步骤

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

* link:javaee-gettingstarted.html[+Java EE 应用程序入门指南+]
* link:../websvc/jax-ws.html[+JAX-WS Web 服务入门指南+]
* link:../../trails/java-ee.html[+Java EE 和 Java Web 学习资源+]

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

