| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <!-- |
| Copyright (c) 2009, 2010, 2011 Oracle and/or its affiliates. All rights reserved. |
| --> |
| |
| <html> |
| <head> |
| <title>使用 Maven 创建企业应用程序</title> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > |
| <meta name="description" content="A tutorial on how to use NetBeans IDE to develop an enterprise application using Maven."> |
| <link rel="stylesheet" href="../../../netbeans.css"> |
| <meta name="author" content="ken ganfield"> |
| </head> |
| <body> |
| <h1>使用 Maven 创建企业应用程序</h1> |
| |
| <p>本教程说明了如何使用 NetBeans IDE 和 Maven 原型创建简单的企业应用程序。本教程还提供了一些有关使用 IDE 创建和构建 Maven 应用程序的说明和提示。</p> |
| |
| <p>在本教程中,将创建一个企业应用程序,该应用程序将打包为 EAR 档案并部署到 GlassFish Server Open Source Edition 3。在新建项目向导中,将使用 Maven 企业应用程序原型创建应用程序。该应用程序包含一个 EJB 项目,其中包含实体的持久性实体类、消息驱动 Bean 和会话 Bean Facade。该应用程序还包含一个 Web 项目,其中包含两个 Servlet。</p> |
| |
| |
| <p><b>教程练习</b></p> |
| <img alt="此页上的内容适用于 NetBeans IDE 7.2、7.3、7.4 和 8.0" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="此页上的内容适用于 NetBeans IDE 7.2、7.3、7.4 和 8.0"> |
| |
| <ul> |
| <li><a href="#intro">在 IDE 中使用 Maven</a></li> |
| <li><a href="#Exercise_1">创建 Maven 企业应用程序项目</a></li> |
| <li><a href="#Exercise_2">对 EJB 模块进行编码</a> |
| <ul> |
| <li><a href="#Exercise_2a">创建持久性单元</a></li> |
| <li><a href="#Exercise_2b">创建实体类</a></li> |
| <li><a href="#Exercise_2c">创建消息驱动 Bean</a></li> |
| <li><a href="#Exercise_2d">创建会话 Facade</a></li> |
| </ul> |
| </li> |
| <li><a href="#Exercise_3">对 Web 模块进行编码</a> |
| <ul> |
| <li><a href="#Exercise_3a">创建 ListNews Servlet</a></li> |
| <li><a href="#Exercise_3b">创建 PostMessage Servlet</a></li> |
| </ul> |
| </li> |
| <li><a href="#Exercise_4">使用 Maven 构建应用程序</a> |
| <ul> |
| <li><a href="#Exercise_4a">处理项目依赖关系</a></li> |
| <li><a href="#Exercise_4b">使用依赖关系构建</a></li> |
| </ul> |
| </li> |
| <li><a href="#Exercise_5">部署并运行应用程序</a> |
| <ul> |
| <li><a href="#Exercise_5a">从 IDE 中部署</a></li> |
| <li><a href="#Exercise_5b">从 GlassFish Server 管理控制台中部署</a></li> |
| </ul> |
| </li> |
| <li><a href="#Exercise_7">下载解决方案项目</a></li> |
| </ul> |
| |
| <p><b>要学习本教程,您需要具备以下软件和资源。</b></p> |
| <table> |
| <tbody> |
| <tr> |
| <th class="tblheader" scope="col">软件或资源</th> |
| <th class="tblheader" scope="col">要求的版本</th> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td> |
| <td class="tbltd1">7.2、7.3、7.4、8.0、Java EE 版本</td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 开发工具包 (JDK)</a></td> |
| <td class="tbltd1">版本 7 或 8</td> |
| </tr> |
| <tr> |
| <td class="tbltd1">GlassFish Server Open Source Edition</td> |
| <td class="tbltd1">4.x</td> |
| </tr> |
| </tbody> |
| </table> |
| <p><b>先决条件</b></p> |
| <p>本文档假定您具备以下技术的一些基本知识或编程经验:</p> |
| <ul> |
| <li>Java 编程</li> |
| <li>NetBeans IDE</li> |
| </ul> |
| |
| <p>在开始本教程之前,您可以先阅读下面这些文档。</p> |
| <ul> |
| <li><a href="http://wiki.netbeans.org/MavenBestPractices" target="_blank">NetBeans IDE 中的 Apache Maven 最佳做法</a></li> |
| <li><a href="http://books.sonatype.com/mvnref-book/reference/introduction.html" target="_blank">Chapter 1. Introducing Apache Maven</a>(第 1 章. Apache Maven 简介,来自 <a href="http://books.sonatype.com/mvnref-book/reference/index.html" target="_blank">Maven: The Complete Reference</a>(Maven:完整参考))</li> |
| </ul> |
| <p class="tips">您可以下载<a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FMavenEnterpriseApp.zip">已完成项目的 zip 档案文件</a>。</p> |
| |
| <a name="intro"></a> |
| <!-- ===================================================================================== --> |
| <h2>在 IDE 中使用 Maven</h2> |
| <p>NetBeans IDE 中完全集成了 Maven 支持。开发使用 Maven 框架的项目几乎与在 Ant 中开发项目完全相同。不过,Maven 构建项目和使用依赖关系的方式有一些区别。如果是第一次创建 Maven 应用程序,以下提示可帮助您避免某些问题。</p> |
| |
| |
| <p class="tips"><strong>检查 Maven 设置</strong></p> |
| <div class="indent"> |
| <p>如果这是您首次创建 Maven 项目,则需要在 "Options"(选项)窗口中检查 Maven 配置设置。Maven 与 IDE 捆绑在一起,并随同 IDE 一起安装。</p> |
| |
| <ol> |
| <li>在 IDE 中打开“选项”窗口(“工具”>“选项”;在 Mac 上为 "NetBeans" >“首选项”)。</li> |
| <li>在“选项”窗口中选择 "Java" 类别,然后单击 "Maven" 标签。</li> |
| <li>确认指定了 Maven Home 目录。 |
| <p>您可以使用与 IDE 捆绑在一起的 Maven 版本,也可以指定 Maven 在本地的安装位置(要求为 2.0.9 或更高版本)。</p></li> |
| <li>选择 "OK"(确定)以关闭 "Options"(选项)窗口。</li> |
| </ol> |
| |
| <p class="notes"><strong>注:</strong></p> |
| <ul> |
| <li>在 IDE 中启用 Java 后,会自动启用 Maven 支持。您将需要启用 Java EE 插件(如果尚未启用)。</li> |
| </ul> |
| </div> |
| |
| <p class="tips"><strong>更新 Maven 资源库</strong></p> |
| <div class="indent"> |
| <p>本地和远程 Maven 资源库可用于代码完成以及构建项目。应更新 Maven 远程资源库索引,以确保在开发项目时可方便地使用所需的任何工件。可以在 "Options"(选项)窗口的 "Maven" 标签中配置 IDE 检查更新的频率。您可以执行即时更新检查,并在“服务”窗口中浏览本地和远程 Maven 资源库。</p> |
| |
| <ol> |
| <li>选择“窗口”>“服务”以打开“服务”窗口。</li> |
| <li>在“服务”窗口中展开“Maven 资源库”节点。</li> |
| <li>展开资源库节点以查看工件。</li> |
| <li>右键单击资源库节点并在弹出式菜单中选择“更新索引”。</li> |
| </ol> |
| |
| <p>在单击 "Update Indexes"(更新索引)时,IDE 将检查并下载每个 Maven 远程资源库的最新索引。索引表示位于资源库中的工件的当前状态,并用于提供对可用于应用程序的工件的引用。默认情况下,在明确需要工件之前,IDE 不会从资源库中下载该工件。</p> |
| |
| <p class="tips">在 "Services"(服务)窗口中右键单击 "Maven Repositories"(Maven 资源库)并选择 "Find"(查找)可搜索工件。</p> |
| <p class="notes"><strong>注:</strong></p> |
| <ul> |
| <li>索引非常大,因此可能需要一些时间才能全部更新。</li> |
| <li>如果您使用的是 NetBeans IDE 7.1 或更早版本,您将需要选择 "Window"(窗口)> "Other"(其他)> "Maven Repository Browser"(Maven 资源库浏览器),并在 "Maven Repository Browser"(Maven 资源库浏览器)窗口顶部单击 "Update Indexes"(更新索引)(<img alt=""Update Indexes"(更新索引)按钮" src="../../../images_www/articles/74/javaee/maven-testing//maven-refreshrepo.png" title=""Update Indexes"(更新索引)按钮">)。</li> |
| </ul> |
| </div> |
| |
| |
| <p class="tip">有关在 NetBeans IDE 中使用 Maven 的更多详细信息,请参见<a href="https://netbeans.org/kb/docs/java/maven-hib-java-se.html">使用 Hibernate 创建 Maven Swing 应用程序</a>教程中的<a href="https://netbeans.org/kb/docs/java/maven-hib-java-se.html#02">配置 Maven</a> 部分以及 <a href="http://wiki.netbeans.org/MavenBestPractices" target="_blank">NetBeans IDE 中的 Apache Maven 最佳做法</a>。</p> |
| |
| |
| <a name="Exercise_1"></a> |
| <!--Exercise 1: --> |
| <h2>创建 Maven 企业应用程序项目</h2> |
| |
| <p>本练习的目标是使用与 IDE 捆绑在一起的 Maven 企业应用程序原型创建企业应用程序项目。该企业应用程序原型还会创建 EJB 项目和 Web 应用程序项目。</p> |
| |
| <p>IDE 在新建项目向导中包含几个 Maven 原型,以帮助您快速创建常见类型的 NetBeans 项目,如企业应用程序项目 (EAR)、Web 应用程序项目 (WAR) 和 EJB 模块项目 (JAR)。该向导还允许使用注册的远程资源库中的原型创建项目。 |
| </p> |
| |
| <ol> |
| <li>从主菜单中选择 "File"(文件)> "New Project"(新建项目)(Ctrl-Shift-N 组合键;在 Mac 上为 ⌘-Shift-N 组合键)。</li> |
| <li>从 "Maven" 类别中选择 "Enterprise Application"(企业应用程序)。单击 "Next"(下一步)。<br> <img alt="新建项目向导中的 "Maven Enterprise Application"(Maven 企业应用程序)项目类型" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-newproject1.png" title="新建项目向导中的 "Maven Enterprise Application"(Maven 企业应用程序)项目类型"> |
| </li> |
| <li>键入 <strong>MavenEnterpriseApp</strong> 作为项目名称并设置项目位置。</li> |
| <li>(可选)修改工件详细信息。单击 "Next"(下一步)。 <br> <img alt="新建项目向导中的 "Project"(项目)详细信息" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-newproject2.png" title="新建项目向导中的 "Maven Project"(Maven 项目)详细信息"> |
| </li> |
| <li>选择 GlassFish Server 作为服务器。 </li> |
| <li>将 "Java EE Version"(Java EE 版本)设置为 "Java EE 6" 或 "Java EE 7"。</li> |
| <li>选中 "Create EJB Module"(创建 EJB 模块)和 "Create Web App Module"(创建 Web 应用程序模块)。单击 "Finish"(完成)。</li> |
| </ol> |
| |
| |
| <p>单击 "Finish"(完成),此时 IDE 将使用 Maven 企业应用程序原型创建以下项目。</p> |
| <ul> |
| <li><strong>EJB</strong>。(MavenEnterpriseApp-ejb) EJB 项目通常包含应用程序业务逻辑的源代码。EJB 项目将打包为 EJB JAR 档案。</li> |
| <li><strong>Web 应用程序</strong>。(MavenEnterpriseApp-web) Web 应用程序项目通常包含应用程序的表示层,例如 JSF 和 JSP 页以及 Servlet。Web 应用程序项目可能还包含业务逻辑源代码。Web 应用程序项目将打包为 WAR 档案。</li> |
| <li><strong>汇编</strong>。(MavenEnterpriseApp) 汇编项目用于汇编 EJB 和 WAR 档案中的 EAR 档案。Assembly 项目不包含任何源代码。</li> |
| <li><strong>企业应用程序</strong>。(MavenEnterpriseApp-ear) 企业应用程序项目不包含任何源代码。企业应用程序仅包含 POM 文件 (<tt>pom.xml</tt>) 以及企业应用程序中包含的模块的详细信息。</li> |
| </ul> |
| |
| <img alt="显示已生成项目的 "Projects"(项目)窗口" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-projectswindow2.png" title="显示已生成项目的 "Projects"(项目)窗口"> |
| <p>在创建企业应用程序项目后,如果有任何依赖关系不可用,则将标记该企业应用程序项目。如果展开 MavenEnterpriseApp-ear 项目的 "Dependencies"(依赖关系)节点,则可以看到是否缺少任何所需的库或所需的库不在类路径中。企业应用程序项目依赖于在编译 EJB 项目和 Web 项目后打包和提供的 JAR 和 WAR。您可以看到,<tt>MavenEnterpriseApp-ejb</tt> 和 <tt>MavenEnterpriseApp-web</tt> 作为依赖关系列出。</p> |
| <p class="tips">在某些情况下,您会在状态栏中看到 "Maven" 图标,您可以单击该图标以运行初期构建,并解决缺少依赖关系的问题。</p> |
| <img alt="显示状态栏中用于运行初期构建的 Maven 图标的 IDE 的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/priming-build.png" title="使用状态栏中的 Maven 图标可以运行初期构建"> |
| |
| |
| <!-- <p class="tips"><strong>Specify the target server (NetBeans IDE 7.0)</strong></p> |
| <div class="indent"> |
| <p>In NetBeans IDE 7.0 you need to set the target server in the project's Properties window.</p> |
| |
| <p>When developing Maven applications you typically do not need to specify an application server until you build the application. |
| However, to take advantage of some of the code generation features in the IDE, |
| it is recommended that you set the target server before you start writing your code. |
| By setting the deployment server, the IDE is able to recognize the technologies supported by the server and enable |
| various options in some wizards to generate code that is optimized for that server.</p> |
| |
| <ol> |
| <li>Start the GlassFish Server.</li> |
| <li>Right-click the EJB project node in the Projects window and choose Properties.</li> |
| <li>Select the Run category and select the GlassFish Server. Click OK.</li> |
| </ol> |
| |
| <p>By specifying GlassFish as the deployment server before coding, |
| the IDE will enable the option of selecting JTA in the wizard for creating the persistence unit. |
| You can also select to use any of the datasources registered with the server.</p> |
| </div> |
| <p class="notes"><strong>Note.</strong> If you do not specify GlassFish Server 3, the default transaction type when you create the persistence unit |
| will be <tt>RESOURCE-LOCAL</tt>. |
| You will need to edit the <tt>persistence.xml</tt> file manually to specify <tt>JTA</tt> if you want the container to manage the transactions. |
| You will also need to specify a database connection instead of a registered data source in the New Persistence Unit wizard.</p> |
| --> |
| |
| |
| |
| <a name="Exercise_2"></a> |
| <h2>对 EJB 项目进行编码</h2> |
| |
| <p>EJB 项目包含应用程序的业务逻辑。在此应用程序中,GlassFish 容器将使用 Java 事务 API (JTA) 管理事务。在本教程中,将在 EJB 项目中创建一个实体类及其消息驱动 Bean 和会话 Facade。</p> |
| |
| |
| <div class="indent"> |
| <a name="Exercise_2a"></a> |
| <h3>创建持久性单元</h3> |
| |
| <p>在本练习中,将在 EJB 项目中创建一个持久性单元。持久性单元指定数据库连接详细信息以及如何管理事务。对于此应用程序,将在新建持久性单元向导中指定 JTA,因为您希望由 GlassFish Server 管理事务。</p> |
| |
| <p>要创建持久性单元,请执行以下步骤。</p> |
| <ol> |
| <li>右键单击 EJB 项目节点,然后从弹出式菜单中选择 "New"(新建)> "Other"(其他)打开新建文件向导。</li> |
| <li>从 "Persistence"(持久性)类别中选择 "Persistence Unit"(持久性单元)。单击 "Next"(下一步)。</li> |
| <li>在 "New Persistence Unit"(新建持久性单元)对话框中,选择 EclipseLink 作为持久性提供器。</li> |
| <li>选择数据源(例如,如果要使用 JavaDB,则选择 <tt>jdbc/sample</tt>)。 |
| <p>在安装 IDE 和 GlassFish Server 时,<tt>jdbc/sample</tt> 的数据源将与 IDE 资源包捆绑在一起;但如果要使用不同的数据库,则可以指定不同的数据源。</p> |
| <p>您可以保留其他默认选项(持久性单元名称、EclipseLink 持久性提供器)。</p></li> |
| <li>确保选中 "Use Java Transaction APIs"(使用 Java 事务 API),并且将 "Table Generation Strategy"(表生成策略)设置为 "Create"(创建),以便在部署应用程序时创建基于实体类的表。单击 "Finish"(完成)。</li> |
| </ol> |
| <img alt="新建持久性单元向导" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-persistenceunit.png" title="新建持久性单元向导"> |
| <p>单击 "Finish"(完成),此时 IDE 将创建 XML 文件 <tt>persistence.xml</tt> 并在编辑器中打开该文件。在 "Projects"(项目)窗口中,您可以看到在 <tt>"Other Sources"(其他源)> "src/main/resources" > "META-INF"</tt> 目录中创建了该文件。该文件包含连接到数据库以及如何管理事务的详细信息。如果在编辑器中单击 "Source"(源)标签,则可以查看与持久性单元相关的以下详细信息。</p> |
| <pre class="examplecode">... |
| <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> |
| </pre> |
| |
| <p>您可以看到将 <tt>JTA</tt> 指定为事务类型,并且应用程序使用注册的数据源 <tt>jdbc/sample</tt>。</p> |
| |
| |
| <a name="Exercise_2b"></a> |
| <h3>创建实体类</h3> |
| <p>在本练习中,将在 EJB 项目中创建一个实体类以表示永久保存到数据库中的对象。要创建 NewsEntity 实体类,请执行以下步骤。</p> |
| |
| <ol> |
| <li>右键单击 "Projects"(项目)窗口中的 EJB 模块,然后选择 "New"(新建)> "Other"(其他)打开新建文件向导。</li> |
| <li>从 "Persistence"(持久性)类别中,选择 "Entity Class"(实体类)。单击 "Next"(下一步)。</li> |
| <li>键入 <strong>NewsEntity</strong> 作为类名。</li> |
| <li>键入 <strong>ejb</strong> 作为包名,并将 "Primary Key Type"(主键类型)保留为 Long。单击 "Finish"(完成)。</li> |
| </ol> |
| |
| <p>单击 "Finish"(完成),此时将在源代码编辑器中打开实体类 <tt>NewsEntity.java</tt>。在源代码编辑器中,执行以下步骤以添加一些字段。</p> |
| <ol> |
| <li>将以下字段声明添加到类中。 |
| <pre class="examplecode"> |
| private String title; |
| private String body;</pre> |
| </li> |
| <li>在源代码编辑器的类定义之间右键单击,然后选择 "Insert Code"(插入代码)(Alt-Insert 组合键;在 Mac 上为 Ctrl-I 组合键)> "Getter and Setter"(Getter 和 Setter)。</li> |
| <li>在 "Generate Getters and Setters"(生成 Getter 和 Setter)对话框中,选择 <tt>body</tt> 和 <tt>title</tt> 字段。单击 "Generate"(生成)。</li> |
| <li><!--Right-click in the editor and choose Fix Imports (Alt-Shift-I; ⌘-Shift-I on Mac).--> 保存对该类所做的更改。</li> |
| </ol> |
| |
| <a name="Exercise_2c"></a> |
| <h3>创建消息驱动 Bean</h3> |
| <p>在本练习中,将在 EJB 项目中创建一个消息驱动 Bean。消息驱动 Bean 是一个可异步交换消息的企业 Bean。NewsApp 应用程序使用消息驱动 Bean 接收并处理 Web 模块中的 Servlet 发送到队列的消息。</p> |
| |
| <p>要在应用程序中使用消息驱动 Bean,需要在服务器中注册该 Bean 使用的连接器资源。在部署到 GlassFish Server 时,您可以直接通过管理控制台在服务器上创建资源,也可以在部署时在 <tt>glassfish-resources.xml</tt> 描述符文件中指定详细信息以创建资源。将应用程序部署到服务器时,服务器将根据描述符文件注册资源。在 IDE 中使用新建文件向导创建消息驱动 Bean 时,IDE 将在描述符文件中为您生成元素。</p> |
| |
| <p class="tips">对于 Maven 项目,<tt>glassfish-resources.xml</tt> 文件位于 "Files"(文件)窗口的项目节点下方的 <tt>src/main/setup</tt> 目录中。</p> |
| <ol> |
| <li>右键单击 "Projects"(项目)窗口中的 EJB 模块,然后选择 "New"(新建)> "Other"(其他)打开新建文件向导。</li> |
| <li>从 "Enterprise JavaBeans" 类别中,选择 "Message-Driven Bean"(消息驱动 Bean)。单击 "Next"(下一步)。</li> |
| <li>键入 <strong>NewMessage</strong> 作为 EJB 名称。</li> |
| <li>从 "Package"(包)下拉列表中选择 <strong>ejb</strong>。</li> |
| <li>单击 "Project Destination"(项目目标)字段旁边的 "Add"(添加)按钮,以打开 "Add Message Destination"(添加消息目标)对话框。</li> |
| <li>在 "Add Message Destination"(添加消息目标)对话框中,键入 <strong>jms/NewMessage</strong> 并选择 "Queue"(队列)作为目标类型。单击 "OK"(确定)。<br> <img alt=""Add Message Destination"(添加消息目标)对话框的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-messagedestination.png" title=""Add Message Destination"(添加消息目标)对话框"> |
| </li> |
| <li>确认项目目标正确无误。单击 "Next"(下一步)。<br> <img alt="新建消息驱动 Bean 向导的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/80/javaee/mavenentapp/maven-newmdb.png" title="新建消息驱动 Bean 向导"></li> |
| <li>接受 "Activation Config Properties"(激活配置属性)中的默认设置。单击 "Finish"(完成)。 |
| <p>单击 "Finish"(完成),此时 IDE 将生成 Bean 类,并添加以下标注(将该类标识为消息驱动 Bean)和配置属性。</p> |
| <pre class="examplecode"> |
| @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) { |
| } |
| }</pre> |
| </li> |
| |
| <li>在类中添加以下带标注的字段,以将 <tt>MessageDrivenContext</tt> 资源注入到类中。 |
| |
| <pre class="examplecode">public class NewMessage implements MessageListener { |
| |
| <strong>@Resource |
| private MessageDrivenContext mdc;</strong> |
| </pre> |
| </li> |
| <li>添加以下带标注的字段(以粗体显示),以将实体管理器引入到类中。 |
| <pre class="examplecode"> |
| public class NewMessage implements MessageListener { |
| |
| @Resource |
| private MessageDrivenContext mdc; |
| <strong>@PersistenceContext(unitName="com.mycompany_MavenEnterpriseApp-ejb_ejb_1.0-SNAPSHOTPU") |
| private EntityManager em;</strong> |
| </pre> |
| <p><tt>@PersistenceContext</tt> 标注通过声明持久性单元来指定上下文。<tt>unitName</tt> 值是持久性单元的名称。</p> |
| <li>添加以下 <tt>save</tt> 方法(以粗体显示)。 |
| |
| <pre class="examplecode">public NewMessage() { |
| } |
| |
| @Override |
| public void onMessage(Message message) { |
| } |
| |
| <strong>private void save(Object object) { |
| em.persist(object); |
| }</strong></pre> |
| </li> |
| <li>在 <tt>onMessage</tt> 方法主体中,添加以下内容(以粗体显示)以修改该方法: |
| <pre class="examplecode"> |
| public void onMessage(Message message) { |
| <strong>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(); |
| }</strong> |
| }</pre> |
| </li> |
| <li>修复 import 语句(Ctrl-Shift-I 组合键;在 Mac 上为 ⌘-Shift-I 组合键)并保存所做的更改。 |
| <p class="notes"><strong>注:</strong>在生成 import 语句时,您需要确保导入 <strong><tt>jms</tt></strong> 和 <strong><tt>javax.annotation.Resource</tt></strong>。</li> |
| </ol> |
| |
| <p class="tips">有关消息驱动 Bean 的更多详细信息,请参见 <a href="http://download.oracle.com/javaee/6/tutorial/doc/index.html">Java EE 6 教程第 I 部分</a>中的<a href="http://download.oracle.com/javaee/6/tutorial/doc/gipko.html">什么是消息驱动 Bean?</a>一章。</p> |
| |
| |
| <a name="Exercise_2d"></a> |
| <h3>创建会话 Bean</h3> |
| <p>在本练习中,将使用向导为 NewsEntity 实体类创建会话 Bean Facade。向导将生成 <tt>create</tt>、<tt>edit</tt> 和 <tt>find</tt> 方法,将通过 Web 应用程序项目中的 Servlet 访问这些方法。</p> |
| <ol> |
| <li>右键单击 EJB 模块,然后选择 "New"(新建)> "Other"(其他)。</li> |
| <li>从 "Persistence"(持久性)类别中,选择 "Session Beans for Entity Classes"(实体类的会话 Bean),然后单击 "Next"(下一步)。</li> |
| <li>从可用实体类的列表中选择 <strong>ejb.NewsEntity</strong>,然后单击 "Add"(添加)以将该类移动到 "Selected Entity Classes"(选定的实体类)窗格中。单击 "Next"(下一步)。</li> |
| <li>选择 <strong>ejb</strong> 作为包。单击 "Finish"(完成)。</li> |
| </ol> |
| |
| <p>在单击 "Finish"(完成)后,IDE 将生成两个会话 Facade 类:<tt>AbstractFacade.java</tt> 和 <tt>NewsEntityFacade.java</tt>,后者用于扩展抽象 Facade 类。抽象 Facade 类用于定义几个常用于实体类的方法。</p> |
| <img alt="实体类的会话 Bean 向导的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/80/javaee/mavenentapp/maven-sessionwizard.png" title="实体类的会话 Bean 向导"> |
| <!-- <p>Interfaces are optional in Java EE 6 and Java EE 7. |
| The local interface is optional and the servlet |
| in the web module can access the session bean directly via a no-interface facade.</p>--> |
| |
| </div> |
| |
| <a name="Exercise_3"></a> |
| <h2>对 Web 应用程序进行编码</h2> |
| <p>在此部分,将在 Web 应用程序项目中创建两个 Servlet。</p> |
| |
| <div class="indent"> |
| <a name="Exercise_3a"></a> |
| <h3>创建 ListNews Servlet</h3> |
| <p>在本练习中,将创建用于显示发布的消息列表的 ListNews Servlet。将使用标注注入会话 Facade,并访问 <tt>findAll</tt> 方法以检索发布的消息。</p> |
| |
| <ol> |
| <li>右键单击 Web 模块项目,然后选择 "New"(新建)> "Servlet"。</li> |
| <li>键入 <strong>ListNews</strong> 作为类名。</li> |
| <li>键入 <strong>web</strong> 作为包名。单击 "Finish"(完成)。 |
| <p>单击 "Finish"(完成),此时将在源代码编辑器中打开类 <tt>ListNews.java</tt>。</p></li> |
| <li>在源代码编辑器中的类定义之间右键单击,然后选择 "Insert Code"(插入代码)(Alt-Insert 组合键;在 Mac 上为 Ctrl-I 组合键)> "Call Enterprise Bean"(调用企业 Bean)。</li> |
| <li>在 "Call Enterprise Bean"(调用企业 Bean)对话框中,展开 "MavenEnterpriseApp-ejb" 节点,然后选择 "NewsEntityFacade"。单击 "OK"(确定)。<br> <img alt=""Call Enterprise Bean"(调用企业 Bean)对话框" class="margin-around b-all" src="../../../images_www/articles/80/javaee/mavenentapp/maven-callbean.png" title=""Call Enterprise Bean"(调用企业 Bean)对话框"> |
| <p>在单击 "OK"(确定)时,将使用 <tt>@EJB</tt> 标注将 EJB 资源注入到 Servlet 中。</p> |
| <pre class="examplecode">@WebServlet(name = "ListNews", urlPatterns = {"/ListNews"}) |
| public class ListNews extends HttpServlet { |
| @EJB |
| private NewsEntityFacade newsEntityFacade;</pre> |
| </li> |
| <li>在 <tt>processRequest</tt> 方法中,将以下代码行(以粗体显示)添加到方法主体中以修改该方法: |
| <pre class="examplecode"> |
| out.println("<h1>Servlet ListNews at " + request.getContextPath () + "</h1>"); |
| <strong> |
| 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>"); |
| </strong> |
| out.println("</body>"); |
| </pre> |
| <p class="notes"><strong>注:</strong>如果您使用的是早期版本的 IDE,可能需要注释掉该代码。</p> |
| </li> |
| <li>修复 import 语句(Ctrl-Shift-I 组合键;在 Mac 上为 ⌘-Shift-I 组合键)并保存所做的更改。 |
| <p>在生成 import 语句时,您希望导入 <tt>java.util</tt> 库。</p></li> |
| </ol> |
| |
| <a name="Exercise_3b"></a> |
| <h3>创建 PostMessage Servlet</h3> |
| |
| <p>在本练习中,您将创建用于传递消息的 PostMessage Servlet。您将使用标注向该 Servlet 中直接注入创建的 JMS 资源,从而指定变量名称及其映射到的名称。然后,您将添加用于发送 JMS 消息的代码,以及用于在 HTML 窗体中添加消息的代码。</p> |
| <ol> |
| <li>右键单击 Web 模块项目,然后选择 "New"(新建)> "Servlet"。</li> |
| <li>键入 <strong>PostMessage</strong> 作为类名。</li> |
| <li>选择 <strong>web</strong> 作为包名。单击 "Finish"(完成)。 |
| <p>单击 "Finish"(完成),此时将在源代码编辑器中打开类 <tt>PostMessage.java</tt>。</p> |
| </li> |
| |
| |
| <li>在源代码编辑器中,添加以下字段声明以使用标注注入 <tt>ConnectionFactory</tt> 和 <tt>Queue</tt> 资源。 |
| <pre class="examplecode"> |
| @WebServlet(name="PostMessage", urlPatterns={"/PostMessage"}) |
| public class PostMessage extends HttpServlet { |
| <strong>@Resource(mappedName="jms/NewMessageFactory") |
| private ConnectionFactory connectionFactory; |
| |
| @Resource(mappedName="jms/NewMessage") |
| private Queue queue;</strong></pre> |
| |
| </li> |
| <li>修复 import 语句以导入 <strong><tt>javax.jms</tt></strong> 库。<br> <img alt=""Fix All Imports"(修复所有导入)对话框的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-searchdepend1.png" title=""Fix All Imports"(修复所有导入)对话框"> |
| <p class="notes"><strong>注:</strong>如果 IDE 未提供 <tt>javax.jms</tt> 以供选择,您可以在资源库中搜索合适的工件,方法是:在 <tt>private ConnectionFactory connectionFactory;</tt> 旁边的旁注中单击建议图标,然后选择 "Search Dependency at Maven Repositories"(在 Maven 资源库中搜索依赖关系)。</p> |
| <img alt="编辑器中用于搜索资源库的提示的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-searchdependencies.png" title="编辑器中用于在资源库中搜索依赖关系的提示"> |
| <p>使用 "Search in Maven Repositories"(在 Maven 资源库中搜索)对话框,可以找到包含 <tt>ConnectionFactory</tt> 的 <tt>javaee-api-6.0</tt> 工件。</p> |
| <img alt=""Search in Maven Repositories"(在 Maven 资源库中搜索)对话框的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/80/javaee/mavenentapp/maven-searchdepend2.png" title=""Search in Maven Repositories"(在 Maven 资源库中搜索)对话框"> |
| </li> |
| <li>添加以下代码以将 JMS 消息发送到 <tt>processRequest</tt> 方法。 |
| |
| <pre class="examplecode"> |
| response.setContentType("text/html;charset=UTF-8"); |
| |
| <strong>// 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(); |
| } |
| }</strong></pre> |
| </li> |
| <li>为用于添加消息的 Web 窗体添加以下代码(以粗体显示)。 |
| <pre class="examplecode"> |
| out.println("Servlet PostMessage at " + request.getContextPath() + "</h1>"); |
| |
| <strong>// 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>"); |
| </strong> |
| out.println("</body>"); |
| </pre> |
| <p class="notes"><strong>注:</strong>如果您使用的是早期版本的 IDE,可能需要注释掉该代码。</p> |
| </li> |
| <li>修复导入并保存更改。<br /> <img alt=""Fix All Imports"(修复所有导入)对话框的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-jms-imports.png" title=""Fix All Imports"(修复所有导入)对话框"> |
| <p class="notes"><strong>注:</strong>您需要为 <tt>Connection</tt>、<tt>ConnectionFactory</tt>、<tt>Session</tt> 和 <tt>Queue</tt> 导入 <strong><tt>javax.jms</tt></strong> 库。</p> |
| </li> |
| </ol> |
| </div> |
| |
| |
| <a name="Exercise_4"></a> |
| <h2>使用 Maven 构建应用程序</h2> |
| <p>现在,已完成了应用程序编码,接下来可以使用 Maven 构建企业应用程序。在此部分,将构建项目,并将其打包到 EAR 档案中。EAR 档案包含 EJB JAR 档案和 WAR 档案。在创建 EAR 档案后,您可以将该档案部署到目标服务器上。</p> |
| |
| |
| <div class="indent"> |
| <a name="Exercise_4a"></a> |
| <h3>处理项目依赖关系</h3> |
| <p>在本练习中,将检查 Web 项目的 POM (<tt>pom.xml</tt>),并修改该 POM,以防打包时将不必要的工件包含在 WAR 中。 |
| <!-- This will prevent the EAR archive from containing two copies of the EJB archive.--> |
| |
| 每个 Maven 项目包含一个 <tt>pom.xml</tt> 文件,其中包含档案内容的详细信息。项目所需的任何外部库都在 POM 中作为依赖关系列出。您可以修改 POM,以指定将档案打包时需要包含或应该排除的依赖关系。</p> |
| |
| <p>在此应用程序中,EJB JAR 和 WAR 档案将打包到 EAR 档案中。如果查看 MavenEnterpriseApp-ear 项目的 <tt>pom.xml</tt>,则可以看到 EJB 和 WAR 已声明为依赖关系。</p> |
| |
| <img alt="EAR 项目的 pom.xml" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-earpom.png" title="EAR 项目的 pom.xml"> |
| |
| <p>如果在编辑器中查看 Web 项目的 <tt>pom.xml</tt>,则可以看到 EJB 档案已声明为依赖关系,而作用域已指定为 <tt>provided</tt>。如果工件的作用域元素值为 <tt>provided</tt>,则打包时将不包含该工件。Web 项目要求将 EJB 档案作为依赖关系,但对于此应用程序,您不希望在打包时将 EJB 档案包含在 WAR 中,因为 EJB 档案将作为 EAR 档案的一部分使用和提供。</p> |
| <img alt="Web 应用程序项目的 pom.xml" class="margin-around b-all" src="../../../images_www/articles/80/javaee/mavenentapp/maven-webpom.png" title="Web 应用程序项目的 pom.xml"> |
| |
| <p class="tips">可以在编辑器中打开 <tt>pom.xml</tt>,然后单击 "Graph"(图形)标签以查看项目依赖关系的可视表示形式。如果您使用的是 IDE 的早期版本,则可以在编辑器中右键单击 <tt>pom.xml</tt>,然后选择 "Show Dependency Graph"(显示依赖关系图形)。可以将光标放在工件上以显示包含工件详细信息的工具提示。</p> |
| <img alt="依赖关系图的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/80/javaee/mavenentapp/maven-webpomgraph.png" title="依赖关系图"> |
| |
| <p>执行以下步骤,修改 Web 项目的 POM,以便将 <tt>scope</tt> 元素添加到 <tt>javaee-api</tt> 工件的依赖关系中。</p> |
| <ol> |
| <li>展开 Web 项目下方的 "Project Files"(项目文件)节点。</li> |
| <li>双击 <tt>pom.xml</tt>,该文件在编辑器中打开。</li> |
| <li>确认为 <tt>javaee-api</tt> 工件的 <tt><scope></tt> 值设置了 <tt>provided</tt>。 |
| <p>如果此值不是 <tt>provided</tt>,则您需要编辑 POM 以进行以下更改:</p> |
| <pre class="examplecode"> |
| <dependency> |
| <groupId>javax</groupId> |
| <artifactId>javaee-api</artifactId> |
| <version>7.0</version> |
| <type>jar</type> |
| <strong><scope>provided</scope></strong> |
| </dependency></pre> |
| <p class="tips">可以在 POM 编辑器中使用代码完成功能帮助编辑该文件。</p> |
| <img alt="POM 中代码完成的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-addscope-javaee.png" title="POM 中作用域元素的代码完成"> |
| <p>通过声明提供了依赖关系,在构建 WAR 档案时,Maven 将不打包该工件。</p></li> |
| <li>保存所做的更改。</li> |
| </ol> |
| |
| <a name="Exercise_4b"></a> |
| <h3>使用依赖关系构建</h3> |
| <p>Maven 构建框架包含一系列特定的阶段,每个阶段包含一个或多个目标,可以配置这些阶段以使用各种不同的 Maven 插件。"Build with Dependencies"(使用依赖关系构建)菜单项将映射到 Maven 构建生命周期的 <tt>install</tt> 阶段,并配置为使用 Reactor 插件。在弹出式菜单中选择 "Build with Dependencies"(使用依赖关系构建)时,Maven 将构建应用程序和任何所需的依赖关系,并将构建工件复制到本地资源库中。</p> |
| |
| <p class="tips">可以在项目 "Properties"(属性)对话框的 "Actions"(操作)面板中修改将 Maven 阶段和目标映射到菜单操作的方式。</p> |
| |
| <p>要构建 EAR 档案,请执行以下步骤。</p> |
| <ul> |
| <li>右键单击 MavenEnterpriseApp-ear 项目节点,然后选择 "Build with Dependencies"(使用依赖关系构建)。</li> |
| </ul> |
| |
| <p>在使用 Reactor 插件构建 EAR 项目时,首先将构建作为 EAR 项目的依赖关系的子项目,然后再构建 EAR 项目。"Output"(输出)窗口将显示构建顺序。</p> |
| |
| <img alt="显示反应器构建顺序的 "Output"(输出)窗口" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-reactor1.png" title="显示反应器构建顺序的 "Output"(输出)窗口"> |
| |
| <p>还会在 "Output"(输出)窗口中显示构建结果。</p> |
| <img alt="显示反应器构建状态的 "Output"(输出)窗口" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-reactor2.png" title="显示反应器构建状态的 "Output"(输出)窗口"> |
| <p>在构建 EAR 项目后,您可以在 "Files"(文件)窗口中的 EAR 项目节点下方的 <tt>target</tt> 目录中看到最终的 EAR 档案。</p> |
| <img alt="显示 EAR 档案的 "Files"(文件)窗口" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-earfileswindow1.png" title="显示 EAR 档案的 "Files"(文件)窗口"> |
| |
| |
| <p>如果使用默认工件名称 <tt>com.mycompany</tt>,则可以在 "Maven Repository Browser"(Maven 资源库浏览器)中展开 "Local Repository"(本地资源库)中的 <tt>com.mycompany</tt> 以查看构建工件。</p> |
| |
| <p class="tips">有关构建 Maven 项目的详细信息,请参见 <a href="http://maven.apache.org">maven.apache.org</a> 上的 <a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html">Maven - Introduction to the Build Lifecycle</a>(Maven - 构建生命周期简介)。</p> |
| </div> |
| |
| <a name="Exercise_5"></a> |
| <h2>部署并运行应用程序</h2> |
| <p>本节介绍了两种将 EAR 档案部署到服务器上的方法。可通过以下方法将应用程序部署到 GlassFish Server 上:使用 IDE 中的菜单操作或 GlassFish 管理控制台中的 "Deploy"(部署)工具。</p> |
| |
| <div class="indent"> |
| <a name="Exercise_5a"></a> |
| <h3>从 IDE 中部署并运行应用程序</h3> |
| <p>在本练习中,将使用 "Run"(运行)操作,将 EAR 档案部署到 GlassFish Server。部署应用程序之后,将在浏览器中打开该应用程序的 ListNews 页,并添加一条消息。</p> |
| |
| <ol> |
| <li>在 "Projects"(项目)窗口中右键单击 EAR 项目节点,然后选择 "Run"(运行)。 |
| <p>单击 "Run"(运行)后,IDE 将在服务器上部署 EAR 档案并创建 JMS 资源。IDE 将在浏览器中打开默认的项目索引页 (<a href="http://localhost:8080/MavenEnterpriseApp-web/">http://localhost:8080/MavenEnterpriseApp-web/</a>)。</p></li> |
| <li>打开浏览器,访问下列 URL 以显示 ListNews 页。 |
| <p><a href="http://localhost:8080/MavenEnterpriseApp-web/ListNews">http://localhost:8080/MavenEnterpriseApp-web/ListNews</a>。</p> |
| <p>第一次运行项目时,数据库为空,并且没有要显示的消息。</p> |
| <img alt="在浏览器中打开的 ListNews 页" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-browser1.png" title="在浏览器中打开的 ListNews 页"></li> |
| <li>单击 "Add New Message"(添加新消息)。</li> |
| <li>在 PostMessage Servlet 的窗体中键入消息。单击 "Submit Query"(提交查询)。<br> <img alt="在浏览器中打开的 PostMessage 页" class="margin-around b-all" src="../../../images_www/articles/72/javaee/mavenentapp/maven-browser2.png" title="在浏览器中打开的 PostMessage 页"> |
| </li> |
| </ol> |
| |
| <p>使用 PostMessage Servlet 添加消息时,会将该消息发送到消息驱动 Bean 以写入持久性存储,并且将调用 ListNews Servlet 以显示数据库中的消息。ListNews 检索到的数据库中消息的列表通常不包含新消息,因为消息服务是异步的。 |
| </p> |
| |
| <p class="tips">默认情况下,对于将 GlassFish Server 指定为目标服务器的 Maven 项目,将启用 "Compile on Save"(在保存时编译)和 "Deploy on Save"(在保存时部署)。例如,如果修改并保存 Servlet,则可以在浏览器中重新加载该 Servlet 并查看所做的更改,而不用重新部署应用程序。</p> |
| |
| |
| |
| |
| <!-- <img src="../../../images_www/articles/72/javaee/mavenentapp/maven-selectserver.png" class="margin-around b-all" alt="Select Deployment Server dialog" title="Select Deployment Server dialog" >--> |
| </div> |
| |
| <a name="Exercise_5b"></a> |
| <h3>从 GlassFish 管理控制台中部署</h3> |
| <p>在本练习中,将使用 GlassFish 管理控制台中的 "Deploy"(部署)工具部署 EAR 档案。</p> |
| <ol> |
| <li>在 "Services"(服务)窗口中展开 "Servers"(服务器)节点。</li> |
| <li>启动 GlassFish Server。</li> |
| <li>右键单击 GlassFish Server 节点,然后选择 "View Admin Console"(查看管理控制台)以在浏览器中打开 GlassFish 管理控制台。</li> |
| <li>在管理控制台的左窗格中,单击 "Applications"(应用程序)节点。</li> |
| <li>在管理控制台的主窗格中,单击 "Deploy"(部署)按钮。</li> |
| <li>单击 "Browse"(浏览)以查找企业应用程序的 EAR 档案。 |
| <p>EAR 档案位于本地系统上的企业应用程序目录的 <tt>target</tt> 目录中。</p></li> |
| <li>单击 "OK"(确定)。</li> |
| </ol> |
| <p>在单击 "OK"(确定)时,GlassFish 部署工具将部署应用程序。</p> |
| |
| <p class="notes"><strong>注:</strong>如果在 GlassFish 管理控制台中使用部署工具部署应用程序,则还需要手动创建应用程序所需的资源(如不存在)。</p> |
| </div> |
| |
| |
| |
| <a name="Exercise_7"></a> |
| <h2>下载解决方案项目</h2> |
| <p>您可以采用下列方法下载本教程的解决方案(作为一个项目)。</p> |
| <ul> |
| <li>下载<a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FMavenEnterpriseApp.zip">已完成项目的 zip 档案文件</a>。</li> |
| <li>通过执行以下步骤从 NetBeans 样例检出项目源代码: |
| <ol> |
| <li>从主菜单中选择 "Team"(团队开发)> "Subversion" > "Checkout"(检出)。</li> |
| <li>在 "Checkout"(检出)对话框中,输入以下资源库 URL:<br> <tt>https://svn.netbeans.org/svn/samples~samples-source-code</tt><br> 单击 "Next"(下一步)。</li> |
| <li>单击 "Browse"(浏览)以打开 "Browse Repostiory Folders"(浏览资源库文件夹)对话框。</li> |
| <li>展开根节点并选择 <strong>samples/javaee/MavenEnterpriseApp</strong>。单击 "OK"(确定)。</li> |
| <li>指定用于存储源代码的本地文件夹(本地文件夹必须为空)。</li> |
| <li>单击 "Finish"(完成)。 |
| <p>单击 "Finish"(完成),此时 IDE 会将本地文件夹初始化为 Subversion 资源库,并检出项目源代码。</p> |
| </li> |
| <li>在完成检出操作后将会显示一个对话框,在该对话框中单击 "Open Project"(打开项目)。</li> |
| </ol> |
| <p class="notes"><strong>注:</strong>有关安装 Subversion 的更多信息,请参见 <a href="../ide/subversion.html">NetBeans IDE 中的 Subversion 指南</a>中有关<a href="../ide/subversion.html#settingUp">设置 Subversion</a> 的部分。</p> |
| </li> |
| </ul> |
| |
| |
| |
| <!-- |
| <a name="Exercise_5"></a> |
| |
| <h2>Troubleshooting</h2> |
| <p>The following are some of the problems you may encounter when creating your project.</p> |
| <div class="indent"> |
| <h3 class="tutorial">Problem with JMS Resources</h3> |
| <p>When using the wizard to create JMS resources, |
| you may see the following server error message in the output window:</p> |
| <pre>[com.sun.enterprise.connectors.ConnectorRuntimeException: |
| JMS resource not created : jms/Queue] |
| </pre> |
| <p>This message could indicate that the JMS resource was not created or was not registered with the application server. |
| You can use the Admin Console of the application server to check, create and edit JMS resources.</p> |
| <p>To open the Admin Console, do the following:</p> |
| <ol> |
| <li>Confirm that the application server is running by expanding the Servers node in the Services window of the IDE. |
| A small green arrow next to the application server node indicates the server is running.</li> |
| <li>Right-click the application server node and choose View Admin Console to open the login window in your browser.</li> |
| <li>Log in to the server. The default user name and password are <tt>admin</tt> and <tt>adminadmin</tt>.</li> |
| <li>In the Admin Console in your browser, expand the Resources node and JMS Resources node in the left frame.</li> |
| <li>Click on the Connection Factories and Destination Resources links in the left frame to check if the resources are |
| registered with the server and if necessary modify the resources. If the resources do not exist, you can create them |
| in the Admin Console.</li> |
| </ol> |
| <p>You need to make sure that the JMS connection factory resource |
| in the PostMessage servlet is mapped to the correct JNDI name of the JMS connection factory resource |
| registered with the Sun Java System Application Server.</p> |
| <p>The following resources should be registered with the Sun Java System Application Server:</p> |
| <ul> |
| <li>a Destination resource with the JNDI name <tt>jms/NewMessage</tt> and type <tt>javax.jms.Queue</tt></li> |
| <li>a Connection Factory resource with the JNDI name <tt>jms/NewMessageFactory</tt> and type <tt> |
| javax.jms.QueueConnectionFactory</tt></li> |
| </ul> |
| |
| <p>make sure that the import in PostMessage is not <tt>javax.resource.cci.ConnectionFactory</tt></p> |
| |
| <h3 class="tutorial">Problem with the Datasource</h3> |
| |
| </div>--> |
| <br> |
| <div class="feedback-box" ><a href="/about/contact_form.html?to=3&subject=Feedback:%20Creating%20an%20Enterprise%20Application%20Using%20Maven">发送有关此教程的反馈意见</a></div> |
| <br style="clear:both;" > |
| <!-- ======================================================================================= --> |
| <h2><a name="nextsteps"></a>另请参见</h2> |
| <p>有关使用 NetBeans IDE 开发 Java EE 应用程序的更多信息,请参见以下资源: |
| </p> |
| <ul> |
| <li><a href="javaee-intro.html">Java EE 技术简介</a></li> |
| <li><a href="javaee-gettingstarted.html">Java EE 应用程序入门指南</a></li> |
| <li><a href="maven-entapp-testing.html">测试 Maven 企业应用程序</a></li> |
| <li><a href="../../trails/java-ee.html">Java EE 和 Java Web 学习资源</a></li> |
| </ul> |
| <p>您可以在 <a href="http://download.oracle.com/javaee/7/tutorial/doc/">Java EE 7 教程</a>中找到有关使用 企业 Bean 的详细信息。</p> |
| <p>要发送意见和建议、获得支持以及随时了解 NetBeans IDE Java EE 开发功能的最新开发情况,请<a href="../../../community/lists/top.html">加入 nbj2ee 邮件列表</a>。</p> |
| </body> |
| </html> |