FeaturesDocs & SupportCommunityBlogsPartners

通过数据库生成 JavaServer Faces CRUD 应用程序

在本教程中,您将使用 NetBeans IDE 来生成和部署显示数据库中数据的 Web 应用程序。本教程将演示如何生成具备 CRUD(创建、阅读、更新、删除)功能的 Web 应用程序,该应用程序使用 Java 持久性 API(JPA)管理数据库事务。在本教程中,您首先将根据数据库表创建一些实体类,然后使用“通过实体类创建 JSF 页”向导,通过实体类来创建 JavaServer Faces(JSF)页面。

“通过实体类创建 JSF 页”向导允许您根据项目的实体类方便快捷地生成操作数据库的 JSF 页面。向导中的选项还包括:在已生成的 JSF 页面中启用 Ajax 功能。向导生成的代码如下所示:

  • 该代码易于维护和定制。
  • 处理所有关系类型、已生成的和未生成的 ID 和嵌入式 ID,包括与外键列相关的嵌入式 ID 字段。
  • 嵌入式 ID 字段在合适的地方显示为只读。
  • 包括为防止非可空列冲突的必要检查,和为防止关联实体中非可空列冲突的孤儿检查。该向导将包括实体类中的标注元素 nullableoptional
  • 包括一些验证检查,即验证当前实体是否正确,从而在用户脱离正常页面流(例如,在多个浏览器标签下工作时)时防止错误发生。
  • 放弃一些特定文件里按属性分配的代码,以防稍后对数据库架构的修改。
  • 可轻易地从已生成的 JSP 中移除字段以简化定制。
  • 当用户试图对已经被另一个用户删除的实体进行操作时,或试图创建一个已经存在的实体时采取合理的处理方式。
  • 可以方便地定制页面样式

除了生成 JSF 页面之外,“通过实体类创建 JSF 页”向导还整合了“基于实体类的 JPA 控制器类”向导的功能。如果要为实体类创建 JPA 控制器类,但不希望通过 JSF 页面生成,则可使用“基于实体类的 JPA 控制器类”向导来代替“通过实体类创建 JSF 页”向导。

注意:本教程使用 NetBeans IDE 6.5。如果您正在使用 NetBeans IDE 6.1,请参见通过 NetBeans IDE 6.1 生成 JavaServer Faces CRUD 应用程序

目录

此页面上的内容适用于 NetBeans IDE 6.5

要学习本教程,您需要具备以下软件和资源。

软件或资源 要求的版本
NetBeans IDE 6.5 Java
Java 开发工具包(Java Developer Kit,JDK) 版本 6 或版本 5
GlassFish 应用服务器 V2
咨询代理数据库 下载 SQL

注意:GlassFish 应用服务器包含在 NetBeans 下载中。

创建数据库

本教程使用一个名为 consult 的咨询代理数据库。安装 IDE 时,该数据库并未包括其中,因此需要先根据本教程创建该数据库。

consult 数据库旨在演示 IDE 处理各种数据库结构的范围。因此,该数据库并未打算成为数据库设计的推荐范例。相反,它尝试将可能会在数据库设计中遇到的许多相关功能包含了进来。例如,consult 数据库包含了所有可能的关系类型、复合主键和许多不同的数据类型。参见表了解有关数据库结构的更详细的概览。

