通过数据库生成 JavaServer Faces 2.0 CRUD 应用程序
在本教程中,您将学习使用 NetBeans IDE 来创建一个与后端数据库进行交互的 Web 应用程序。使用该应用程序可以查看和修改数据库中包含的数据,也称为 CRUD(创建、读取、更新和删除)功能。您开发的应用程序依赖于以下软件:
- JavaServer Faces (JSF) 2.0,用于前端 Web 页、验证处理和请求-响应周期的管理。
- Java Persistence API (JPA) 2.0,通过 EclipseLink 从数据库中生成实体类,并管理事务。(EclipseLink 是 JPA 的引用实现,也是 GlassFish 服务器的缺省持久性提供器。)
- Enterprise JavaBeans (EJB) 3.1,提供了用于访问实体类的无状态 EJB,并且包含了应用程序的业务逻辑。
此 IDE 提供了两种可为应用程序生成所有代码的向导。一种是“通过数据库生成实体类”向导,您可以通过所提供的数据库来生成实体类。在创建实体类之后,可使用“通过实体类创建 JSF 页”向导为实体类创建 JSF 受管 Bean 和 EJB,以及一组用于处理实体类数据视图的 Facelets 页。本教程的最后部分了解应用程序为可选章节,其中提供了大量练习有助于您更好地理解应用程序并进一步熟悉此 IDE。

