内容


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

使用 Rational Application Developer 快速构建一个多层 Java EE 应用程序,并将它部署到 IBM Bluemix

Comments

这个由 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 层来与数据库交互。

创建一个 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 复选框: 选择了 WebSphere Liberty 服务器的 New Server Runtime Wizard 的屏幕截图
    选择了 WebSphere Liberty 服务器的 New Server Runtime Wizard 的屏幕截图
  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要在 Liberty 上运行的 CustomerEJB 项目的向导的屏幕截图
    要在 Liberty 上运行的 CustomerEJB 项目的向导的屏幕截图
  3. 在 Configuration 节中,单击 Modify 并添加 JPAContext and dependency injection (CDI)选择了 CDI、JPA 和 EJB 的 Project Facets 的屏幕截图
    选择了 CDI、JPA 和 EJB 的 Project Facets 的屏幕截图
  4. 单击 OK
  5. 在 New EJB Project 向导上单击 Next,再次单击 Next
  6. 在 JPA Facet 配置页面中,从 Connection 列表中选择 SQLDB在 JPA Facet 配置对话框中设置数据库连接的屏幕截图
    在 JPA Facet 配置对话框中设置数据库连接的屏幕截图
  7. 单击 Next
  8. 清除 Create an EJB Client Jar 复选框。
  9. 单击 Finish,如果提示,则接受向 Java EE 透视图的切换。(忽略错误通知,出现该通知是因为您尚未创建 EJB — 您将在后面的一个步骤中执行该任务。)

创建 JPA 实体

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

  1. 右键单击 Customer EJB 项目,然后选择 JPA Tools > Configure JPA EntitiesConfigure JPA Entity 向导的第一页的屏幕截图
    Configure JPA Entity 向导的第一页的屏幕截图
  2. 单击 Create New JPA Entities... 按钮。
  3. 在 Select Tables 对话框中,选择 SQLDB 连接,选择客户模式(来自 第 1 部分 的 Bluemix SQL 数据库用户名称),然后选择 CUSTOMER 表: Generate Custom Entities 向导的屏幕截图
    Generate Custom Entities 向导的屏幕截图
  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 数据: 该屏幕截图显示了要生成的查询
    该屏幕截图显示了要生成的查询
  10. 单击 Finish
  11. 如果提示选择一个数据库连接,可以选择 SQLDB 并单击 Finish

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

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

  1. 右键单击该项目并选择 JPA Tools > Add JPA Manager Beans。选择您刚创建的 Customer JPA 实体: 已选择了 Customer 的 JPA Manager Bean 向导的屏幕截图
    已选择了 Customer 的 JPA Manager Bean 向导的屏幕截图
  2. 单击 Next,然后单击 Finish

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

创建一个会话 EJB

现在您已构建了数据访问 (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 复选框(保留默认名称): 已完成的 Create EJB session bean 向导
    已完成的 Create EJB session bean 向导
  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() 方法的复选框: 已选择两个方法的 Promote Methods 对话框的屏幕截图
    已选择两个方法的 Promote Methods 对话框的屏幕截图
  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服务器配置编辑器的屏幕截图
    服务器配置编辑器的屏幕截图
  3. 在 Server Configuration 编辑器中,单击 Add 并选择 JDBC driver。指定 DB2 作为 ID包含 JDBC 驱动程序的 Liberty 配置的屏幕截图
    包含 JDBC 驱动程序的 Liberty 配置的屏幕截图
  4. 单击 Shared library reference 旁边的 Add 按钮。在 Name 字段中,键入 DB2library
  5. 告诉服务器 DB2 JDBC 库位于何处:在文件集引用的旁边,单击 Add,对于基础目录特性,键入包含 JDBC 驱动程序文件 (db2jcc4.jar) 的文件夹的位置 — 例如 c:\ibm\sqllib\java: 共享库下的文件夹配置的屏幕截图
    共享库下的文件夹配置的屏幕截图
  6. 添加数据来源:选择 Server Configuration,单击 Add,然后选择 Data Source
  7. ID 设置为 SQLDB,将 JNDI name 设置为 jdbc/SQLDB。在 JDBC driver reference 字段中,从列表中选择 DB2数据来源特性对话框的屏幕截图
    数据来源特性对话框的屏幕截图
  8. 将身份验证信息添加到数据来源之后:在左侧选择数据来源,单击 Add,然后选择 DB2 JCC Properties。指定 SQLDB 作为 Database name,然后提供用于访问数据库的主机名、用户名和密码: 数据库身份验证特性配置的屏幕截图
    数据库身份验证特性配置的屏幕截图
  9. 保存 server.xml 文件。

后续步骤

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


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational, Java technology
ArticleID=1005848
ArticleTitle=快速构建一个功能丰富的三层 Web 应用程序,第 2 部分:构建应用层
publish-date=05122015