Skip to content

11. 第 6 版 - 将 Web 层集成到三层架构中 JSF / EJB

11.1. 应用程序架构

之前的 Web 应用程序架构如下:

我们将模拟的 [métier] 层,替换为第 7.1 节中通过 EJB 实现的 [métier, DAO, jpa] 层:

11.2. Web层的NetBeans项目

Web 版本 2 的 NetBeans 项目是通过复制前一个项目获得的:

  • [1]:将新项目复制并粘贴到 [Projects] 选项卡中,
  • [2]:为其命名并指定文件夹,
  • [3]:项目已创建,

新项目与旧项目名称相同。我们修改这一点:

  • [4]:我们将该项目重命名为,
  • [5]:将其名称以及artifactID的名称一并更改。

为了使该Web层适应新环境,只需进行少量修改:模拟的[metier]层需替换为第7.1节中构建的服务器上的[metier, DAO, jpa]层。为此,我们将进行两项操作:

  • 删除之前项目中存在的 [exception, metier, jpa] 包。
  • 为弥补此删除操作,我们将第 7.1 节中构建的 EJB 服务器项目添加到 Web 项目的依赖项中。
  • 在 [1] 中,为项目添加依赖项,
  • 在 [2] 中,选择 [métier] 层的 Maven 项目。在 [3] 中,指定其类型;在 [4] 中,指定其作用域。 其作用域为 provided,表示该依赖项(provided)将由其运行环境提供给 Web 模块。稍后我们将看到,该依赖项将由企业应用程序提供,
  • 在 [5] 中,该依赖项已被添加。

文件 [pom.xml] 内容如下:


<dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>mv-pam-ejb-metier-dao-eclipselink</artifactId>
      <version>${project.version}</version>
      <scope>provided</scope>
      <type>ejb</type>
    </dependency>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-web-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

现在我们可以删除 [métier] 层中不再需要的包:

  

我们还需要修改 Bean [Form.java] 的代码:


public class Form {
  
  public Form() {
  }
  
  // 业务层
  private IMetierLocal metier=new Metier();
  
  // 表单字段
...

第 7 行原本实例化了模拟的 [métier] 层。现在它必须引用实际的 [métier] 层。之前的代码变为如下:


public class Form {
  
  public Form() {
  }
  
  // 业务层
  @EJB
  private IMetierLocal metier;
  
  // 表单字段

第 7 行,注解 @EJB 指示将执行 Web 层的 Servlet 容器,向第 8 层的 metier 字段中注入 实现本地接口 IMetierLocal 的 EJB。

为什么使用本地接口 IMetierLocal 而不是接口 IMetierRemote?因为 Web 层和 EJB 层在同一个 JVM 中运行:

Servlet 容器的类可以直接引用 EJB 容器中的 EJB 类。

就这样。我们的 Web 层已经准备就绪。这次转换之所以简单,是因为我们事先通过一个类模拟了 [métier] 层,该类遵循了由实际的 [métier] 层实现的 IMetierLocal 接口。

11.3. 企业应用程序的 NetBeans 项目

企业应用程序支持将应用程序的 [web] 层和 EJB 层同时部署到应用服务器上,分别位于 Servlet 容器和 EJB 容器中。

操作步骤如下:

  • 在 [1] 中,创建一个新项目
  • 在 [2] 中,选择类别 [Maven]
  • 在 [3] 中,选择类型 [Enterprise Application]
  • 在 [4] 中,为项目命名
  • 在 [5] 中,我们选择 Java EE 6
  • 为 [6],一个企业项目最多可包含两种类型的模块:
    • 一个 EJB 模块
    • 一个Web模块

在创建企业项目的同时,可以要求创建这两个模块,它们在初始阶段是空的。企业项目仅用于部署其所属的模块。除此之外,它只是一个空壳。在此,我们希望部署:

  • 一个现有的 Web 模块 [mv-pam-jsf2-alone]。因此无需创建新的 Web 模块。
  • 一个现有的 EJB 模块(即 [mv-pam-ejb-metier-dao-eclipselink])。同样,此处也无需创建新模块。

在 [6] 中,我们创建了一个不包含模块的企业项目。稍后我们将为其添加 Web 模块和 EJB 模块。

  • 在 [7] 中,已创建了两个 Maven 项目。企业项目是后缀为 ear 的那个。另一个项目是前者的父 Maven 项目。我们暂不处理它。

我们将 Web 模块和 EJB 模块添加到企业项目中:

  • 在 [1] 中,添加了一个新依赖项,
  • 在 [2] 中,添加项目 EJB [mv-pam-ejb-metier-dao-eclipselink]。请注意其类型ejb,
  • 在 [3] 中,添加 Web 项目 [mv-pam-jsf2-ejb]。请注意其类型为 war

文件 [pom.xml] 内容如下:


<dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>mv-pam-ejb-metier-dao-eclipselink</artifactId>
            <version>${project.version}</version>
            <type>ejb</type>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>mv-pam-jsf2-ejb</artifactId>
            <version>${project.version}</version>
            <type>war</type>
        </dependency>
    </dependencies>

在部署企业应用程序 [mv-pam-webapp-ear] 之前,请确保数据库 MySQL 和 [dbpam_eclipselink] 已存在且已填充数据。 完成上述操作后,我们可以部署企业应用程序 [mv-pam-webapp-ear]:

  • 在 [1] 中,企业应用程序已部署
  • 在 [2] 中,企业应用程序 [mv-pam-webapp-ear] 已成功部署。

在浏览器中,会显示以下页面:

  • 在 [1] 中,请求的 URL
  • 在 [2] 中,员工列表已使用数据库 dbpam 中表 [Employes] 的数据填充。

请读者重新进行Web版本1的测试。以下是一个执行示例:

Image