| // |
| // 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. |
| // |
| |
| = 使用 Maven 创建企业应用程序 |
| :jbake-type: tutorial |
| :jbake-tags: tutorials |
| :jbake-status: published |
| :icons: font |
| :syntax: true |
| :source-highlighter: pygments |
| :toc: left |
| :toc-title: |
| :description: 使用 Maven 创建企业应用程序 - Apache NetBeans |
| :keywords: Apache NetBeans, Tutorials, 使用 Maven 创建企业应用程序 |
| |
| 本教程说明了如何使用 NetBeans IDE 和 Maven 原型创建简单的企业应用程序。本教程还提供了一些有关使用 IDE 创建和构建 Maven 应用程序的说明和提示。 |
| |
| 在本教程中,将创建一个企业应用程序,该应用程序将打包为 EAR 档案并部署到 GlassFish Server Open Source Edition 3。在新建项目向导中,将使用 Maven 企业应用程序原型创建应用程序。该应用程序包含一个 EJB 项目,其中包含实体的持久性实体类、消息驱动 Bean 和会话 Bean Facade。该应用程序还包含一个 Web 项目,其中包含两个 Servlet。 |
| |
| *教程练习* |
| |
| * <<intro,在 IDE 中使用 Maven>> |
| * <<Exercise_1,创建 Maven 企业应用程序项目>> |
| * <<Exercise_2,对 EJB 模块进行编码>> |
| * <<Exercise_2a,创建持久性单元>> |
| * <<Exercise_2b,创建实体类>> |
| * <<Exercise_2c,创建消息驱动 Bean>> |
| * <<Exercise_2d,创建会话 Facade>> |
| * <<Exercise_3,对 Web 模块进行编码>> |
| * <<Exercise_3a,创建 ListNews Servlet>> |
| * <<Exercise_3b,创建 PostMessage Servlet>> |
| * <<Exercise_4,使用 Maven 构建应用程序>> |
| * <<Exercise_4a,处理项目依赖关系>> |
| * <<Exercise_4b,使用依赖关系构建>> |
| * <<Exercise_5,部署并运行应用程序>> |
| * <<Exercise_5a,从 IDE 中部署>> |
| * <<Exercise_5b,从 GlassFish Server 管理控制台中部署>> |
| * <<Exercise_7,下载解决方案项目>> |
| |
| *要学习本教程,您需要具备以下软件和资源。* |
| |
| |=== |
| |软件或资源 |要求的版本 |
| |
| |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 |4.x |
| |=== |
| |
| *先决条件* |
| |
| 本文档假定您具备以下技术的一些基本知识或编程经验: |
| |
| * Java 编程 |
| * NetBeans IDE |
| |
| 在开始本教程之前,您可以先阅读下面这些文档。 |
| |
| * link:http://wiki.netbeans.org/MavenBestPractices[+NetBeans IDE 中的 Apache Maven 最佳做法+] |
| * link:http://books.sonatype.com/mvnref-book/reference/introduction.html[+Chapter 1. Introducing Apache Maven+](第 1 章. Apache Maven 简介,来自 link:http://books.sonatype.com/mvnref-book/reference/index.html[+Maven: The Complete Reference+](Maven:完整参考)) |
| |
| 您可以下载link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FMavenEnterpriseApp.zip[+已完成项目的 zip 档案文件+]。 |
| |
| |
| == 在 IDE 中使用 Maven |
| |
| NetBeans IDE 中完全集成了 Maven 支持。开发使用 Maven 框架的项目几乎与在 Ant 中开发项目完全相同。不过,Maven 构建项目和使用依赖关系的方式有一些区别。如果是第一次创建 Maven 应用程序,以下提示可帮助您避免某些问题。 |
| |
| *检查 Maven 设置* |
| |
| 如果这是您首次创建 Maven 项目,则需要在 "Options"(选项)窗口中检查 Maven 配置设置。Maven 与 IDE 捆绑在一起,并随同 IDE 一起安装。 |
| |
| 1. 在 IDE 中打开“选项”窗口(“工具”>“选项”;在 Mac 上为 "NetBeans" >“首选项”)。 |
| 2. 在“选项”窗口中选择 "Java" 类别,然后单击 "Maven" 标签。 |
| |
| 您可以使用与 IDE 捆绑在一起的 Maven 版本,也可以指定 Maven 在本地的安装位置(要求为 2.0.9 或更高版本)。 |
| |
| |
| |
| . 选择 "OK"(确定)以关闭 "Options"(选项)窗口。 |
| |
| NOTE: 在 IDE 中启用 Java 后,会自动启用 Maven 支持。您将需要启用 Java EE 插件(如果尚未启用)。 |
| |
| *更新 Maven 资源库* |
| |
| 本地和远程 Maven 资源库可用于代码完成以及构建项目。应更新 Maven 远程资源库索引,以确保在开发项目时可方便地使用所需的任何工件。可以在 "Options"(选项)窗口的 "Maven" 标签中配置 IDE 检查更新的频率。您可以执行即时更新检查,并在“服务”窗口中浏览本地和远程 Maven 资源库。 |
| |
| 1. 选择“窗口”>“服务”以打开“服务”窗口。 |
| 2. 在“服务”窗口中展开“Maven 资源库”节点。 |
| 3. 展开资源库节点以查看工件。 |
| 4. 右键单击资源库节点并在弹出式菜单中选择“更新索引”。 |
| |
| 在单击 "Update Indexes"(更新索引)时,IDE 将检查并下载每个 Maven 远程资源库的最新索引。索引表示位于资源库中的工件的当前状态,并用于提供对可用于应用程序的工件的引用。默认情况下,在明确需要工件之前,IDE 不会从资源库中下载该工件。 |
| |
| 在 "Services"(服务)窗口中右键单击 "Maven Repositories"(Maven 资源库)并选择 "Find"(查找)可搜索工件。 |
| |
| [NOTE] |
| ==== |
| * 索引非常大,因此可能需要一些时间才能全部更新。 |
| * 如果您使用的是 NetBeans IDE 7.1 或更早版本,您将需要选择 "Window"(窗口)> "Other"(其他)> "Maven Repository Browser"(Maven 资源库浏览器),并在 "Maven Repository Browser"(Maven 资源库浏览器)窗口顶部单击 "Update Indexes"(更新索引)(image:images/maven-refreshrepo.png[title=""Update Indexes"(更新索引)按钮"])。 |
| ==== |
| |
| 有关在 NetBeans IDE 中使用 Maven 的更多详细信息,请参见link:https://netbeans.org/kb/docs/java/maven-hib-java-se.html[+使用 Hibernate 创建 Maven Swing 应用程序+]教程中的link:https://netbeans.org/kb/docs/java/maven-hib-java-se.html#02[+配置 Maven+] 部分以及 link:http://wiki.netbeans.org/MavenBestPractices[+NetBeans IDE 中的 Apache Maven 最佳做法+]。 |
| |
| |
| == 创建 Maven 企业应用程序项目 |
| |
| 本练习的目标是使用与 IDE 捆绑在一起的 Maven 企业应用程序原型创建企业应用程序项目。该企业应用程序原型还会创建 EJB 项目和 Web 应用程序项目。 |
| |
| IDE 在新建项目向导中包含几个 Maven 原型,以帮助您快速创建常见类型的 NetBeans 项目,如企业应用程序项目 (EAR)、Web 应用程序项目 (WAR) 和 EJB 模块项目 (JAR)。该向导还允许使用注册的远程资源库中的原型创建项目。 |
| |
| 1. 从主菜单中选择 "File"(文件)> "New Project"(新建项目)(Ctrl-Shift-N 组合键;在 Mac 上为 ⌘-Shift-N 组合键)。 |
| 2. 从 "Maven" 类别中选择 "Enterprise Application"(企业应用程序)。单击 "Next"(下一步)。 |
| |
| image::images/maven-newproject1.png[title="新建项目向导中的 "Maven Enterprise Application"(Maven 企业应用程序)项目类型"] |
| |
| |
| |
| . 键入 *MavenEnterpriseApp* 作为项目名称并设置项目位置。 |
| |
| |
| . (可选)修改工件详细信息。单击 "Next"(下一步)。 |
| |
| image::images/maven-newproject2.png[title="新建项目向导中的 "Maven Project"(Maven 项目)详细信息"] |
| |
| |
| |
| . 选择 GlassFish Server 作为服务器。 |
| |
| |
| . 将 "Java EE Version"(Java EE 版本)设置为 "Java EE 6" 或 "Java EE 7"。 |
| |
| |
| . 选中 "Create EJB Module"(创建 EJB 模块)和 "Create Web App Module"(创建 Web 应用程序模块)。单击 "Finish"(完成)。 |
| |
| 单击 "Finish"(完成),此时 IDE 将使用 Maven 企业应用程序原型创建以下项目。 |
| |
| * *EJB*。(MavenEnterpriseApp-ejb) EJB 项目通常包含应用程序业务逻辑的源代码。EJB 项目将打包为 EJB JAR 档案。 |
| * *Web 应用程序*。(MavenEnterpriseApp-web) Web 应用程序项目通常包含应用程序的表示层,例如 JSF 和 JSP 页以及 Servlet。Web 应用程序项目可能还包含业务逻辑源代码。Web 应用程序项目将打包为 WAR 档案。 |
| * *汇编*。(MavenEnterpriseApp) 汇编项目用于汇编 EJB 和 WAR 档案中的 EAR 档案。Assembly 项目不包含任何源代码。 |
| * *企业应用程序*。(MavenEnterpriseApp-ear) 企业应用程序项目不包含任何源代码。企业应用程序仅包含 POM 文件 ( ``pom.xml`` ) 以及企业应用程序中包含的模块的详细信息。 |
| |
| image::images/maven-projectswindow2.png[title="显示已生成项目的 "Projects"(项目)窗口"] |
| |
| 在创建企业应用程序项目后,如果有任何依赖关系不可用,则将标记该企业应用程序项目。如果展开 MavenEnterpriseApp-ear 项目的 "Dependencies"(依赖关系)节点,则可以看到是否缺少任何所需的库或所需的库不在类路径中。企业应用程序项目依赖于在编译 EJB 项目和 Web 项目后打包和提供的 JAR 和 WAR。您可以看到, ``MavenEnterpriseApp-ejb`` 和 ``MavenEnterpriseApp-web`` 作为依赖关系列出。 |
| |
| 在某些情况下,您会在状态栏中看到 "Maven" 图标,您可以单击该图标以运行初期构建,并解决缺少依赖关系的问题。 |
| |
| image::images/priming-build.png[title="使用状态栏中的 Maven 图标可以运行初期构建"] |
| |
| |
| == 对 EJB 项目进行编码 |
| |
| EJB 项目包含应用程序的业务逻辑。在此应用程序中,GlassFish 容器将使用 Java 事务 API (JTA) 管理事务。在本教程中,将在 EJB 项目中创建一个实体类及其消息驱动 Bean 和会话 Facade。 |
| |
| |
| === 创建持久性单元 |
| |
| 在本练习中,将在 EJB 项目中创建一个持久性单元。持久性单元指定数据库连接详细信息以及如何管理事务。对于此应用程序,将在新建持久性单元向导中指定 JTA,因为您希望由 GlassFish Server 管理事务。 |
| |
| 要创建持久性单元,请执行以下步骤。 |
| |
| 1. 右键单击 EJB 项目节点,然后从弹出式菜单中选择 "New"(新建)> "Other"(其他)打开新建文件向导。 |
| 2. 从 "Persistence"(持久性)类别中选择 "Persistence Unit"(持久性单元)。单击 "Next"(下一步)。 |
| 3. 在 "New Persistence Unit"(新建持久性单元)对话框中,选择 EclipseLink 作为持久性提供器。 |
| 4. 选择数据源(例如,如果要使用 JavaDB,则选择 ``jdbc/sample`` )。 |
| |
| 在安装 IDE 和 GlassFish Server 时, ``jdbc/sample`` 的数据源将与 IDE 资源包捆绑在一起;但如果要使用不同的数据库,则可以指定不同的数据源。 |
| |
| 您可以保留其他默认选项(持久性单元名称、EclipseLink 持久性提供器)。 |
| |
| |
| |
| . 确保选中 "Use Java Transaction APIs"(使用 Java 事务 API),并且将 "Table Generation Strategy"(表生成策略)设置为 "Create"(创建),以便在部署应用程序时创建基于实体类的表。单击 "Finish"(完成)。 |
| |
| image::images/maven-persistenceunit.png[title="新建持久性单元向导"] |
| |
| 单击 "Finish"(完成),此时 IDE 将创建 XML 文件 ``persistence.xml`` 并在编辑器中打开该文件。在 "Projects"(项目)窗口中,您可以看到在 ``"Other Sources"(其他源)> "src/main/resources" > "META-INF"`` 目录中创建了该文件。该文件包含连接到数据库以及如何管理事务的详细信息。如果在编辑器中单击 "Source"(源)标签,则可以查看与持久性单元相关的以下详细信息。 |
| |
| |
| [source,xml] |
| ---- |
| |
| ... |
| <persistence-unit name="com.mycompany_MavenEnterpriseApp-ejb_ejb_1.0-SNAPSHOTPU" transaction-type="JTA"> |
| <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> |
| <jta-data-source>jdbc/sample</jta-data-source> |
| <exclude-unlisted-classes>false</exclude-unlisted-classes> |
| <properties> |
| <property name="eclipselink.ddl-generation" value="create-tables"/> |
| </properties> |
| </persistence-unit> |
| |
| ---- |
| |
| 您可以看到将 ``JTA`` 指定为事务类型,并且应用程序使用注册的数据源 ``jdbc/sample`` 。 |
| |
| |
| === 创建实体类 |
| |
| 在本练习中,将在 EJB 项目中创建一个实体类以表示永久保存到数据库中的对象。要创建 NewsEntity 实体类,请执行以下步骤。 |
| |
| 1. 右键单击 "Projects"(项目)窗口中的 EJB 模块,然后选择 "New"(新建)> "Other"(其他)打开新建文件向导。 |
| 2. 从 "Persistence"(持久性)类别中,选择 "Entity Class"(实体类)。单击 "Next"(下一步)。 |
| 3. 键入 *NewsEntity* 作为类名。 |
| 4. 键入 *ejb* 作为包名,并将 "Primary Key Type"(主键类型)保留为 Long。单击 "Finish"(完成)。 |
| |
| 单击 "Finish"(完成),此时将在源代码编辑器中打开实体类 ``NewsEntity.java`` 。在源代码编辑器中,执行以下步骤以添加一些字段。 |
| |
| 1. 将以下字段声明添加到类中。 |
| |
| [source,java] |
| ---- |
| |
| private String title; |
| private String body; |
| ---- |
| |
| |
| . 在源代码编辑器的类定义之间右键单击,然后选择 "Insert Code"(插入代码)(Alt-Insert 组合键;在 Mac 上为 Ctrl-I 组合键)> "Getter and Setter"(Getter 和 Setter)。 |
| |
| |
| . 在 "Generate Getters and Setters"(生成 Getter 和 Setter)对话框中,选择 ``body`` 和 ``title`` 字段。单击 "Generate"(生成)。 |
| |
| |
| . 保存对该类所做的更改。 |
| |
| |
| === 创建消息驱动 Bean |
| |
| 在本练习中,将在 EJB 项目中创建一个消息驱动 Bean。消息驱动 Bean 是一个可异步交换消息的企业 Bean。NewsApp 应用程序使用消息驱动 Bean 接收并处理 Web 模块中的 Servlet 发送到队列的消息。 |
| |
| 要在应用程序中使用消息驱动 Bean,需要在服务器中注册该 Bean 使用的连接器资源。在部署到 GlassFish Server 时,您可以直接通过管理控制台在服务器上创建资源,也可以在部署时在 ``glassfish-resources.xml`` 描述符文件中指定详细信息以创建资源。将应用程序部署到服务器时,服务器将根据描述符文件注册资源。在 IDE 中使用新建文件向导创建消息驱动 Bean 时,IDE 将在描述符文件中为您生成元素。 |
| |
| 对于 Maven 项目, ``glassfish-resources.xml`` 文件位于 "Files"(文件)窗口的项目节点下方的 ``src/main/setup`` 目录中。 |
| |
| 1. 右键单击 "Projects"(项目)窗口中的 EJB 模块,然后选择 "New"(新建)> "Other"(其他)打开新建文件向导。 |
| 2. 从 "Enterprise JavaBeans" 类别中,选择 "Message-Driven Bean"(消息驱动 Bean)。单击 "Next"(下一步)。 |
| 3. 键入 *NewMessage* 作为 EJB 名称。 |
| 4. 从 "Package"(包)下拉列表中选择 *ejb*。 |
| 5. 单击 "Project Destination"(项目目标)字段旁边的 "Add"(添加)按钮,以打开 "Add Message Destination"(添加消息目标)对话框。 |
| 6. 在 "Add Message Destination"(添加消息目标)对话框中,键入 *jms/NewMessage* 并选择 "Queue"(队列)作为目标类型。单击 "OK"(确定)。 |
| |
| image::images/maven-messagedestination.png[title=""Add Message Destination"(添加消息目标)对话框"] |
| |
| |
| |
| . 确认项目目标正确无误。单击 "Next"(下一步)。 |
| |
| image::images/maven-newmdb.png[title="新建消息驱动 Bean 向导"] |
| |
| |
| |
| . 接受 "Activation Config Properties"(激活配置属性)中的默认设置。单击 "Finish"(完成)。 |
| |
| 单击 "Finish"(完成),此时 IDE 将生成 Bean 类,并添加以下标注(将该类标识为消息驱动 Bean)和配置属性。 |
| |
| |
| [source,java] |
| ---- |
| |
| @MessageDriven(mappedName = "jms/NewMessage", activationConfig = { |
| @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), |
| @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") |
| }) |
| public class NewMessage implements MessageListener { |
| |
| public NewMessage() { |
| } |
| |
| @Override |
| public void onMessage(Message message) { |
| } |
| } |
| ---- |
| |
| |
| . 在类中添加以下带标注的字段,以将 ``MessageDrivenContext`` 资源注入到类中。 |
| |
| [source,java] |
| ---- |
| |
| public class NewMessage implements MessageListener { |
| |
| *@Resource |
| private MessageDrivenContext mdc;* |
| |
| ---- |
| |
| |
| . 添加以下带标注的字段(以粗体显示),以将实体管理器引入到类中。 |
| |
| [source,java] |
| ---- |
| |
| public class NewMessage implements MessageListener { |
| |
| @Resource |
| private MessageDrivenContext mdc; |
| *@PersistenceContext(unitName="com.mycompany_MavenEnterpriseApp-ejb_ejb_1.0-SNAPSHOTPU") |
| private EntityManager em;* |
| |
| ---- |
| |
| ``@PersistenceContext`` 标注通过声明持久性单元来指定上下文。 ``unitName`` 值是持久性单元的名称。 |
| |
| |
| |
| . 添加以下 ``save`` 方法(以粗体显示)。 |
| |
| [source,java] |
| ---- |
| |
| public NewMessage() { |
| } |
| |
| @Override |
| public void onMessage(Message message) { |
| } |
| |
| *private void save(Object object) { |
| em.persist(object); |
| }* |
| ---- |
| |
| |
| . 在 ``onMessage`` 方法主体中,添加以下内容(以粗体显示)以修改该方法: |
| |
| [source,java] |
| ---- |
| |
| public void onMessage(Message message) { |
| *ObjectMessage msg = null; |
| try { |
| if (message instanceof ObjectMessage) { |
| msg = (ObjectMessage) message; |
| NewsEntity e = (NewsEntity) msg.getObject(); |
| save(e); |
| } |
| } catch (JMSException e) { |
| e.printStackTrace(); |
| mdc.setRollbackOnly(); |
| } catch (Throwable te) { |
| te.printStackTrace(); |
| }* |
| } |
| ---- |
| |
| |
| . 修复 import 语句(Ctrl-Shift-I 组合键;在 Mac 上为 ⌘-Shift-I 组合键)并保存所做的更改。 |
| |
| NOTE: 在生成 import 语句时,您需要确保导入 * ``jms`` * 和 * ``javax.annotation.Resource`` *。 |
| |
| 有关消息驱动 Bean 的更多详细信息,请参见 link:http://download.oracle.com/javaee/6/tutorial/doc/index.html[+Java EE 6 教程第 I 部分+]中的link:http://download.oracle.com/javaee/6/tutorial/doc/gipko.html[+什么是消息驱动 Bean?+]一章。 |
| |
| |
| === 创建会话 Bean |
| |
| 在本练习中,将使用向导为 NewsEntity 实体类创建会话 Bean Facade。向导将生成 ``create`` 、 ``edit`` 和 ``find`` 方法,将通过 Web 应用程序项目中的 Servlet 访问这些方法。 |
| |
| 1. 右键单击 EJB 模块,然后选择 "New"(新建)> "Other"(其他)。 |
| 2. 从 "Persistence"(持久性)类别中,选择 "Session Beans for Entity Classes"(实体类的会话 Bean),然后单击 "Next"(下一步)。 |
| 3. 从可用实体类的列表中选择 *ejb.NewsEntity*,然后单击 "Add"(添加)以将该类移动到 "Selected Entity Classes"(选定的实体类)窗格中。单击 "Next"(下一步)。 |
| 4. 选择 *ejb* 作为包。单击 "Finish"(完成)。 |
| |
| 在单击 "Finish"(完成)后,IDE 将生成两个会话 Facade 类: ``AbstractFacade.java`` 和 ``NewsEntityFacade.java`` ,后者用于扩展抽象 Facade 类。抽象 Facade 类用于定义几个常用于实体类的方法。 |
| |
| image::images/maven-sessionwizard.png[title="实体类的会话 Bean 向导"] |
| |
| |
| == 对 Web 应用程序进行编码 |
| |
| 在此部分,将在 Web 应用程序项目中创建两个 Servlet。 |
| |
| |
| === 创建 ListNews Servlet |
| |
| 在本练习中,将创建用于显示发布的消息列表的 ListNews Servlet。将使用标注注入会话 Facade,并访问 ``findAll`` 方法以检索发布的消息。 |
| |
| 1. 右键单击 Web 模块项目,然后选择 "New"(新建)> "Servlet"。 |
| 2. 键入 *ListNews* 作为类名。 |
| 3. 键入 *web* 作为包名。单击 "Finish"(完成)。 |
| |
| 单击 "Finish"(完成),此时将在源代码编辑器中打开类 ``ListNews.java`` 。 |
| |
| |
| |
| . 在源代码编辑器中的类定义之间右键单击,然后选择 "Insert Code"(插入代码)(Alt-Insert 组合键;在 Mac 上为 Ctrl-I 组合键)> "Call Enterprise Bean"(调用企业 Bean)。 |
| |
| |
| . 在 "Call Enterprise Bean"(调用企业 Bean)对话框中,展开 "MavenEnterpriseApp-ejb" 节点,然后选择 "NewsEntityFacade"。单击 "OK"(确定)。 |
| |
| image::images/maven-callbean.png[title=""Call Enterprise Bean"(调用企业 Bean)对话框"] |
| |
| 在单击 "OK"(确定)时,将使用 ``@EJB`` 标注将 EJB 资源注入到 Servlet 中。 |
| |
| |
| [source,java] |
| ---- |
| |
| @WebServlet(name = "ListNews", urlPatterns = {"/ListNews"}) |
| public class ListNews extends HttpServlet { |
| @EJB |
| private NewsEntityFacade newsEntityFacade; |
| ---- |
| |
| |
| . 在 ``processRequest`` 方法中,将以下代码行(以粗体显示)添加到方法主体中以修改该方法: |
| |
| [source,xml] |
| ---- |
| |
| out.println("<h1>Servlet ListNews at " + request.getContextPath () + "</h1>"); |
| * |
| List news = newsEntityFacade.findAll(); |
| for (Iterator it = news.iterator(); it.hasNext();) { |
| NewsEntity elem = (NewsEntity) it.next(); |
| out.println(" <b>"+elem.getTitle()+" </b><br />"); |
| out.println(elem.getBody()+"<br /> "); |
| } |
| out.println("<a href='PostMessage'>Add new message</a>"); |
| * |
| out.println("</body>"); |
| |
| ---- |
| |
| NOTE: 如果您使用的是早期版本的 IDE,可能需要注释掉该代码。 |
| |
| |
| |
| . 修复 import 语句(Ctrl-Shift-I 组合键;在 Mac 上为 ⌘-Shift-I 组合键)并保存所做的更改。 |
| |
| 在生成 import 语句时,您希望导入 ``java.util`` 库。 |
| |
| |
| === 创建 PostMessage Servlet |
| |
| 在本练习中,您将创建用于传递消息的 PostMessage Servlet。您将使用标注向该 Servlet 中直接注入创建的 JMS 资源,从而指定变量名称及其映射到的名称。然后,您将添加用于发送 JMS 消息的代码,以及用于在 HTML 窗体中添加消息的代码。 |
| |
| 1. 右键单击 Web 模块项目,然后选择 "New"(新建)> "Servlet"。 |
| 2. 键入 *PostMessage* 作为类名。 |
| 3. 选择 *web* 作为包名。单击 "Finish"(完成)。 |
| |
| 单击 "Finish"(完成),此时将在源代码编辑器中打开类 ``PostMessage.java`` 。 |
| |
| |
| |
| . 在源代码编辑器中,添加以下字段声明以使用标注注入 ``ConnectionFactory`` 和 ``Queue`` 资源。 |
| |
| [source,java] |
| ---- |
| |
| @WebServlet(name="PostMessage", urlPatterns={"/PostMessage"}) |
| public class PostMessage extends HttpServlet { |
| *@Resource(mappedName="jms/NewMessageFactory") |
| private ConnectionFactory connectionFactory; |
| |
| @Resource(mappedName="jms/NewMessage") |
| private Queue queue;* |
| ---- |
| |
| |
| . 修复 import 语句以导入 * ``javax.jms`` * 库。 |
| |
| image::images/maven-searchdepend1.png[title=""Fix All Imports"(修复所有导入)对话框"] |
| |
| NOTE: 如果 IDE 未提供 ``javax.jms`` 以供选择,您可以在资源库中搜索合适的工件,方法是:在 ``private ConnectionFactory connectionFactory;`` 旁边的旁注中单击建议图标,然后选择 "Search Dependency at Maven Repositories"(在 Maven 资源库中搜索依赖关系)。 |
| |
| image::images/maven-searchdependencies.png[title="编辑器中用于在资源库中搜索依赖关系的提示"] |
| |
| 使用 "Search in Maven Repositories"(在 Maven 资源库中搜索)对话框,可以找到包含 ``ConnectionFactory`` 的 ``javaee-api-6.0`` 工件。 |
| |
| image::images/maven-searchdepend2.png[title=""Search in Maven Repositories"(在 Maven 资源库中搜索)对话框"] |
| |
| |
| |
| . 添加以下代码以将 JMS 消息发送到 ``processRequest`` 方法。 |
| |
| [source,java] |
| ---- |
| |
| response.setContentType("text/html;charset=UTF-8"); |
| |
| *// Add the following code to send the JMS message |
| String title=request.getParameter("title"); |
| String body=request.getParameter("body"); |
| if ((title!=null) && (body!=null)) { |
| try { |
| Connection connection = connectionFactory.createConnection(); |
| Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); |
| MessageProducer messageProducer = session.createProducer(queue); |
| |
| ObjectMessage message = session.createObjectMessage(); |
| // here we create NewsEntity, that will be sent in JMS message |
| NewsEntity e = new NewsEntity(); |
| e.setTitle(title); |
| e.setBody(body); |
| |
| message.setObject(e); |
| messageProducer.send(message); |
| messageProducer.close(); |
| connection.close(); |
| response.sendRedirect("ListNews"); |
| |
| } catch (JMSException ex) { |
| ex.printStackTrace(); |
| } |
| }* |
| ---- |
| |
| |
| . 为用于添加消息的 Web 窗体添加以下代码(以粗体显示)。 |
| |
| [source,xml] |
| ---- |
| |
| out.println("Servlet PostMessage at " + request.getContextPath() + "</h1>"); |
| |
| *// The following code adds the form to the web page |
| out.println("<form>"); |
| out.println("Title: <input type='text' name='title'><br/>"); |
| out.println("Message: <textarea name='body'></textarea><br/>"); |
| out.println("<input type='submit'><br/>"); |
| out.println("</form>"); |
| * |
| out.println("</body>"); |
| |
| ---- |
| |
| NOTE: 如果您使用的是早期版本的 IDE,可能需要注释掉该代码。 |
| |
| |
| |
| . 修复导入并保存更改。 |
| |
| image::images/maven-jms-imports.png[title=""Fix All Imports"(修复所有导入)对话框"] |
| |
| NOTE: 您需要为 ``Connection`` 、 ``ConnectionFactory`` 、 ``Session`` 和 ``Queue`` 导入 * ``javax.jms`` * 库。 |
| |
| |
| == 使用 Maven 构建应用程序 |
| |
| 现在,已完成了应用程序编码,接下来可以使用 Maven 构建企业应用程序。在此部分,将构建项目,并将其打包到 EAR 档案中。EAR 档案包含 EJB JAR 档案和 WAR 档案。在创建 EAR 档案后,您可以将该档案部署到目标服务器上。 |
| |
| |
| === 处理项目依赖关系 |
| |
| 在本练习中,将检查 Web 项目的 POM ( ``pom.xml`` ),并修改该 POM,以防打包时将不必要的工件包含在 WAR 中。 每个 Maven 项目包含一个 ``pom.xml`` 文件,其中包含档案内容的详细信息。项目所需的任何外部库都在 POM 中作为依赖关系列出。您可以修改 POM,以指定将档案打包时需要包含或应该排除的依赖关系。 |
| |
| 在此应用程序中,EJB JAR 和 WAR 档案将打包到 EAR 档案中。如果查看 MavenEnterpriseApp-ear 项目的 ``pom.xml`` ,则可以看到 EJB 和 WAR 已声明为依赖关系。 |
| |
| image::images/maven-earpom.png[title="EAR 项目的 pom.xml"] |
| |
| 如果在编辑器中查看 Web 项目的 ``pom.xml`` ,则可以看到 EJB 档案已声明为依赖关系,而作用域已指定为 ``provided`` 。如果工件的作用域元素值为 ``provided`` ,则打包时将不包含该工件。Web 项目要求将 EJB 档案作为依赖关系,但对于此应用程序,您不希望在打包时将 EJB 档案包含在 WAR 中,因为 EJB 档案将作为 EAR 档案的一部分使用和提供。 |
| |
| image::images/maven-webpom.png[title="Web 应用程序项目的 pom.xml"] |
| |
| 可以在编辑器中打开 ``pom.xml`` ,然后单击 "Graph"(图形)标签以查看项目依赖关系的可视表示形式。如果您使用的是 IDE 的早期版本,则可以在编辑器中右键单击 ``pom.xml`` ,然后选择 "Show Dependency Graph"(显示依赖关系图形)。可以将光标放在工件上以显示包含工件详细信息的工具提示。 |
| |
| image::images/maven-webpomgraph.png[title="依赖关系图"] |
| |
| 执行以下步骤,修改 Web 项目的 POM,以便将 ``scope`` 元素添加到 ``javaee-api`` 工件的依赖关系中。 |
| |
| 1. 展开 Web 项目下方的 "Project Files"(项目文件)节点。 |
| 2. 双击 ``pom.xml`` ,该文件在编辑器中打开。 |
| 3. 确认为 ``javaee-api`` 工件的 ``<scope>`` 值设置了 ``provided`` 。 |
| |
| 如果此值不是 ``provided`` ,则您需要编辑 POM 以进行以下更改: |
| |
| |
| [source,xml] |
| ---- |
| |
| <dependency> |
| <groupId>javax</groupId> |
| <artifactId>javaee-api</artifactId> |
| <version>7.0</version> |
| <type>jar</type> |
| *<scope>provided</scope>* |
| </dependency> |
| ---- |
| |
| 可以在 POM 编辑器中使用代码完成功能帮助编辑该文件。 |
| |
| image::images/maven-addscope-javaee.png[title="POM 中作用域元素的代码完成"] |
| |
| 通过声明提供了依赖关系,在构建 WAR 档案时,Maven 将不打包该工件。 |
| |
| |
| |
| . 保存所做的更改。 |
| |
| |
| === 使用依赖关系构建 |
| |
| Maven 构建框架包含一系列特定的阶段,每个阶段包含一个或多个目标,可以配置这些阶段以使用各种不同的 Maven 插件。"Build with Dependencies"(使用依赖关系构建)菜单项将映射到 Maven 构建生命周期的 ``install`` 阶段,并配置为使用 Reactor 插件。在弹出式菜单中选择 "Build with Dependencies"(使用依赖关系构建)时,Maven 将构建应用程序和任何所需的依赖关系,并将构建工件复制到本地资源库中。 |
| |
| 可以在项目 "Properties"(属性)对话框的 "Actions"(操作)面板中修改将 Maven 阶段和目标映射到菜单操作的方式。 |
| |
| 要构建 EAR 档案,请执行以下步骤。 |
| |
| * 右键单击 MavenEnterpriseApp-ear 项目节点,然后选择 "Build with Dependencies"(使用依赖关系构建)。 |
| |
| 在使用 Reactor 插件构建 EAR 项目时,首先将构建作为 EAR 项目的依赖关系的子项目,然后再构建 EAR 项目。"Output"(输出)窗口将显示构建顺序。 |
| |
| image::images/maven-reactor1.png[title="显示反应器构建顺序的 "Output"(输出)窗口"] |
| |
| 还会在 "Output"(输出)窗口中显示构建结果。 |
| |
| image::images/maven-reactor2.png[title="显示反应器构建状态的 "Output"(输出)窗口"] |
| |
| 在构建 EAR 项目后,您可以在 "Files"(文件)窗口中的 EAR 项目节点下方的 ``target`` 目录中看到最终的 EAR 档案。 |
| |
| image::images/maven-earfileswindow1.png[title="显示 EAR 档案的 "Files"(文件)窗口"] |
| |
| 如果使用默认工件名称 ``com.mycompany`` ,则可以在 "Maven Repository Browser"(Maven 资源库浏览器)中展开 "Local Repository"(本地资源库)中的 ``com.mycompany`` 以查看构建工件。 |
| |
| 有关构建 Maven 项目的详细信息,请参见 link:http://maven.apache.org[+maven.apache.org+] 上的 link:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html[+Maven - Introduction to the Build Lifecycle+](Maven - 构建生命周期简介)。 |
| |
| |
| == 部署并运行应用程序 |
| |
| 本节介绍了两种将 EAR 档案部署到服务器上的方法。可通过以下方法将应用程序部署到 GlassFish Server 上:使用 IDE 中的菜单操作或 GlassFish 管理控制台中的 "Deploy"(部署)工具。 |
| |
| |
| === 从 IDE 中部署并运行应用程序 |
| |
| 在本练习中,将使用 "Run"(运行)操作,将 EAR 档案部署到 GlassFish Server。部署应用程序之后,将在浏览器中打开该应用程序的 ListNews 页,并添加一条消息。 |
| |
| 1. 在 "Projects"(项目)窗口中右键单击 EAR 项目节点,然后选择 "Run"(运行)。 |
| |
| 单击 "Run"(运行)后,IDE 将在服务器上部署 EAR 档案并创建 JMS 资源。IDE 将在浏览器中打开默认的项目索引页 (link:http://localhost:8080/MavenEnterpriseApp-web/[+http://localhost:8080/MavenEnterpriseApp-web/+])。 |
| |
| |
| |
| . 打开浏览器,访问下列 URL 以显示 ListNews 页。 |
| |
| link:http://localhost:8080/MavenEnterpriseApp-web/ListNews[+http://localhost:8080/MavenEnterpriseApp-web/ListNews+]。 |
| |
| 第一次运行项目时,数据库为空,并且没有要显示的消息。 |
| |
| image::images/maven-browser1.png[title="在浏览器中打开的 ListNews 页"] |
| |
| |
| |
| . 单击 "Add New Message"(添加新消息)。 |
| |
| |
| . 在 PostMessage Servlet 的窗体中键入消息。单击 "Submit Query"(提交查询)。 |
| |
| image::images/maven-browser2.png[title="在浏览器中打开的 PostMessage 页"] |
| |
| 使用 PostMessage Servlet 添加消息时,会将该消息发送到消息驱动 Bean 以写入持久性存储,并且将调用 ListNews Servlet 以显示数据库中的消息。ListNews 检索到的数据库中消息的列表通常不包含新消息,因为消息服务是异步的。 |
| |
| 默认情况下,对于将 GlassFish Server 指定为目标服务器的 Maven 项目,将启用 "Compile on Save"(在保存时编译)和 "Deploy on Save"(在保存时部署)。例如,如果修改并保存 Servlet,则可以在浏览器中重新加载该 Servlet 并查看所做的更改,而不用重新部署应用程序。 |
| |
| |
| === 从 GlassFish 管理控制台中部署 |
| |
| 在本练习中,将使用 GlassFish 管理控制台中的 "Deploy"(部署)工具部署 EAR 档案。 |
| |
| 1. 在 "Services"(服务)窗口中展开 "Servers"(服务器)节点。 |
| 2. 启动 GlassFish Server。 |
| 3. 右键单击 GlassFish Server 节点,然后选择 "View Admin Console"(查看管理控制台)以在浏览器中打开 GlassFish 管理控制台。 |
| 4. 在管理控制台的左窗格中,单击 "Applications"(应用程序)节点。 |
| 5. 在管理控制台的主窗格中,单击 "Deploy"(部署)按钮。 |
| 6. 单击 "Browse"(浏览)以查找企业应用程序的 EAR 档案。 |
| |
| EAR 档案位于本地系统上的企业应用程序目录的 ``target`` 目录中。 |
| |
| |
| |
| . 单击 "OK"(确定)。 |
| |
| 在单击 "OK"(确定)时,GlassFish 部署工具将部署应用程序。 |
| |
| NOTE: 如果在 GlassFish 管理控制台中使用部署工具部署应用程序,则还需要手动创建应用程序所需的资源(如不存在)。 |
| |
| |
| == 下载解决方案项目 |
| |
| 您可以采用下列方法下载本教程的解决方案(作为一个项目)。 |
| |
| * 下载link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FMavenEnterpriseApp.zip[+已完成项目的 zip 档案文件+]。 |
| * 通过执行以下步骤从 NetBeans 样例检出项目源代码: |
| 1. 从主菜单中选择 "Team"(团队开发)> "Subversion" > "Checkout"(检出)。 |
| 2. 在 "Checkout"(检出)对话框中,输入以下资源库 URL: |
| ``https://svn.netbeans.org/svn/samples~samples-source-code`` |
| 单击 "Next"(下一步)。 |
| |
| |
| . 单击 "Browse"(浏览)以打开 "Browse Repostiory Folders"(浏览资源库文件夹)对话框。 |
| |
| |
| . 展开根节点并选择 *samples/javaee/MavenEnterpriseApp*。单击 "OK"(确定)。 |
| |
| |
| . 指定用于存储源代码的本地文件夹(本地文件夹必须为空)。 |
| |
| |
| . 单击 "Finish"(完成)。 |
| |
| 单击 "Finish"(完成),此时 IDE 会将本地文件夹初始化为 Subversion 资源库,并检出项目源代码。 |
| |
| |
| |
| . 在完成检出操作后将会显示一个对话框,在该对话框中单击 "Open Project"(打开项目)。 |
| |
| NOTE: 有关安装 Subversion 的更多信息,请参见 link:../ide/subversion.html[+NetBeans IDE 中的 Subversion 指南+]中有关link:../ide/subversion.html#settingUp[+设置 Subversion+] 的部分。 |
| |
| |
| link:/about/contact_form.html?to=3&subject=Feedback:%20Creating%20an%20Enterprise%20Application%20Using%20Maven[+发送有关此教程的反馈意见+] |
| |
| |
| |
| == 另请参见 |
| |
| 有关使用 NetBeans IDE 开发 Java EE 应用程序的更多信息,请参见以下资源: |
| |
| * link:javaee-intro.html[+Java EE 技术简介+] |
| * link:javaee-gettingstarted.html[+Java EE 应用程序入门指南+] |
| * link:maven-entapp-testing.html[+测试 Maven 企业应用程序+] |
| * link:../../trails/java-ee.html[+Java EE 和 Java Web 学习资源+] |
| |
| 您可以在 link:http://download.oracle.com/javaee/7/tutorial/doc/[+Java EE 7 教程+]中找到有关使用 企业 Bean 的详细信息。 |
| |
| 要发送意见和建议、获得支持以及随时了解 NetBeans IDE Java EE 开发功能的最新开发情况,请link:../../../community/lists/top.html[+加入 nbj2ee 邮件列表+]。 |
| |