注意:本教程使用 JavaDB 数据库服务器,但也可使用 MySQL 数据库服务器来完成本教程的学习。要在 MySQL 中创建该数据库,请下载并解压 mysql-consult.zip 文件。有关配置 IDE 来操作 MySQL 的更多信息,请参见连接到 MySQL 数据库教程。

  1. 下载 derby-consult.zip 并将该归档解压到本地系统。

    解压该归档之后,您将看到两个 SQL 脚本:derby_create_consult.sqlderby_insert_data_consult.sql

  2. 在“服务”窗口中,展开“数据库”节点,右键单击 "JavaDB" 节点并选择“启动服务器”。
  3. 右键单击 "Java DB" 节点并选择“创建数据库”。
  4. 在“创建 Java DB 对话框中”,键入 consult 作为数据库名、用户名和密码。单击“确定”。
    “创建新数据库”对话框

    数据库节点(jdbc:derby://localhost:1527/consult [consult on CONSULT])下出现了一个新节点。

  5. 右键单击新节点并选择“连接”
  6. 从主菜单中选择“文件”>“打开文件”并导航至解压后的文件 derby_create_consult.sql。单击“选择”。

    文件会自动在 SQL 编辑器中打开。

  7. 确保在 SQL 编辑器工具栏“连接”下拉列表中选中了 consult 数据库,单击“运行 SQL”按钮。

SQL 编辑器屏幕快照

单击“运行 SQL”,“输出”窗口中将出现以下输出。

“输出”窗口屏幕快照

查看数据库结构

要查看是否已经正确创建了表,展开数据库连接节点下的“表”节点。您可以展开表节点来查看表的列、索引和任意外键。可以右键单击一列并选择“属性”来查看关于该列的其他信息。

“服务”窗口的屏幕快照

如果在“表”节点下没看到任何表,右键单击“表”节点并选择刷新。

从 consult 数据库的结构可看出该数据库包含含有各种关系和各种字段类型的表。通过数据库创建实体类时,IDE 会为各种字段类型自动生成相应的代码。

consult 数据库的结构图

下表描述了 consult 数据库中的表

数据库表 描述 设计功能
CLIENT 咨询代理的客户 非生成、复合主键(其字段不构成外键)
CONSULTANT 咨询代理的雇员,客户可根据合同对其进行雇佣。 包括一个 LONG VARCHAR 类型的简历字段
CONSULTANT_STATUS 咨询顾问在咨询代理公司的状况(例如,活跃和不活跃这两种可能的状况) CHAR 类型的非生成主键
RECRUITER 负责联系客户和咨询顾问的咨询代理公司雇员  
PROJECT 客户出人配合咨询代理公司的咨询顾问的一个项目 非生成、复合主键,包含构成到 CLIENT 表的一个外键的两个字段
BILLABLE 咨询顾问在一个项目上花费的几小时,咨询代理公司因之向相关客户收费 包括一个 CLOB 类型的人工字段
ADDRESS 客户账单地址  
PROJECT_CONSULTANT Join 表表明哪些顾问当前委派到了哪些项目 对照 PROJECT 和 CONSULTANT,前者有一个复合主键

consult 数据库包含各种关系。通过数据库创建实体类时,IDE 会自动生成表关系的代码,将相应的标注添加到实体类的字段中。下表描述了 consult 数据库中的表关系。(未显示逆向关系)

数据库表 相关表 关系信息 描述
CLIENT RECRUITER 手动编辑的可空一对一;未编辑的可空一对多 一个 CLIENT 有多个 RECRUITER,一个 RECRUITER 没有或有一个 CLIENT
CLIENT ADDRESS 非可空一对一 CLIENT 有一个 ADDRESS,一个 ADDRESS 没有或有一个 CLIENT
CLIENT PROJECT 非可空一对多;项目实体中,客户字段的值是项目主键的一部分 一个 CLIENT 有(可被委派)多个 PROJECT,一个 PROJECT 有一个 CLIENT
CONSULTANT BILLABLE 非可空一对多 一个 CONSULTANT 有多个 BILLABLE,一个 BILLABLE 有一个 CONSULTANT
CONSULTANT CONSULTANT_STATUS 非可空一对多 一个 CONSULTANT 有一个 CONSULTANT_STATUS,CONSULTANT_STATUS 有(可被委派)多个 CONSULTANT。
CONSULTANT RECRUITER 可空一对多 一个 CONSULTANT 没有或有一个 RECRUITER,RECRUITER 有多个 CONSULTANT
BILLABLE PROJECT 非可空一对多 一个 BILLABLE 有一个 PROJECT,一个 PROJECT 有多个 BILLABLES
PROJECT_CONSULTANT CONSULTANT 非可空一对多 一个 PROJECT_CONSULTANT 有一个 CONSULTANT,一个 COSULTANT 有(可被委派)多个 PROJECT_CONSULTANT
PROJECT_CONSULTANT PROJECT 一对多 一个 PROJECT_CONSULTANT 有一个 PROJECT,一个 PROJECT 有多个 PROJECT_CONSULTANT

创建数据库之后,您可以创建 Web 应用程序,并使用“通过数据库创建实体类”向导来生成基于数据库表的实体类。

创建 Web 应用程序项目

在本练习中,您将创建一个 Web 项目并将 JavaScript Faces 框架添加到该项目中。创建项目之后,在“新建项目”向导的“框架”面板中选择 "JavaServer Faces"。

  1. 选择“文件”>“新建项目”(Ctrl-Shift-N)。
  2. 从“Java Web”类别从选择“ Web 应用程序”。单击“下一步”。
  3. 键入 ConsultingAgency 作为项目名称,并指定项目位置。
  4. 取消选中“使用专用的文件夹来存储库”选项(如果该选项处于选中状态)。
    (对于本教程,没有理由将项目库复制到指定文件夹,因为您将需要与其他用户共享库)。
    单击“下一步”。
  5. 将“服务器”设置为 GlassFish,并将“Java EE 版本”设置为 "Java EE 5"。单击“下一步”。
  6. 在“框架”面板中选中 "JavaServer Faces" 复选框。单击“完成”。

    注意:选择框架时,一定要选择 JavaServer Faces 框架,而非 Visual Web JavaServer Faces。

单击“完成”后,IDE 将创建 Web 应用程序项目并在编辑器中打开 welcomeJSF.jsp。您可以关闭 welcomeJSF.jsp,因为不再需要编辑此文件。

通过数据库生成实体类

创建数据库并在 IDE 中注册数据库连接后,可使用“通过数据库创建实体类”向导快速生成基于该数据库表的实体类。IDE 可以为选择的每个表生成实体类,也能为关联表生成任意必要的实体类。

  1. 在“项目”窗口中,右键单击 ConsultingAgency 节点,从数据库中选择“新建 > 实体类”
  2. 从“数据源”下拉列表中选择“新建数据源”打开“创建数据源”对话框。
  3. 键入 jdbc/consult 作为“JNDI 名称”并选择 jdbc:derby://localhost:1527/consult [consult on CONSULT] 作为“数据库连接”。单击“确定”关闭对话框并返回向导。
    “创建数据源”对话框

    consult 数据库中的表将出现在“可用表”列表框。

  4. 单击向导中的“添加全部”单击“下一步”。
    “通过数据库创建新实体”向导
  5. 键入 jpa.entities 作为包。确保已选中用于生成指定查询的复选框。
  6. 单击“创建持久性单元”,打开“创建持久性单元”对话框。在对话框中单击“创建”以创建持久性单元并返回向导。

    可以保留持久性单元的缺省值。

    “通过数据库创建新实体”向导
  7. 单击“下一步”。
  8. 保留向导“映射选项”页面中的缺省值。单击“完成”。

    如果您希望在生成的实体中进一步定制标注,或集合类型,可以使用向导的“映射选项”页面。对本教程而言,缺省值已经绰绰有余。

使用向导通过数据库创建实体类时,IDE 会检查各表之间的关系。在“属性”窗口,展开 jpa.entities 源包节点,可以看到 IDE 为除 PROJECT_CONSULTANT 表之外的每个表都生成了一个实体类。IDE 没有为 PROJECT_CONSULTANT 创建实体类,因为该表是一个联合表。

IDE 还为具有复合主键的表 CLIENT 和 PROJECT 生成了两个额外的类。这些表的主键类(ClientPK.javaProjectPK.java)在类名称后追加了 "PK"。

“项目”窗口的屏幕快照

如果查看为实体类生成的代码,您可以发现向导为 ID 字段添加了 @GeneratedValue 标记,并且为实体类的一些字段添加了 @Basic(optional = "false") 标注元素。基于 @Basic(optional = "false") 的标注元素,“通过实体类创建 JSF 页”向导可以生成实现防止非可空列冲突的必要检查的代码。

编辑实体类

如果需要,您现在就可以修改生成的实体类。在本练习中,您将修改实体类 toString 方法的实现。您还将修改 Client 和 Recruiter 类中的标注,从而将客户和雇员的关系由一对多改为一对一。由于雇员与咨询顾问间已经存在了可空的一对多关系,出于在本教程中进行演示的目的,您将在客户和雇员间建立起可空的一对一关系。

注意:本教程的这一部分为可选内容,在使用“通过实体类创建 JSF 页”向导生成 JSF 页面之前无需对实体类做任何更改。

编辑 Address.java

打开“Address”实体类并进行以下更改。

  1. 修改 toString 方法的 return 语句以返回完整的地址:
    return line1 + ", " + line2 + ", " + city + ", " + region + ", " + country + ", " + postalCode;

    可以使用 IDE 的代码完成功能来帮助您添加字段。

    字段代码完成的屏幕快照
  2. 如有必要,修复导入并保存更改。

编辑 Billable.java

打开 Billable 实体类并进行以下更改。

  1. 修改 toString 方法的 return 语句,以返回 description、consultant id 和 project:
    public String toString() {
    return description + ", " + consultantId + ", " + project;
  2. 如有必要,修复导入并保存更改。

编辑 Client.java

  1. 修改 recruiterCollection 字段的 @OneToMany 标注,改为一对一关系,将字段由 Collection 改为 Recruiter recruiter
    @OneToOne(mappedBy = "client")
    private Recruiter recruiter;
  2. 根据字段名的变化修改 Collection<Recruiter> recruiterCollection 的 getter 和 setter 方法。新的 getter 和 setter 方法如下所示:
    public Recruiter getRecruiter() {
    return recruiter;
    }

    public void setRecruiter(Recruiter recruiter) {
    this.recruiter = recruiter;
    }

    使用“插入代码”对话框删除 Collection<Recruiter> recruiterCollection 的 getter 和 setter 方法然后为 Recruiter recruiter 生成新的 getter 和 setter 方法会更加容易。要创建新的 getter 和 setter 方法,请右键单击源代码,选择“插入代码(Alt-Insert)”然后选择 “Getter 和 Setter”。在“生成 Getter 和 Setter”对话框中选择 recruiter,并单击“生成”。

    “生成 Getter 和 Setter”对话框
  3. 修改 toString 方法的 return 语句,以返回 String.valueOf(clientPK)
    public String toString() {
    return String.valueOf(clientPK);
    }
  4. 如有必要,修复导入并保存更改。

编辑 ClientPK.java

  1. 修改 toString 方法的 return 语句以返回 client name 和 department number。
    public String toString() {
    return clientName + ", " + "Dept. " + clientDepartmentNumber;
    }
  2. 如有必要,修复导入并保存更改。

编辑 Consultant.java

  1. 修改 toString 方法的 return 语句以返回 email。
    public String toString() {
    return email;
    }
  2. 如有必要,修复导入并保存更改。

编辑 ConsultantStatus.java

  1. 修改 toString 方法的 return 语句以返回 status ID 和 description。
    public String toString() {
    return statusId + ", " + description;
    }
  2. 如有必要,修复导入并保存更改。

编辑 Project

  1. 修改 toString 方法的 return 语句以返回以下内容:
    public String toString() {
    return (projectPK == null ? "(unnamed project)" : projectPK.getProjectName()) + ", " + client;
    }
  2. 如有必要,修复导入并保存更改。

编辑 Recruiter.java

  1. 修改 client 字段的 @ManyToOne 标注,将关系标示为一对一关系。
    @OneToOne
    private Client client;
  2. 修改 toString 方法的 return 语句以返回 email。
    public String toString() {
    return email;
    }
  3. 如有必要,修复导入并保存更改。

通过实体类生成 JSF 页

创建实体类之后,您可以创建用于显示和修改数据的 Web 接口。您将使用“通过实体类创建 JSF 页”向导生成 JavaServer Faces 页面。向导生成的代码包括基于实体类标注的检验。该向导还提供了以下选择:通过用 Dynamic Faces 技术扩展 JavaServer Faces 技术,在应用程序中 启用 Ajax 功能

向导对每个实体类都生成了以下内容:

  • 一个 JPA 控制器类
  • 一个 JSF 控制器类
  • 一个 JSF 转换器类
  • 一个包含四个 JSP 文件的目录:(Detail.jspEdit.jspList.jspNew.jsp)
  • 针对 faces-config.xml 中的类的受管 bean 元素、转换器元素和导航规则

该向导还会生成由控制器类所使用的类。

  • JPA 控制器使用的异常类
  • JSF 控制器使用的实体类

生成 JSF 页面:

  1. 请在“项目”窗口中右键单击项目节点并选择“新建”>“通过实体类创建 JSF 页面”以打开“通过实体类创建 JSF 页”向导。

    向导的“可用表”面板列示了项目的七个实体类。向导并未列示可嵌入类(ClientPK.javaProjectPK.java

  2. 单击“全部添加”,将所有类移动至向导的“选定的实体类”面板。单击“下一步”。
    “通过实体类新建 JSF 页面”向导
  3. 键入 jpa.controllers 作为“JPA 控制器包”。
  4. 键入 jsf 作为“JSF 类包”。
  5. 选择 生成的支持 Ajax 的页面
  6. 单击“完成”。

单击“完成”后,IDE 将为 jpa.controllers 包的实体类创建 JPA 控制器类,为 jsf 包的实体类创建 JSF 转换器类和 JSF 控制器类。 每个 JPA 控制器类通过 Java 持久性 API 为相应的实体类处理操作,包括:创建、编辑和销毁实体类的实例。每个 JSF 转换器类实现由 JavaServer Faces 定义的javax.faces.convert.Converter 接口,并执行将相应实体类的实例与 String 对象相互转换的操作。每个 JSF 控制器类专门针对相应生成的 JSP,其中包括调用 JPA 控制器类方法的代码,并演示了要捕获的异常。

总的来说,修改应用程序时,您希望修改 JSF 控制器类的控制器逻辑并使用生成的代码作为例子。

展开“Web 页面”节点,您可以看到 IDE 为每个实体类都生成了一个文件夹。每个文件夹都包括文件Detail.jspEdit.jspList.jspNew.jsp。IDE 还通过为每个 List.jsp 页面插入链接修改了 welcomeJSF.jsp

“项目”窗口“Web 页面”目录的屏幕快照

展开“源包”节点,您可以看到由向导生成的控制器、转换器、异常和实用程序类。

“项目”窗口“源包”目录的屏幕快照

展开“配置文件”节点并在 XML 编辑器中打开 faces-config.xml,您可以看到 IDE 为每个控制器类和转换器类都插入了受管 bean 和转换器元素。IDE 还为每个 JSP 插入了一个导航规则元素,用于指示导致应用程序导航到该 JSP 的逻辑结果。

在应用程序中启用 Ajax

在“通过实体类创建 JSF 页面”向导的最终面板中,您可以选择 生成的支持 Ajax 的页面,通过 JSF 框架的 Dynamic Faces 扩展在应用程序中启用 Ajax 功能。向导将所需的“JSF 扩展”库添加到该项目并配置应用程序的部署描述符,从而启用 Ajax 生命周期。有关 Dynamic Faces JSF 扩展的更多信息,请参见 JavaServer Faces 技术扩展站点

“通过实体类新建 JSF 页面”向导

如果选择该选项,向导会执行以下操作。

  • 将“JSF 扩展”库添加到项目(jsf-extensions-commonjsf-extensions-dynamic-facescommons-loggingshale-remoting),这是在项目中使用 Dynamic Faces 技术所必需的。
    “项目”窗口“库”节点的屏幕快照
  • 通过为 javax.faces.LIFECYCLE_ID 初始化参数添加条目并设定到 com.sun.faces.lifecycle.PARTIAL 的值,修改 Web.xml 以配置 FacesServlet 从而使用 Ajax 生命周期。
     Web.xml 编辑器的屏幕快照
  • Web-INF/jspf 目录下生成 JSP 片段文件 AjaxScripts.jspfAjaxScripts.jspf将 呈现包含在 Dynamic Faces 库中的 JavaScript 文件。

该应用程序在 Web 页面目录中包含了一个 JavaScript 文件 jsfcrud.jsjsfcrud.js 文件检查是否呈现了 Dynamic Faces JavaScript,以确定是否启用了 Dynamic Faces。如果启用了 Dynamic Faces,该表单将被配置为发送 Ajax 请求。

使用 Dynamic Faces 扩展在应用程序中启用 Ajax 之后,可以修改该应用程序以进一步添加由 Dynamic Faces 扩展提供的功能。

通过实体类生成 JPA 控制器类

在生成的 Web 应用程序中,JPA 控制器方法被 JSF 控制器类中的方法访问。使用“通过实体类创建 JSF 页”向导时,IDE 会自动为每个选定的实体生成 JPA 控制器类。但 JPA 控制器类的使用并不限于 JSF Web 应用程序。您可以在使用 Java 持久性 API(例如,桌面应用程序)的其他应用程序中使用 JPA 控制器类,以操作实体类并管理实体持久性。

借助“基于实体类的 JPA 控制器类”向导,您可以轻松地在项目中创建 JPA 控制器类。要创建 JPA 控制器类,请在“持久性”类别中打开“新建文件”向导,并选择“通过实体类生成 JPA 控制器类”。在向导中,指定 JPA 控制器类所针对的实体类,然后指定 IDE 创建该文件的位置。该向导还会自己创建 JPA 控制器类所使用的异常类。

“JPA 控制器类”向导的屏幕快照

生成 JPA 控制器之后,可以从其它文件访问这些控制器方法。如更新数据库架构,可再次运行“通过数据库创建实体类”和“通过实体类创建 JPA 控制器”向导以更新数据。如果愿意,创建 JPA 控制器类之后,可运行“通过实体类创建 JSF 页”向导并指定现有 JPA 控制器类包,在这种情况下,您将利用现有的 JPA 控制器类而非重新生成。

向数据库添加数据

创建应用程序之后,可以部署并运行该应用程序。您创建的 "Consulting Agency" 数据库尚未被填充。需通过 Web 接口或通过运行 SQL 脚本为数据库添加数据。添加数据后,您将看到各表之间的关系如何运行。

使用 SQL 脚本添加数据

如果不希望通过 Web 形式添加数据,您可以运行包含在 derby-consult.zip 中的 derby_insert_data_consult.sql 脚本。

  1. 从主菜单选择“文件 > 打开文件”,打开 derby_insert_data_consult.sql

    文件将自动在 SQL 编辑器中打开。

  2. 请确保在 SQL 编辑器工具栏的连接下拉列表中选定了 consult 数据库,在工具栏中单击“运行 SQL”按钮。
    SQL 编辑器的屏幕快照及插入数据脚本

    您可以在“输出”窗口中查看脚本运行的结果。

注意:如果正在使用的是 MySQL 数据库服务器,请打开包含在 mysql-consult.zip 中的 mysql_insert_data_consult.sql 文件。

使用 Web 接口添加数据

可通过在浏览器中启动该应用程序并通过 Web 表单添加数据的形式为数据库添加数据。

  1. 在主工具栏中单击“运行主项目”。

    IDE 将保存所有修改的文件,重新生成应用程序并将其部署到服务器中。缺省 Web 浏览器打开到以下本地址:http://localhost:8080/ConsultingAgency/.

     welcomeJSF 页面的浏览器窗口屏幕快照
  2. 单击“显示全部地址条目”并单击“新建地址”。
  3. 将以下数据添加到 "New Address" 表单。
    字段
    Line1 100 Data Street
    Line2 Suite 432
    City San Francisco
    区域 California
    Country USA
    PostalCode 94103
    单击“创建”
  4. 单击索引以返回到索引页面。
  5. 单击“显示全部客户条目”并单击“新建客户”
  6. 在 "New Client" 表单中,添加以下数据。
    字段
    ClientDepartmentNumber 2000
    Client Name Big Data Corp.
    Contact Email accounting@bigdatacorp.com
    Contact Password accounting
  7. 从下拉列表的 BillingAddress 中选择 "Palm Spring Street"。
  8. 单击“创建”,再单击“索引”,返回到索引页面。
  9. 单击“显示全部 Project 条目”并单击“新建项目”。
  10. 在 "New Project" 表单中添加以下数据.
    字段
    ProjectName Secret Project
    ContactEmail project.manager@bigdatacorp.com
    ContactPassword project.manager
    单击“创建”,再单击“索引”,返回到索引页面。
  11. 单击“显示全部 Consultant Status 条目”并单击“新建 Consultant Status”
  12. 在新的 ConsultantStatus 表单中添加以下数据。
    字段
    StatusId A
    描述 活动
    单击“创建”,再单击“索引”,返回到索引页面。
  13. 单击“显示全部 Consultant 条目”然后单击“新建 Consultant”。
  14. 在新 Consultant 表单中添加以下数据
    字段
    电子邮件 janet.smart@jsfcrudconsultants.com
    口令 janet.smart
    HourlyRate 80
    BillableHourlyRate 120
  15. 在 ProjectCollection 字段中选择 "Secret Project"。
  16. 从 StatusId 下拉列表中选择 A,Active。
  17. 单击“创建”,再单击“索引”,返回到索引页面。
  18. 单击显示全部 Billable 条目并单击“新建 Billable”
  19. 将以下数据添加到 "New Billable" 表单中。
    字段
    StartDate 2008-10-13 00:00:00.0
    EndDate 2008-10-17 00:00:00.0
    小时 40
    HourlyRate 80
    BillableHourlyRate 120
    描述 begin gathering requirements
    ConsultantId janet.smart@jsfcrudconsultants.com
    项目 Secret Project
    Click Create and then click New Billable.
  20. 将以下数据添加到 "New Billable" 表单中。

    这次,将在描述字段中键入 finish gathering requirements

    字段
    StartDate 2008-10-20 00:00:00.0
    EndDate 2008-10-24 00:00:00.0
    小时 40
    HourlyRate 80
    BillableHourlyRate 120
    描述 finish gathering requirements
    ConsultantId janet.smart@jsfcrudconsultants.com
    项目 Secret Project
    单击“创建”并返回到索引页面。
  21. 单击“显示全部 Recruiter 条目”并单击 "New Recruiter"。
  22. 将以下数据添加到 "New Recruiter" 表单。
    字段
    电子邮件 bob@jsfcrudconsultants.com
    口令 bob
  23. 在 ConsultantCollection 列表中选择 janet.smart@jsfcrudconsultants.com。
  24. 注意:保留 Client 下拉列表为空。

  25. 单击“创建”,再单击“索引”,返回到索引页面。

向数据库添加数据后,可通过生成的页面进行导航,以查看各表之间的关系。

探究已生成代码的功能

填充数据库后,您可以查看向导根据数据库字段的属性来生成代码的例子。

只读主键字段

如果字段为数据库的主键,向导将生成代码以防止用户在生成的表单中编辑字段。下面这个例子演示了主键字段为只读的情况。

  • 如果导航至 New Client 页面,可看到 ProjectCollection 字段为只读。如果应用程序允许改变与现有项目相关的 Client,该操作将失败,因为与项目相关联的 Client 是该项目主键的一部分。 可通过检验 consult_project_pk 主键和 consult_project_fk_client_name 外键在 SQL 脚本中对此进行验证。
  • 导航至“编辑项目页面”,可以看到该 Client 字段为只读。该字段为只读是因为与某项目相关联的 Client 是该项目主键的一部分。

生成的错误检验

生成的代码可检验某项用户操作是否会引起错误。例如,如果表有一列不能为空,代码可检验一项行为是否会引起字段为空,并显示一条错误消息。填充数据库后,尝试编辑表单中的数据就会看到生成的检验的例子。如果试图完成以下行为,将收到一条错误消息。

  • 创建另一个“项目”条目 ,指定 Secret Project 作为项目名称,并填写 ContactEmail 和 Client 字段。

    此时出现了一条错误消息,表明该条目已经存在。

  • 创建另一个 "Address" 条目,但保留所有字段为空。

    此时出现了一条错误消息,提示必需填写的字段。

  • 通过取消选择 BillableCollection 列表中的 "finish gathering requirements" 来编辑 "janet.smart@jsfcrudconsultants.com" Consultant 条目。

    此时出现了一条错误消息,指示取消选择的 Billable 条目必须保留,因为其 consultantId 字段不能为空。

  • 销毁 "Secret Project, Big Data Corp., Dept.2000" 项目条目。

    出现错误消息指出该“项目”条目不能被销毁,因为在相关联的 Billable 条目中,project 字段不能为空。

  • 销毁已被其他用户销毁的条目。

    出现错误消息指出该条目已经不存在,且该条目已经不再显示在列表中。

    如果您使用两个浏览器,可完成此操作:在每个浏览器中导航到同一个页面(例如,Listing Billable Items 页面)。在其中一个浏览器中销毁一个 Billable 条目,然后试着在其他浏览器中销毁该条目。

 

另请参见

有关使用 NetBeans IDE 开发使用 Java 持久性和 JavaServer Faces 的 Web 应用程序的更多信息,请参见以下参考资料:

Companion
Projects:
                  Powered by: