>> 更多 Visual Web Pack 文档
使用数据绑定组件访问数据库
撰稿人:Visual Web Pack 教程编写小组
| 2007 年 5 月 [修订号:V5.5.1-1] |
|
|
在本教程中,您将使用 NetBeans Visual Web Pack 5.5 集成开发环境 (Integrated Development Environment, IDE) 创建和部署一个 Web 应用程序,该应用程序会显示与 IDE 捆绑在一起的数据库中的主要-详细数据。在该应用程序中,从下拉列表中选择某人时,应用程序会显示一个包含此人的所有旅行记录的表。 |
|
目录
|
|
 |
在使用本教程之前,您必须在系统上安装 NetBeans 5.5 IDE 和 Visual Web Pack 5.5。此外,您还要熟悉 IDE 的基本内容并阅读 NetBeans Visual Web Pack 5.5 入门指南以了解 Visual Web Pack 开发环境信息。
本教程将使用以下技术和资源
JavaServer Faces 组件/ Java EE 平台 |
1.2/Java EE 5* 1.1/J2EE 1.4
|
| Travel 数据库 |
必需 |
| BluePrints AJAX 组件库 |
不是必需的 |
* 该教程发布时,只有 Sun Java System Application Server 支持 Java EE 5。
本教程是针对使用 Sun Java Application Server PE 9.0 Update Release 1 和 Tomcat 5.5.17 进行定制的。如果您使用的是其他服务器,请参考发行说明和常见问题解答以了解已知问题和解决方法。有关支持的服务器和 Java EE 平台的详细信息,请参见发行说明。
创建包括一个下拉列表组件的页
在本教程中,您将生成一个 Travel Center 应用程序,如下图中部署的应用程序所示。
图 1:部署的 Travel Center Web 应用程序 |
首先,创建主页并在页面中添加一个下拉列表组件。
- 创建一个新项目并将其命名为
DataboundComponents。IDE 会创建一个名为 Page1 的缺省主页,并在可视设计器中显示该页。
- 如果未展开“组件面板”窗口中的“基本”节点,请现在将其展开。
- 将一个标签组件拖动到页面的左侧,键入
Select Name:,然后按 Enter 键。
- 将一个下拉列表组件拖动到标签组件的右侧。
- 在“属性”窗口中,将其 id 更改为
personIdDD。
按住 Ctrl-Shift 组合键,同时从下拉列表组件拖动一条连线至标签组件,使这两个组件关联。
标签组件的 for 属性现在被设置为 personIdDD。
将一个消息组组件从“组件面板”窗口拖动到页面上的边缘位置,如页面的右上角。
此组件对于诊断编程错误是非常有用的。通过调用 info(String)、error(String)、warn(String) 或 fatal(String) 方法,可以使诊断消息出现在此组件中。消息组组件会显示 String 参数的值。此外,在缺省情况下,有关运行时错误、验证错误和转换错误的消息都会出现在此组件中。
将组件连接至数据库
位于 IDE 工作区左侧的“运行环境”窗口中,包括一个“数据库”节点。“数据库”节点显示了已添加到 IDE 中的所有数据库驱动程序和连接。
NetBeans Visual Web Pack 5.5 附带了一个样例 Travel 数据库,它显示在“数据库”节点下面。
将数据库与组件绑定时,系统会在组件和数据库表之间创建行集层和数据提供器层两个层次。行集层建立数据库连接、执行查询并管理结果集。数据提供器层提供了一个公共接口,用于访问多种类型的数据,其中包括 RowSet 对象、Array 对象以及 Enterprise JavaBeans 对象。
通常,仅在需要设置查询参数时才使用 RowSet 对象。在其他大多数情况下,应该使用数据提供器访问和处理数据。使用数据提供器 API 可以缩短您的学习期,因为无论您包装哪种类型的数据(即,无论您使用哪个数据提供器实现),都将使用相同的 API。
在此部分的教程中,您将使用 Travel 数据库中的 PERSON 表为下拉列表组件提供选项。
-
在“运行环境”窗口中,展开“数据库”节点并检查是否已连接 TRAVEL 数据库。
如果 TRAVEL 数据库的 jdbc 节点标记显示为连接中断,并且无法展开该节点,则表明 IDE 未连接该数据库。要连接 TRAVEL 数据库,请右键单击 TRAVEL 数据库的 jdbc 节点,然后从弹出式菜单中选择“连接”。
如果出现“连接”对话框,
请输入 travel 作为用户名和口令,选中“在此会话期间记住口令”,然后单击“确定”。如果看不到 TRAVEL 数据库的 jdbc 节点,请参见 NetBeans Visual Web Pack 5.5 安装说明以了解如何为 IDE 提供可用的数据库。
-
展开 "Travel" >“表”节点。
在“表”节点下面,您可以看到数据库中每个表的节点,如 "CARRENTAL" 和 "FLIGHT"。下图显示了已展开“表”节点的“运行环境”窗口。
图 2:“运行环境”窗口 |
将 PERSON 表从“运行环境”窗口拖放到下拉列表上。
文本 abc 将出现在下拉列表组件中。出现 abc 文本表明“显示字段”已与 String 对象绑定(在本例中,此对象为 SQL varchar 类型的数据库列)。此外,IDE 还会为数据库表添加非可视的 personDataProvider 组件。personDataProvider 组件将显示在“概要”窗口中。IDE 还会将 personRowSet 属性添加到 SessionBean1 中。
右键单击下拉列表组件,然后从弹出式菜单中选择“绑定到数据”。将出现“绑定到数据”对话框,如下图所示。
图 3:将数据绑定到下拉列表 |
在将数据绑定到下拉列表组件时,必须指定要在列表中显示的内容(显示字段),并且必须指定要在底层程序中使用的值(值字段)。通常,需要显示数据库表中的一些有意义的值(如人名),并在底层程序中使用唯一的标识符(如人员 ID)。然而对于此应用程序,我们将“值字段”和“显示字段”都绑定到同一数据库列,即 PERSON.NAME 列,如接下来的两个步骤所述。
- 在“绑定到数据”对话框中,从“值字段”列表中选择 "PERSON.PERSONID",以使组件的 getSelected 方法为当前的选择返回 PERSON.PERSONID。
- 在“显示字段”列表中选择 "PERSON.NAME",这样浏览器便采用 PERSON.NAME 数据库列中的值来填充下拉列表。
- 单击“确定”。
-
单击主工具栏中的“运行”>“运行主项目”。
IDE 将保存所有更改,然后生成、部署并运行 Web 应用程序。首先,“输出”窗口将出现在 IDE 的底部。IDE 将有关编译和部署的准备信息写入此窗口中(因此,如果在生成过程中出现任何问题,请首先检查“输出”窗口)。接下来,会出现一个对话框以显示部署的状态。部署完成后,IDE 会打开一个 Web 浏览器来装入该应用程序。当浏览器呈现页面时,它使用 "PERSON" 表 "NAME" 列中的数据来填充下拉列表。
添加表组件
接下来,将一个表组件添加到应用程序中,并将该组件与数据库表相连。
- 将一个表组件从组件面板拖放到下拉列表组件的下方。
- 在“运行环境”窗口中,展开 "Travel" >“表”节点。
将 TRIP 表从“运行环境”窗口拖放到表组件标题栏中。
注意:如果将 TRIP 数据库拖放到表组件的其他部分,将打开“选择目标”对话框。在“选择目标”对话框中,选择 "table1",然后单击“确定”。
右键单击表组件,然后选择“表布局”。
“表布局”对话框的“选定”列表中将显示该表的所有列。您可以使用“选定”列表中的项指定哪些列应该出现在表组件中。
- 按住 Ctrl 键的同时单击鼠标,以选择“选定”列表中的项,TRIP.DEPDATE、TRIP.DEPCITY 和 TRIP.DESTCITY 除外。
单击 "<" 按钮。
选定条目将移至“可用”列表中,以下三个条目仍将保留在“选定”列表中,如下图所示:
- TRIP.DEPDATE
- TRIP.DEPCITY
- TRIP.DESTCITY
图 4:“表布局”对话框 |
单击“确定”。
此时,可视设计器将在表组件中显示三列,如下图所示。
图 5:显示的表列 |
修改 SQL 查询
接下来,将修改 tripRowSet 对象中的 SQL 查询,以便查询也能返回 TRIPTYPE 表中的数据。此外,我们还将修改表组件以显示旅行类型的描述。
在“概要”窗口中,展开 "SessionBean1" 节点(如果它尚未展开)。
图 6:“概要”窗口中的 "SessionBean1" 部分 |
在“概要”窗口的 "SessionBean1" 部分,右键单击 "tripRowSet" 节点,然后选择“编辑 SQL 语句”。
查询编辑器将以 "tripRowSet" 为标签出现在编辑区域中。
提示:如果“输出”窗口已打开,请将其关闭,以便有更多的空间来使用查询编辑器。
-
将 "Travel" >“表”> "TRIPTYPE" 节点从“运行环境”窗口拖放到设计视图,如图 7 所示。
将出现另一个表图,并在两个表图之间建立了链接。此链接表示一个连接。请注意,IDE 是如何在源代码窗格中修改 select 语句的。
在 TRIPTYPE 表中清除 TRIPTYPEID 的复选框标记。
此操作将从结果集和 SQL 查询(在源代码窗格中)中删除列,如下图所示。
图 7:查询编辑器 |
- 保持查询编辑器处于打开状态。
- 在编辑区域中单击 "Page1" 标签。
在可视设计器中,右键单击表组件,然后选择“表布局”。
将出现“表布局”对话框。由于您已经更改了 tripRowSet 的 SQL 查询,因此可以显示更多的列。
- 将 TRIPTYPE.DESCRIPTION 列添加到“选定”列表中。
单击“确定”。
表组件中将出现第四列。
控制所显示的行
当您为 TRIP 表添加了数据提供器后,IDE 将创建使用 SQL 查询的 RowSet 对象,该查询会为表中的所有列返回所有行。如果此时部署并运行应用程序,则表组件将显示 TRIP 表中的所有旅行信息。
对于此应用程序,表组件必须仅显示从下拉列表组件中选定了其姓名的人员的旅行信息。通过编辑 tripRowSet 对象的查询,在下拉列表组件和表组件之间创建主要-详细关系,可以限制表中显示的信息。
- 单击编辑区域中的 "tripRowSet (SessionBean1)" 标签,以切换至查询编辑器。
- 在查询编辑器的设计网格中,右键单击 PERSONID 行中的任意单元格,然后选择“添加查询条件”。
- 从“比较”下拉列表中选择
= 等于,并选中“参数”单选按钮。
单击“确定”。
您将在 PERSONID 的“条件”列中看到 = ?,它在 SQL 查询中添加了以下 WHERE 子句。
| 代码样例 1:SQL 查询中的 WHERE 子句 |
WHERE TRAVEL.TRIP.PERSONID = ? |
疑难解答提示:此时,您可以验证是否正确设置了查询。在查询编辑器中单击鼠标右键,然后选择“运行查询”。在“指定参数值”对话框中,键入 1 作为参数 TRAVEL.TRIP.PERSONID 的值,然后单击“确定”。查询编辑器结果窗格中将显示 Person 1 的查询输出。
- 在查询编辑器的设计网格中,单击 DEPDATE 行中的“排序类型”单元格以显示下拉列表。
从“排序类型”单元格的下拉列表中选择“升序”。
IDE 将自动设置排序顺序,并将 sort 子句添加到 SQL 查询中。
- 关闭查询编辑器。
在可视设计器中,双击下拉列表组件。
将在 Java 编辑器中打开 Page1 类的源代码,而且光标位于 personIdDD_processValueChange 方法的主体内。第一次双击下拉列表组件时,IDE 会创建此事件处理程序的方法桩模块。
将 personIdDD_processValueChange 方法的主体替换为下面以粗体显示的代码。
| 代码样例 2:下拉列表组件的值更改事件处理 |
public void personIdDD_processValueChange(ValueChangeEvent event) {
try {
getSessionBean1().getTripRowSet().setObject(
1, personIdDD.getSelected());
tripDataProvider.refresh();
} catch (Exception e) {
error("Cannot switch to person " +
personDataProvider.getValue(
"PERSON.PERSONID"));
log("Cannot switch to person " +
personDataProvider.getValue(
"PERSON.PERSONID"), e);
}
}
|
此代码用于将下拉列表中当前选定的 NAME 的 PERSONID 值绑定到为 tripRowSet 对象准备的 SQL 语句中的参数,执行查询,并获取新的结果集。
setObject 方法将查询中的 ? 替换为 PERSONID 的值。refresh 方法将提交新的查询并刷新结果集。要了解任何一种方法的详细信息,请右键单击该方法调用,然后从弹出式菜单中选择“显示 Javadoc”。选择
“帮助”>“Javadoc 引用”>“数据提供器”和“帮助”>“Javadoc 引用”>“行集”,可以查看数据提供器和行集 Javadoc。
log 方法会将消息和关联的栈跟踪发送到应用服务器的日志中,以帮助发现和诊断用户问题。右键单击“运行环境”窗口中的服务器节点,
然后从弹出式菜单中选择“查看服务器日志”,
可以查看服务器的日志。
- 按 Ctrl-Shift-F 组合键重新设置代码格式。
在“导航”窗口中单击鼠标左键,然后键入 prerender。一旦开始键入,就会出现“快速搜索”对话框,如下图所示。IDE 会在“导航”窗口中突出显示第一个匹配条目。
请注意,“导航”窗口和“概要”窗口共用同一个空间。通过单击窗口的标题,可以将某一窗口置于前端。
图 8:“导航”窗口中的“快速搜索” |
-
按 Enter 键。Java 编辑器将显示
prerender 方法。
将 prerender 方法的主体替换为下面以粗体显示的代码。
| 代码样例 3:第一次显示页时同步主要-详细数据 |
public void prerender() {
if ( personIdDD.getSelected() == null ) {
try {
personDataProvider.cursorFirst();
getSessionBean1().getTripRowSet().setObject(
1, personDataProvider.getValue("PERSON.PERSONID"));
tripDataProvider.refresh();
} catch (Exception e) {
error("Cannot switch to person " +
personDataProvider.getValue("PERSON.PERSONID"));
log("Cannot switch to person " +
personDataProvider.getValue("PERSON.PERSONID"), e);
}
}
} |
此代码用于处理第一次访问页时的情况,它是在 Web 浏览器开始显示页面之前被调用的。
- 按 Ctrl-Shift-F 组合键重新设置代码格式。
- 单击编辑工具栏中的“设计”以返回到可视设计器。
右键单击下拉列表组件,然后选择“更改时自动提交”。
在“属性”窗口中,以下代码将出现在 onchange 属性中。
| 代码样例 4:onchange 属性代码 |
webuijsf.suntheme.common.timeoutSubmitForm(this.form, 'personIdDD');
|
此时,当用户在运行的 Web 应用程序中更改下拉列表选择时,Web 浏览器将自动提交页面。
单击主工具栏中的“运行主项目”。
IDE 将保存所有已更改的文件,重新生成应用程序,并将应用程序重新部署到服务器中。
- 从下拉列表组件中选择某人,以查看表组件如何与主要数据和详细数据同步。单击 DESTCITY 列标题以查看表组件如何对行进行排序。
执行更多操作
试试看。将静态文本组件添加到下拉列表组件的右侧。右键单击静态文本组件,选择“绑定到数据”,然后将该组件绑定到 PERSON.JOBTITLE。接下来,运行程序并从下拉列表中选择不同的名称。请注意,职位名称不会发生改变。这是因为应用程序需要将 personDataProvider 与下拉列表中的选定项同步。将下面以粗体显示的代码添加到 prerender 方法中,然后重新运行应用程序。现在,职位名称会与选定的名称相匹配。
| 代码样例 5:将 personDataProvider 与选定的人员同步 |
public void prerender() {
if ( personIdDD.getSelected() == null ) {
try {
personDataProvider.cursorFirst();
getSessionBean1().getTripRowSet().setObject(
1, personDataProvider.getValue("PERSON.PERSONID"));
tripDataProvider.refresh();
} catch (Exception e) {
error("Cannot switch to person " +
personDataProvider.getValue("PERSON.PERSONID"));
log("Cannot switch to person " +
personDataProvider.getValue("PERSON.PERSONID"), e);
}
}
else {
try {
// Synchronize data provider with current selection
personDataProvider.setCursorRow(
personDataProvider.findFirst(
"PERSON.PERSONID", personIdDD.getSelected()));
} catch (Exception e) {
error("Cannot switch to person " +
personIdDD.getSelected());
log("Cannot switch to person " +
personIdDD.getSelected(), e);
}
}
}
|
试试看。试用表的布局选项。右键单击表组件,然后从弹出式菜单中选择“表布局”。将“表头文本”更改为 "Departure Date"、"Departure City"、"Destination City" 和 "Description"。使用对话框中的“选项”标签将表的标题设置为 Trips。选择“启用分页”,并将“页面大小”设置为 "3"。运行应用程序并查看您的更改是如何影响表的显示方式的。
注意:如果使用分页选项,请在 personIdDD_processValueChange 方法中的 tripDataProvider.refresh() 语句之后,添加以下代码:tableRowGroup1.setFirst(0);。这样,就可以确保从下拉列表中选择新名称时始终显示第一页。
试试看。使用下拉列表组件和表组件生成 Web 应用程序。使下拉列表组件显示 TRIPTYPE.DESCRIPTION。使表组件显示与所选 TRIPTYPE 具有相同 TRIPTYPEID 的所有 TRIP 记录。
试试看。您可能想知道 prerender 和 personIdDD_processValueChange 方法中的重复代码是否会导致详细行集刷新两次。答案是否定的。为了便于说明,请将 log(method-name) 语句添加到 constructor、prerender 方法和 personIdDD_processValueChange 中。
在“运行环境”窗口中,右键单击服务器节点,
然后选择“查看服务器日志”。运行程序,然后选择一个新名称。在服务器日志(位于“输出”窗口)中,您会看到方法是按以下顺序调用的:
- constuctor
- prerender
- constuctor
- personIdDD_processValueChange
当浏览器第一次请求页时,应用程序会创建 Page1 的实例并调用 prerender。服务器会发送响应(即 HTML 页),然后销毁 Page1 实例。应用程序不调用值更改事件处理程序,因为应用程序仅在提交页时(在本例中为选定新的人员时)才生成值更改事件。
从下拉列表中选择新名字时,浏览器将提交页。应用程序会创建 Page1 的新实例,并恢复以前实例的值(它们在请求中传递)。因为这是一个传回(提交)操作,而且名字已经更改,所以应用程序生成了值更改事件。因此,调用了 personIdDD_processValueChange,而且应用程序刷新了行集。
调用值更改事件处理程序后,应用程序会调用 prerender 方法。由于下拉列表此时具有选定值,因此应用程序将跳过 prerender 方法中的 if 部分。
小结
将组件绑定到数据库表的步骤如下:
- 将数据库表的节点拖放到组件上,或从弹出式菜单中选择“绑定到数据”,然后从下拉列表中选择现有的数据提供器,以将组件绑定到数据库表。
- 使用“绑定到数据”对话框以配置组件所显示的数据库列,对于列表类型组件还可以配置它所返回的列。您还可以使用“表布局”菜单操作来配置表组件显示哪些数据库表列。
- 从“概要”窗口打开 RowSet 对象的查询编辑器,以修改 RowSet 对象的查询。
- 调用 RowSet 对象的
setObject 方法,以设置查询参数的值。调用数据提供器的 refresh 方法,以执行查询并刷新结果集。
- 使用“更改时自动提交”菜单操作,在组件的值发生更改时自动提交页。
执行以下步骤以同步详细组件与主要组件:
- 在页面 Bean 的
prerender 方法中添加代码,以调用详细 RowSet 对象的 setObject 方法,从而将查询参数设置为某个缺省值,如下拉列表中的第一个人。然后,调用 refresh 方法执行查询。
- 将主组件绑定到 processValueChanged 方法。使此方法调用详细 RowSet 对象的
setObject 方法,以设置新的查询参数。然后,调用 refresh 方法执行查询。
另请参见:
- 深入研究组件
- “帮助”>“Javadoc 引用”>“数据提供器”
- "JHelp" >“Javadoc 引用”>“行集”
此页的最新修改时间:2007 年 5 月 24 日