转载

快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层

这个由 3 部分的教程系列将介绍如何使用 IBM® Rational® Application Developer、Java Persistence API (JPA)、Enterprise JavaBeans (EJBs)、REST Web 服务和(一个针对富 Web 2.0 前端的)Dojo Toolkit 从头构建一个多层 Web 应用程序。您最终将得到一个全功能的 Web 应用程序,它在一个表中显示数据,用户可双击任何单元格来编辑数据。

在第 1 部分 中,您在 IBM Bluemix 上创建了一个数据库,并从 Rational Application Developer 连接到它,然后在数据库中填充了示例数据。在第 2 部分中,您将创建一个应用程序层,其中包含用于管理业务逻辑的 Enterprise Java Beans (EJBs) 和用于与数据库交互的 Java Persistence API (JPA) 实体。在第 3 部分 中,您将创建 REST Web 服务,为该应用程序提供一个富 Web 2.0 界面,并将它部署到 Bluemix。

创建 JPA 层

JPA(Java EE 标准的一部分)定义了如何在数据存储中读取、写入、更新、删除和查询数据。JPA 通过将 Java 类映射到表,大大简化了与数据库的交互。

第一步是创建 JPA 层来与数据库交互。

创建一个 Liberty 运行时

  1. 在 Rational Application Developer 中,打开 Java EE 透视图并启用您被提示启用的任何功能。
  2. 选择 Window > Preferences 。向下滚动并展开 Server ,然后单击 Runtime Environments
  3. 单击 Add ,然后选择 WebSphere Application Server V8.5 Liberty Profile ,选择 Create a new local server 复选框: 快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  4. 单击 Next
  5. 指定您的 Liberty 安装的位置,或者单击该链接下载。然后单击 Finish
  6. 在 Preferences 对话框中,单击 OK

创建一个 EJB 项目

  1. 选择 File > New > EJB project
  2. Project name 更改为 CustomerEJB 。确保已在 Target runtime 字段中选择了 WebSphere Application Server 8V.5 Liberty Profile 运行时,将 EAR project name 更改为 CustomerEAR快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  3. 在 Configuration 节中,单击 Modify 并添加 JPAContext and dependency injection (CDI)快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  4. 单击 OK
  5. 在 New EJB Project 向导上单击 Next ,再次单击 Next
  6. 在 JPA Facet 配置页面中,从 Connection 列表中选择 SQLDB快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  7. 单击 Next
  8. 清除 Create an EJB Client Jar 复选框。
  9. 单击 Finish ,如果提示,则接受向 Java EE 透视图的切换。(忽略错误通知,出现该通知是因为您尚未创建 EJB — 您将在后面的一个步骤中执行该任务。)

创建 JPA 实体

现在创建 JPA 代码来访问数据库,创建 JPA 管理器 bean 来查询和插入数据:

  1. 右键单击 Customer EJB 项目,然后选择 JPA Tools > Configure JPA Entities快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  2. 单击 Create New JPA Entities... 按钮。
  3. 在 Select Tables 对话框中,选择 SQLDB 连接,选择客户模式(来自第 1 部分 的 Bluemix SQL 数据库用户名称),然后选择 CUSTOMER 表: 快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  4. 单击 Next
  5. 在 Table Associations 页面上,单击 Next
  6. 在 Customize Defaults 中,将 Key generator 设置为 none
  7. 单击 Next ,然后单击 Finish
  8. Configure JPA Entities 对话框中,等待 CUSTOMER 显示在 Tables 字段中,并选择它。单击 Next
  9. 在 Tasks 页面上,添加默认查询:选择 Customer 实体,从任务列表选择 Named Queries ,然后单击 Default 按钮。此选择会添加一组默认查询和操作,您在以后将使用它们来查询 CUSTOMER 数据: 快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  10. 单击 Finish
  11. 如果提示选择一个数据库连接,可以选择 SQLDB 并单击 Finish

该向导创建了一个 Java 类,该类将在数据库表中读取和写入数据,让您无需编写代码并理解 JPA 的语法和标注。如果需要修改该类,可以更改该代码或重新运行该向导。现在,添加查询也变得简单得多,因为您有一组示例可以复制。

下一步是添加一个 JPA 管理器类。一个 JPA 管理器类提供了一组帮助器方法来运行查询,并创建、更新和删除实体。您可以认为 JPA 实体表示表中的一行,JPA 管理器类表示该表(进而提供表级操作)。

  1. 右键单击该项目并选择 JPA Tools > Add JPA Manager Beans 。选择您刚创建的 Customer JPA 实体: 快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  2. 单击 Next ,然后单击 Finish

展开 ejbModule 文件夹,可以看到它现在包含两个文件夹,这些文件夹包含已生成的类: Customer (JPA 实体类)和 CustomerManager (提供一组包装器方法来与 JPA Customer 代码交互)。花一些时间看看两个类的代码。

创建一个会话 EJB

EJB(Java EE 标准的一部分)使您能够以某种方式封装业务逻辑,让分布式应用程序可以轻松地调用它。EJB 是 Java EE 应用程序的高级组件;它们通常调用其他 EJB 或 JPA 代码。

现在您已构建了数据访问 (JPA) 层,下一步是构建一个 EJB 会话 bean 来提供您的业务方法和与 JPA 代码交互。

在这个示例中,应用程序逻辑很简单。但是,EJB 层通常是实现业务规则和任何复杂的计算的地方。该层还提供了一个中央位置来保存任何逻辑,这样就不需要在多个 UI 中重复实现该逻辑。(例如,如果您的应用程序同时拥有一个 Web UI 和移动 UI),那么您可以在 EJB 层中实现任何通用的逻辑。)EJB 还提供了一个 facade 来访问应用程序数据。所以,对 EJB 的典型请求会导致 EJB 与许多 JPA 类交互。

