这个由 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(Java EE 标准的一部分)定义了如何在数据存储中读取、写入、更新、删除和查询数据。JPA 通过将 Java 类映射到表,大大简化了与数据库的交互。
第一步是创建 JPA 层来与数据库交互。
CustomerEJB
。确保已在 Target runtime 字段中选择了 WebSphere Application Server 8V.5 Liberty Profile 运行时,将 EAR project name 更改为 CustomerEAR
: 现在创建 JPA 代码来访问数据库,创建 JPA 管理器 bean 来查询和插入数据:
CUSTOMER
表: CUSTOMER
显示在 Tables 字段中,并选择它。单击 Next 。 CUSTOMER
数据: 该向导创建了一个 Java 类,该类将在数据库表中读取和写入数据,让您无需编写代码并理解 JPA 的语法和标注。如果需要修改该类,可以更改该代码或重新运行该向导。现在,添加查询也变得简单得多,因为您有一组示例可以复制。
下一步是添加一个 JPA 管理器类。一个 JPA 管理器类提供了一组帮助器方法来运行查询,并创建、更新和删除实体。您可以认为 JPA 实体表示表中的一行,JPA 管理器类表示该表(进而提供表级操作)。
展开 ejbModule 文件夹,可以看到它现在包含两个文件夹,这些文件夹包含已生成的类: Customer
(JPA 实体类)和 CustomerManager
(提供一组包装器方法来与 JPA Customer
代码交互)。花一些时间看看两个类的代码。
EJB(Java EE 标准的一部分)使您能够以某种方式封装业务逻辑,让分布式应用程序可以轻松地调用它。EJB 是 Java EE 应用程序的高级组件;它们通常调用其他 EJB 或 JPA 代码。
现在您已构建了数据访问 (JPA) 层,下一步是构建一个 EJB 会话 bean 来提供您的业务方法和与 JPA 代码交互。
在这个示例中,应用程序逻辑很简单。但是,EJB 层通常是实现业务规则和任何复杂的计算的地方。该层还提供了一个中央位置来保存任何逻辑,这样就不需要在多个 UI 中重复实现该逻辑。(例如,如果您的应用程序同时拥有一个 Web UI 和移动 UI),那么您可以在 EJB 层中实现任何通用的逻辑。)EJB 还提供了一个 facade 来访问应用程序数据。所以,对 EJB 的典型请求会导致 EJB 与许多 JPA 类交互。
ejbs
,将 Class name 设置为 CustomerEJB
,然后选择 Local 复选框(保留默认名称): CustomerManager
类添加一个变量,使用 @Inject
注释将该变量标记为需要依赖项注入:将光标放在构造函数之前,添加以下代码: @Inject private CustomerManager mgr;
@Inject
注释可确保 mgr
属性将由容器注入,所以您不需要担心如何创建一个 CustomerManager
实例。还会实现 CustomerManager
类的依赖项(具体来讲是 PersistenceUnit
,这是一个由应用服务器管理,在与数据库交互时执行主要工作的类)。 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()
方法支持更新一个客户。 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 服务调用,它们必须升级到接口中:
getCustomers()
和 updateCustomer()
方法的复选框: 在开始构建 Web 层和测试应用程序之前,您必需设置 Liberty 服务器来与 DB2 通信,设置与数据库的 Java Naming and Directory Interface (JNDI) 连接:
DB2
作为 ID : DB2library
。 如果已安装 DB2,那么这些库位于 sqllib/java 中。否则,您可下载 这些库。
SQLDB
,将 JNDI name 设置为 jdbc/SQLDB
。在 JDBC driver reference 字段中,从列表中选择 DB2 : SQLDB
作为 Database name ,然后提供用于访问数据库的主机名、用户名和密码: 现在已经完成了服务器的配置,您已经创建了 EJB 和 JPA 代码,为继续阅读第 3 部分 做好了准备,在第 3 部分中,您将创建 REST Web 服务和一个 Dojo Web UI 来通过 REST 服务显示和修改数据。最后,能够在本地运行该应用程序后,您应该将它部署到 IBM Bluemix。