注意:本教程适用于 NetBeans IDE 版本 6.8 和 6.9。如果您使用的是 NetBeans IDE 6.7,请参见本教程的 6.7 版。
目录
要学完本教程,您需要具备以下软件和资源。
注意:
创建数据库
本教程使用了一个名为 consult 的咨询代理数据库。安装 IDE 时,该数据库并未包括在其中,因此需要首先创建该数据库以按照本教程完成后续的学习。
consult 数据库旨在演示 IDE 对处理各种数据库结构所提供的支持范围。因此,该数据库不应作为数据库设计的推荐范例或最佳做法。相反,它尝试将可能会在数据库设计中遇到的许多相关功能包含了进来。例如,consult 数据库包含了所有可能的关系类型、复合主键和许多不同的数据类型。有关此数据库结构的更详细概览,请参见下表。
注意:
执行以下步骤以创建数据库并通过 IDE 与其进行连接。
- 下载 derby-consult.zip 并将此归档解压缩到本地系统。在解压缩归档时您将看到用于创建和填充数据库的 SQL 脚本。归档中还包含了用于拖放表的脚本。
- 在“服务”窗口中,展开“数据库”节点,右键单击 "MySQL" 节点并选择“启动服务器”。
- 右键单击“MySQL 服务器”节点并选择“创建数据库”。
- 在“创建 MySQL 数据库”中键入 consult 作为“数据库名称”。单击“确定”。“数据库”节点 (
jdbc:mysql://localhost:3306/consult [root on Default schema]) 下随即出现一个新的节点。
- 右键单击新节点并选择“连接”。
- 从主菜单中选择“文件”>“打开文件”并导航至解压缩的文件
mysql_create_consult.sql。单击“打开”。该文件会自动在 SQL 编辑器中打开。

- 确保在 SQL 编辑器工具栏的“连接”下拉列表中选择了
consult 数据库,然后单击“运行 SQL”(
) 按钮。
单击“运行 SQL”时,“输出”窗口中出现以下输出内容。

检查数据库结构
要查看是否已正确创建了表,请展开数据库连接节点下的“表”节点。您可以展开表节点来查看表的列、索引和任意外键。可以右键单击列并选择“属性”来查看有关该列的其他信息。
注意:如果在“表”节点下未看到任何表,右键单击“表”节点并选择“刷新”。
从 consult 数据库的结构可看出该数据库包含了具有多种关系和各种字段类型的表。通过数据库创建实体类时,IDE 会为各种字段类型自动生成相应的代码。
下表描述了 consult 数据库中的表。
| CLIENT |
咨询机构的客户 |
非生成的复合主键(其字段不构成外键) |
| CONSULTANT |
咨询机构的员工,客户可基于合同对其进行聘用 |
包括一个 LONG VARCHAR 类型的简历字段 |
| CONSULTANT_STATUS |
顾问在咨询机构的状态(例如,可能为活动和非活动的状态) |
CHAR 类型的非生成主键 |
| RECRUITER |
负责联络客户和顾问的咨询机构的员工 |
|
| PROJECT |
客户配有咨询机构顾问的项目 |
包含了构成 CLIENT 表的外键的两个字段的非生成复合主键 |
| BILLABLE |
顾问在某个项目中工作的小时数,咨询机构据其向相关客户收费 |
包括一个 CLOB 类型的工件字段 |
| ADDRESS |
客户账单地址 |
|
| PROJECT_CONSULTANT |
一个连接表,表示当前为哪些项目指派了哪些顾问 |
交叉引用了 PROJECT 和 CONSULTANT,其中前者有一个复合主键 |
consult 数据库包含了多种关系。在通过数据库创建实体类时,IDE 将基于列的 SQL 类型自动生成相应的 Java 类型的属性。下表描述了 consult 数据库的实体关系。(未显示反向关系。)
| CLIENT |
RECRUITER |
进行手动编辑,可为 null 的一对一关系;如果不进行手动编辑,可为 null 的一对多关系 |
一个 CLIENT 有多个 RECRUITER,而一个 RECRUITER 没有或有一个 CLIENT(如果不进行手动编辑) |
| CLIENT |
ADDRESS |
不可为 null 的一对一关系 |
一个 CLIENT 有一个 ADDRESS,而一个 ADDRESS 没有或有一个 CLIENT |
| CLIENT |
PROJECT |
不可为 null 的一对多关系;在“项目”实体中,客户字段的值是“项目”主键的一部分 |
一个 CLIENT 有多个 PROJECT,而一个 PROJECT 只有一个 CLIENT |
| CONSULTANT |
PROJECT |
多对多关系 |
一个 CONSULTANT 有多个 PROJECT,而一个 PROJECT 也有多个 CONSULTANT |
| CONSULTANT |
BILLABLE |
不可为 null 的一对多关系 |
一个 CONSULTANT 有多个 BILLABLE,而一个 BILLABLE 有一个 CONSULTANT |
| CONSULTANT_STATUS |
CONSULTANT |
不可为 null 的一对多关系 |
一个 CONSULTANT_STATUS 有多个 CONSULTANT,而一个 CONSULTANT 有一个 CONSULTANT_STATUS |
| CONSULTANT |
RECRUITER |
可为 null 的一对多关系 |
一个 CONSULTANT 没有或有一个 RECRUITER,而一个 RECRUITER 有多个 CONSULTANT |
| BILLABLE |
PROJECT |
不可为 null 的一对多关系 |
一个 BILLABLE 有一个 PROJECT,而一个 PROJECT 有多个 BILLABLE |
既然已经创建了数据库,那么就可以创建 Web 应用程序,并使用“通过数据库生成实体类”向导基于数据库表生成实体类。
创建 Web 应用程序项目
在本练习中,您将创建一个 Web 项目并将 JavaServer Faces 框架添加到该项目中。在创建项目时,需要在“新建项目”向导的“框架”面板中选择 "JavaServer Faces"。
- 选择“文件”>“新建项目”(Ctrl-Shift-N)。
- 从 "Java Web" 类别中选择“Web 应用程序”。单击“下一步”。
- 键入
ConsultingAgency 作为项目名称,并设置项目位置。单击“下一步”。
- 将“服务器”设置为 "GlassFish Server 3.0.1" 并将“Java EE 版本”设置为 "Java EE 6 Web"。单击“下一步”。
- 在“框架”面板中,选择 "JavaServer Faces" 选项。单击“完成”。
单击“完成”后,IDE 生成 Web 应用程序项目并在编辑器中打开 index.xhtml。
通过数据库生成实体类
在 IDE 中连接到数据库后,可以使用“通过数据库生成实体类”向导基于数据库中的表快速生成实体类。IDE 可以为所选的每个表生成实体类,也可以为相关表生成任何需要的实体类。
- 在“项目”窗口中,右键单击
ConsultingAgency 项目节点,并选择“新建”>“通过数据库生成实体类”。(如果未列出此选项,请选择“其他”。然后,在文件向导中,选择“持久性”类别,再选择“通过数据库生成实体类”。)
- 从“数据源”下拉列表中选择“新建数据源”以打开“创建数据源”对话框。
- 键入
jdbc/consult 作为“JNDI 名称”并选择 jdbc:mysql://localhost:3306/consult [root on Default schema] 作为“数据库连接”。
重要说明:您的数据库需要受口令保护才能在本教程中创建数据源和使用 Eclipselink。如果您使用的是缺省 MySQL root 帐户和空口令,则可以通过命令行提示符设置口令。
例如,要将口令设置为 nbuser,请在命令行提示符下导航至 MySQL 安装的 bin 目录,然后输入以下内容:
shell> mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD('nbuser')
-> WHERE User = 'root';
mysql> FLUSH PRIVILEGES;
有关详细信息,请参见正式的 MySQL 参考手册:《确保初始 MySQL 帐户安全》。
- 单击“确定”以关闭对话框并返回到向导。
consult 数据库中的表出现在“可用表”列表框中。
- 单击“全部添加”按钮以选择数据库中包含的所有表。单击“下一步”。

- 键入
jpa.entities 作为“包”名称。确保已选中用于生成命名查询的复选框。
- 单击“创建持久性单元”按钮以打开“创建持久性单元”对话框。
在对话框中单击“创建”以创建持久性单元并返回到向导。
注意:可以保留持久性单元的缺省值。
- 单击“完成”。IDE 在项目的
jpa.entities 包中生成实体类。
使用向导通过数据库创建实体类时,IDE 会检查数据库表之间的关系。在“项目”窗口中,如果展开 jpa.entities 包节点,则可以看到 IDE 为每个表(PROJECT_CONSULTANT 表除外)生成了一个实体类。因为 PROJECT_CONSULTANT 是一个连接表,所以 IDE 没有为其创建实体类。
IDE 还为带有复合主键的表生成了两个额外的类:CLIENT 和 PROJECT。这些表的主键类(ClientPK.java 和 ProjectPK.java)在其名称后附加了 PK。
如果查看为实体类生成的代码,可以发现向导为自动生成的 ID 字段添加了 @GeneratedValue 标注,还为实体类中的某些字段添加了 @Basic(optional = "false") 标注。基于 @Basic(optional = "false") 标注,“通过实体类创建 JSF 页”向导可以生成包含检查的代码,这些检查可防止那些字段出现不可为 null 的列违规。
通过实体类生成 JSF 页
创建了实体类之后,便可以创建用于显示和修改数据的 Web 接口。您将使用“通过实体类创建 JSF 页”向导来生成 JavaServer Faces 页。向导生成的代码将基于包含在实体类中的持久性标注。
对于每个实体类,向导都会生成以下内容:
- 用于创建、检索、修改和删除实体实例的无状态会话 Bean
- JSF 会话范围的受管 Bean
- 包含 CRUD 功能的四个 Facelets 文件(
Create.xhtml、Edit.xhtml、List.xhtml 和 View.xhtml)的目录
- JSF 受管 Bean 所使用的实用程序类(
JsfUtil 和 PaginationHelper)
- 本地化消息的属性包,以及项目的 Faces 配置文件(如果不存在
faces-config.xml 文件,则会创建一个)中的相应条目
- 辅助 Web 文件(包括所呈现组件的缺省样式表)和一个 Facelets 模板文件
生成 JSF 页:
- 在“项目”窗口中,右键单击项目节点,然后选择“新建”>“通过实体类创建 JSF 页”打开该向导。(如果未列出此选项,请选择“其他”。然后,在文件向导中,选择 "JavaServer Faces" 类别,再选择“通过实体类创建 JSF 页”。)
“可用的实体类”框列出了项目中所包含的七个实体类。该框并未列出可嵌入类(ClientPK.java 和 ProjectPK.java)。
- 单击“全部添加”以将所有类移动到“选定的实体类”框中。
单击“下一步”。
- 在向导的“步骤 3”即“生成 JSF 页和类”中,键入
jpa.session 作为“JPA 会话 Bean 包”。
- 键入
jsf 作为“JSF 类包”。
- 在“本地化包名称”字段中输入 "
/resources/Bundle"。这样将生成一个名为 resources 的包,其中将包含 Bundle.properties 文件。(如果将此字段保留为空,则在项目的缺省包中将创建属性包。)
要使 IDE 能更好地适应您的项目约定,可以定制由向导生成的任何文件。单击“定制模板”链接以修改向导所使用的文件模板。
通常,可以使用“模板管理器”(“工具”>“模板”)来访问和更改 IDE 维护的所有模板。
- 单击“完成”。IDE 在
jpa.session 包中生成无状态会话 Bean,并在 jsf 包中生成 JSF 会话范围的受管 Bean。每个无状态会话 Bean 用于处理相应实体类的操作,其中包括通过 Java 持久性 API 创建、编辑和销毁实体类的实例。每个 JSF 受管 Bean 用于实现 javax.faces.convert.Converter 接口,并执行将相应实体类的实例转换为 String 对象的操作,反之亦然。
如果展开“Web 页”节点,则可以看到 IDE 为每个实体类生成了一个文件夹。每个文件夹都包含 Create.xhtml、Edit.xhtml、List.xhtml 和 View.xhtml 文件。IDE 还通过向每个 List.xhtml 页中插入链接来修改 index.xhtml 文件。
每个 JSF 受管 Bean 都对应四个相应的 Facelets 文件,并且包含调用相应会话 Bean 中的方法的代码。
展开 resources 文件夹节点以查找由向导生成的 jsfcrud.css 缺省样式表。如果在编辑器中打开应用程序欢迎页面 (index.xhtml) 或 Facelets 模板文件 (template.xhtml),将会看到该文件包含了对样式表的引用。
<h:outputStylesheet name="css/jsfcrud.css"/>
每个实体类所对应的四个 Facelets 文件中的每个文件都使用 Facelets 模板文件。
如果展开“源包”节点,则可以看到向导生成的会话 Bean、JSF 受管 Bean、实用程序类和属性包。
为了注册属性包的位置,向导还生成了一个 Faces 配置文件 (faces-config.xml)。如果展开“配置文件”节点并在 XML 编辑器中打开 faces-config.xml,则可以看到该文件包含了以下条目。
<application>
<resource-bundle>
<base-name>/resources/Bundle</base-name>
<var>bundle</var>
</resource-bundle>
</application>
此外,如果展开新的 resources 包,则会发现 Bundle.properties 文件,该文件包含了客户端缺省语言的消息。这些消息是由实体类属性派生而来的。
要添加新的属性包,请右键单击 Bundle.properties 文件并选择“定制”。使用“定制器”对话框可以将新的语言环境添加到您的应用程序中。
了解应用程序
既然您的项目已包含了实体类、用于控制实体类的 EJB 会话 Bean 和 JSF 驱动的用于显示和修改数据库的前端,那么请尝试运行该项目以查看结果。
以下是一系列可选的小练习,可用来进一步熟悉应用程序,以及 IDE 所提供的功能。
另请参见
有关 JSF 2.0 的更多信息,请参见以下资源。