创建和配置会话 bean

  1. 在 Enterprise Explorer 中选择 CustomerEJB 项目,右键单击,然后选择 New > Session Bean (3.x) 。将 Java package 设置为 ejbs ,将 Class name 设置为 CustomerEJB ,然后选择 Local 复选框(保留默认名称): 快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  2. 单击 Finish 。该会话 bean 的代码应该已经在 Java 编辑器中打开。
  3. 在会话 bean 中,为 CustomerManager 类添加一个变量,使用 @Inject 注释将该变量标记为需要依赖项注入:将光标放在构造函数之前,添加以下代码:
    @Inject private CustomerManager mgr;
    @Inject 注释可确保 mgr 属性将由容器注入,所以您不需要担心如何创建一个 CustomerManager 实例。还会实现 CustomerManager 类的依赖项(具体来讲是 PersistenceUnit ,这是一个由应用服务器管理,在与数据库交互时执行主要工作的类)。
  4. 如果发生编译错误,则按下 Ctrl-Shift-O 添加需要的导入。
  5. 将以下两个方法添加到类中,放在构造函数之后:
    public List<Customer> getCustomers()  {   return mgr.getCustomer();  }  public void updateCustomer(String id, String name,           String address, String country)   {   try {    Customer cust = new Customer();    cust.setAddress(address);    cust.setCountry(country);    cust.setName(name);    cust.setCustno(Integer.parseInt(id));    mgr.updateCustomer(cust);   } catch (NumberFormatException e) {    // TODO Auto-generated catch block    e.printStackTrace();   } catch (Exception e) {    // TODO Auto-generated catch block    e.printStackTrace();   }  } 
    getCustomers() 方法获取一个客户列表, updateCustomer() 方法支持更新一个客户。
  6. 再次按下 Ctrl-Shift-O
  7. 保存代码。如果发生编译错误,则按下 Ctrl-Shift-O 添加导入。提示输入 List 导入时,选择 java.util.List 。再次保存该文件。您的代码现在应该类似于:
    package ejbs; import java.util.List; import javax.ejb.Local; import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.inject.Inject; import ejbs.view.CustomerEJBLocal; import entities.Customer; import entities.controller.CustomerManager; /**  * Session Bean implementation class CustomerEJB  */ @Stateless @Local(CustomerEJBLocal.class) @LocalBean public class CustomerEJB implements CustomerEJBLocal {  @Inject  private CustomerManager mgr;  /**   * Default constructor.    */  public CustomerEJB() {   // TODO Auto-generated constructor stub  }  public List<Customer> getCustomers()  {   return mgr.getCustomer();  }  public void updateCustomer(String id, String name, String address, String country)   {   try {    Customer cust = new Customer();    cust.setAddress(address);    cust.setCountry(country);    cust.setName(name);    cust.setCustno(Integer.parseInt(id));    mgr.updateCustomer(cust);   } catch (NumberFormatException e) {    // TODO Auto-generated catch block    e.printStackTrace();   } catch (Exception e) {      // TODO Auto-generated catch block      e.printStackTrace();   }  } } 

升级方法

EJB 拥有一些接口,定义了哪些方法可从应用程序中的其他类调用。 getCustomers()updateCustomer() 方法将从您在第 3 部分 中构建的 Web 服务调用,它们必须升级到接口中:

  1. 右键单击 CustomerEJB.java 编辑器并选择 Java EE Tools > Promote methods
  2. 在对话框中,选择 getCustomers()updateCustomer() 方法的复选框: 快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  3. 单击 OK

配置 Liberty 服务器

在开始构建 Web 层和测试应用程序之前,您必需设置 Liberty 服务器来与 DB2 通信,设置与数据库的 Java Naming and Directory Interface (JNDI) 连接:

  1. 将项目添加到服务器中:在 Servers 视图中,右键单击 WebSphere Liberty 服务器,选择 Add and Remove... 。在得到的对话框中,将 CustomerEAR 文件添加到服务器中,然后单击 Finish
  2. 在服务器上创建数据来源:在 Servers 视图中,展开 localhost 上的 WebSphere Application Server V8.5 Liberty 配置文件,然后双击 Server Configuration快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  3. 在 Server Configuration 编辑器中,单击 Add 并选择 JDBC driver 。指定 DB2 作为 ID快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  4. 单击 Shared library reference 旁边的 Add 按钮。在 Name 字段中,键入 DB2library

    如果已安装 DB2,那么这些库位于 sqllib/java 中。否则,您可下载 这些库。

  5. 告诉服务器 DB2 JDBC 库位于何处:在文件集引用的旁边,单击 Add ,对于基础目录特性,键入包含 JDBC 驱动程序文件 (db2jcc4.jar) 的文件夹的位置 — 例如 c:/ibm/sqllib/java: 快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  6. 添加数据来源:选择 Server Configuration ,单击 Add ,然后选择 Data Source
  7. ID 设置为 SQLDB ,将 JNDI name 设置为 jdbc/SQLDB 。在 JDBC driver reference 字段中,从列表中选择 DB2快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  8. 将身份验证信息添加到数据来源之后:在左侧选择数据来源,单击 Add ,然后选择 DB2 JCC Properties 。指定 SQLDB 作为 Database name ,然后提供用于访问数据库的主机名、用户名和密码: 快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
  9. 保存 server.xml 文件。

后续步骤

现在已经完成了服务器的配置,您已经创建了 EJB 和 JPA 代码,为继续阅读第 3 部分 做好了准备,在第 3 部分中,您将创建 REST Web 服务和一个 Dojo Web UI 来通过 REST 服务显示和修改数据。最后,能够在本地运行该应用程序后,您应该将它部署到 IBM Bluemix。

正文到此结束
Loading...