本教程介绍了如何使用具备web功能的netbeans ide构建一个可以创建、检索、更新和删除数据库行的web应用程序。该应用程序提供一个主数据的下拉列表以及一个同步的详细信息表。该 应用程序的用户可以在详细信息表及其关联数据库中添加、更新和删除记录。
本教程使用了其他基础教程中介绍的一些概念。如果您不具备 ide 及其设计组件的基本知识,可以考虑首先阅读一些入门教程,比如visual web jsf应用程序开发入门和使用databound组件访问数据库。
测试应用程序:第1部分
单击主工具栏上的run main projec 按钮 以生成、部署和运行项目。当web浏览器呈现此页面时,您会看到一些名字填充了下拉列表,并且表也由一些数据进行了填充。当您从列表中选择某个名字时,与该名字相关的旅程就会显示在表格中。
添加插入功能
在此部分,我们将通过在数据库中插入行集,实现将行程添加到表中的功能。首先,为table的text field提供message组件。这些组件可确保当用户输入错误信息时可以看见错误。然后,在页面中添加一个按钮,以便用户可以通过它将新行添加到数据缓冲区中。
1. 单击design按钮以便在visual designer中查看page1。
2. 在palette的basic区域中,将message组件分别拖放到table的前三列每列的最顶层text field中。
3. 选择第一个message组件。在properties窗口中,滚动至for属性,并从下拉列表中选择textfield1选项。只有当message与text field正确关联时,message文本才会显示关联信息,如图11所示。
4. 将第二个message组件的for属性设置为textfield2。
5. 将第三个message组件的for属性设置为textfield3。
6. 在palette的basic区域,将一个button组件拖到page1中并将其放在靠近第二列顶端的table组件的上面,如图12所示。
特别注意:在ie7中有一个影响jsf 1.2 button组件宽度的已知问题。解决方法是将button组件放在布局组件(grid panel、group panel 或 layout panel)的上面。重设布局组件的大小会自动重设button组件的大小。
7. 将文本从button更改为add trip。
8. 在properties窗口中,将按钮的id属性更改为add。
9. 在visual designer中,双击按钮以打开java editor,插入点将位于该按钮的add_action事件处理程序方法中。
10.将下面以粗体显示的代码添加到该按钮的事件处理程序方法中:
代码示例 3:添加行程操作的代码
public string add_action() {
try {
rowkey rk = tripdataprovider.appendrow();
tripdataprovider.setcursorrow(rk);
tripdataprovider.setvalue(trip.tripid, new integer(0));
tripdataprovider.setvalue(trip.personid, persondd.getselected());
tripdataprovider.setvalue(trip.triptypeid, new integer(1));
} catch (exception ex) {
log(error description, ex);
error(ex.getmessage());
}
return null;
}
11.在java编辑器中单击鼠标右键,然后选择fix imports选项以解决“未找到 rowkey”的错误。
ide会将下包添加到导入语句的page1.java段:
import com.sun.data.provider.rowkey;
测试应用程序:第2部分
通过单击run main project按钮 以生成、部署和运行项目。当web浏览器呈现此页面时,将显示add trip按钮,如下图所示。每次单击该按钮时,都会在表的底部附加一个新的空行。可以编辑行中的信息,但由于尚未提供行集的保存机制,因此,从下拉列表中选择其他名字时,所做的更改将会丢失。
修改页面以保存行集
在此部分,将添加第二个行集到项目中。该行集用于计算已使用的最大行程id。
1. 单击编辑器窗口中的design以返回visual designer中的page1。
2. 打开services窗口,选择databases > travel > tables > trip表,将其拖动到navigator窗口中的sessionbean1节点上。
3. 该操作将为sessionbean1创建两个新子节点:tripdataprovider和triprowset1。
4. 在add new data provider对话框中,选择create sessionbean1/triprowset1单选按钮,将数据提供程序名称更改为maxtriprowset,然后单击ok按钮。
注意: 行集在对话框中出现了两次。这是一个已知问题,请予以忽略。这不会影响本教程中的应用程序。
此操作将在sessionbean1中创建maxtripdataprovider和maxtriprowset。
5. 在navigator窗口中,双击sessionbean1 > maxtriprowset以打开query editor。在source code窗格(从顶部开始第三个)中单击鼠标左键。删除此处现有的sql查询,然后输入以下查询:
select max(travel.trip.tripid)+1 as maxtripid from travel.trip
您将会使用save按钮(下一步您将会添加)的操作处理器中的maxtripid值。
6. 关闭query editor。
注意: query editor的图形化编辑器不支持此查询。如果您看见一个警告对话框提示语法错误,您可以单击continue按钮忽略它。
将用户更改保存到数据库
1. 在靠近第一列顶部的table组件上放置一个button组件。为了准确定位
2. 将按钮文本从button更改为save changes。
3. 在properties窗口中,将id属性更改为save。
4. 右键单击save changes按钮,并从弹出菜单中选择configure virtual forms选项。
5. 在configure virtual forms对话框中,请确保save显示在左上角的列表中,这样您在此窗口中的更改可以应用到save changes按钮中。然后,选择save虚拟表单,将submit值更改为yes,并单击ok按钮。
6. 在visual designer中,双击save changes按钮以打开java editor。在java editor中,插入点将位于该按钮的save_action事件处理程序方法中。
7. 将下面以粗体显示的代码添加到该按钮的事件处理程序方法中:
代码示例 4:保存操作代码
public string save_action() {
try {
// get the next key, using result of query on maxtrip data provider
cachedrowsetdataprovider maxtrip = getsessionbean1().getmaxtripdataprovider();
maxtrip.refresh();
maxtrip.cursorfirst();
int newtripid = ((integer) maxtrip.getvalue(maxtripid));
// navigate through rows with data provider
if (tripdataprovider.getrowcount() > 0) {
tripdataprovider.cursorfirst();
do {
if (tripdataprovider.getvalue(trip.tripid).equals
(new integer(0))) {
tripdataprovider.setvalue(trip.tripid,
new integer(newtripid));
newtripid++;
}
} while (tripdataprovider.cursornext());
}
tripdataprovider.commitchanges();
} catch (exception ex) {
log(error description, ex);
error(error :+ex.getmessage());
}
return null;
}
测试应用程序:第3部分
通过单击run main project按钮以生成、部署和运行项目。应用程序将可以实现以下功能:
l 可以添加行程并进行保存。然后,该行程将显示在表中并持续存在。如果选择其他人员,然后返回到此人员,则会看到所添加的行程。
l 可以编辑现有的行程信息,并保存所做的更改。
l 如果在date字段中输入除日期之外的内容,应用程序将提供一条错误消息。
l 在保存之前您可以多次单击add trip按钮,这是一次添加多行的简便方法。如果在保存更改时任何行仍然为空,则会将其保存为空行。
l 如果在单击save changes之前您切换到其他人员,则会丢失所有更新。
l 如果修改了某些值,然后单击某个列标题以按该列进行排序,则table组件会记住这些暂挂的更改,随后可以保存这些更改。
添加删除功能
在此部分,我们将在表中添加删除功能。利用此功能,用户能够通过从数据库中删除某行来删除行程。在本教程中,delete按钮的操作是即时的,并且从数据库中删除行时并不需要使用save changes按钮。实际上,由于delete按钮的事件处理器使用commitchanges方法,它也会像save changes按钮一样保存所有待定的更改。
向每行添加一个delete按钮
1. 单击编辑器窗口中的design以返回visual designer中的page1,然后右键单击trips summary表,并从弹出菜单中选择table layout选项。这将打开table layout对话框。
2. 如有必要,单击columns选项卡,然后单击new按钮,将一个新列添加到表中。
3. 在selected列表中选择新列的名称后,在column details区域中进行以下更改:
a. header和footer text:删除 header和footer文本字段中的任何默认文本,使其保持空白。
b. component type: button
c. value expression: delete
d. width: 删除任何缺省值,使其保持空白。
e. horizontal align: center
f. vertical align: middle
g. 单击ok按钮。
4. 选择表中最上面的delete按钮,然后在properties窗口中,将id属性设置为delete。
添加事件代码
1. 双击delete列中的第一个按钮,以在delete_action事件处理器方法中打开java editor。
2. 将下面以粗体显示的代码添加到该按钮的事件处理程序方法中:
代码示例 5:删除操作代码
public string delete_action() {
form1.discardsubmittedvalues(save);
try {
rowkey rk = tablerowgroup1.getrowkey();
if (rk != null) {
tripdataprovider.removerow(rk);
tripdataprovider.commitchanges();
tripdataprovider.refresh();}
} catch (exception ex) {
log(errordescription, ex);
error(ex.getmessage());
}
return null;
}
测试应用程序:第4部分
通过单击run main project按钮以生成、部署和运行项目。下图显示了该运行应用程序。
部署后,您应该可以从表中删除行,进而将其从数据库中删除。删除操作还会将所有待定更改提交到数据库。
添加恢复功能
现在,将恢复功能添加到页面中。使用此功能,用户将可以放弃其编辑并恢复为以前保存的数据。注意:恢复功能不能恢复已保存或删除的行;save changes和delete 按钮会将更改提交到数据库。
添加revert changes按钮
1. 单击编辑器窗口中的design以返回到visual designer中的page1,然后从palette中拖一个button组件到page1。将该新button放在add trip按钮的右侧。
2. 将按钮文本更改为revert changes。
3. 在properties窗口中,将该button组件的id属性更改为revert。
4. 双击revert changes按钮以在revert_action方法中打开java editor。
5. 将下面代码样例中以粗体显示的代码添加到revert_action方法中。
代码示例 6:恢复操作代码
public string revert_action() {
form1.discardsubmittedvalues(save);
try {
tripdataprovider.refresh();
} catch (exception ex) {
log(error description, ex);
error(ex.getmessage());
}
return null;
}
配置虚拟表单
如果应用程序使用目前的配置,则会出现一些不理想的行为。例如,如果用户在现有行的第一列中输入无效日期,然后单击add按钮,操作将会失败,由于日期转换错误而拒绝提交表单。用户单击add按钮时的理想行为是:放弃处理表中的输入字段,以便在忽略现有行的暂挂编辑内容的情况下添加新行。
同样地,当用户单击revert按钮时(其目的是放弃所有编辑内容),也应该忽略以上情况的编辑内容。但是,当用户单击delete按钮时,您仍然希望进行验证,因为此按钮不仅删除某个行,而 且还会提交所有暂挂的更改,这要求先处理输入字段。
要为确保用户在单击add或revert按钮时放弃处理(包括验证检查)页面上的输入字段,您可以让这些按钮提交虚拟表单。在这种情况下,您可以使两个按钮提交同一个虚拟表单,因 为它们需要一个没有参与者的虚拟表单。
1. 在visual designer中,按ctrl键的同时单击以选择add、revert和delete按钮,单击鼠标右键,然后从弹出菜单中选择configure virtual forms选项。
在configure virtual forms窗口中,add、revert和delete应出现在左上角,表明这些按钮处于选定状态。
2. 在configure virtual forms窗口中,单击new按钮,将该新虚拟表单命名为add/revert/delete,然后将submit设置为yes。单击ok按钮。
测试应用程序:第5部分
通过单击run main project按钮 以生成、部署和运行项目。部署后,程序可执行以下功能:
l 从下拉列表中选择一个名字,并显示此人的行程摘要。
l 编辑现有的行程信息,并将更改保存到数据库中。
l 编辑具有不正确的日期格式的现有行程信息,然后单击add trip按钮添加新行,或者单击revert changes按钮放弃编辑。
l 在表中添加行,填写行程字段,并将更改保存到数据库中。
l 从表中(同时从数据库中)删除行。
l 放弃编辑内容,并恢复为数据库中最近保存的数据。
结束语
在本教程中,您将table组件、text field组件以及drop down list组件和数据库中的信息进行了关联。此外,还为组件设置了属性,添加了prerender和事件代码,从而可以插入、更新和删除数据库中的数据,并恢复在表单上输入的更改。您还使用了虚拟表单,这使得应用程序使用一个页面即可,并且在添加行或恢复更改时提交的数据可以绕过有效性检查。