概述
该章节讲述了一个典型的数据提交页面,可以利用复选框来同时更新或删除记录。同时展示了UpdateCommand的submitScope的灵活性。
本章节讲述如何开发Dorado Sample Center中的数据提交,目前在示例中心->分类示例->数据处理目录下面。示例链接如下:
准备工作
新建一工程update,并且配置好数据库,具体步骤参考3.1.2节。
开发步骤
添加Dataset
步骤1:新建一Common ViewModel,文件名为update。
步骤2:添加一AutoSqlDataset,选中表Employee,选中的字段如下图所示:

AutoSqlDataset属性如下:
属性 | 值 |
id | datasetEmployee |
originTable | EMPLOYEE |
keyFields | employee_id |
步骤3:选中datasetEmployee的Fields节点,给datasetEmployee添加一个DummyField,即虚拟字段,添加DummyField的按钮位置如下:

设置DummyField的属性如下:
属性 | 值 |
|---|---|
name | select |
dataType | boolean |
步骤4:新建一AutoSqlDataset,选中表Log,选中全部字段。AutoSqlDataset的id设置为datasetLog。
添加DataTable
步骤1:添加一DataTable,属性设置如下:
属性 | 值 |
|---|---|
id | tableEmployee |
dataset | datasetEmployee |
width | 100% |
showHScrollBar | false |
height | 100% |
步骤2:点击tableEmployee生成字段按钮。
步骤3:添加一DataTable,属性设置如下:
属性 | 值 |
|---|---|
id | tableLog |
dataset | datasetLog |
width | 100% |
showHScrollBar | false |
步骤4:点击tableLog生成字段按钮。
添加ViewModel Implementation
步骤1:选中根节点View,点击Open Implementation的按钮,如下图所示:

步骤2:会提示当前View没有Implementation,选择yes,则出现如下对话框,在这里直接点击OK即可。

步骤3:编写updateViewModel代码,代码如下:
import java.util.Date;
import com.bstek.dorado.common.DoradoContext;
import com.bstek.dorado.common.MessageHelper;
import com.bstek.dorado.data.Dataset;
import com.bstek.dorado.data.ParameterSet;
import com.bstek.dorado.data.Record;
import com.bstek.dorado.data.RecordIterator;
import com.bstek.dorado.data.db.DBStatement;
import com.bstek.dorado.utils.variant.DataType;
import com.bstek.dorado.view.DefaultViewModel;
/**
* updateViewModel
*/
public class updateViewModel extends DefaultViewModel {
public void deleteSelection(ParameterSet parameters,
ParameterSet outParameters) throws Exception {
int count = 0;
Dataset datasetEmployee = getDataset("datasetEmployee");
RecordIterator iter = datasetEmployee.recordIterator();
while (iter.hasNext()) {
Record record = iter.nextRecord();
datasetEmployee.deleteRecord(record);
count++;
}
MessageHelper.addMessage(DoradoContext.getContext(), "共有" + count
+ "条记录被删除!");
super.doUpdateData(parameters, outParameters);
}
public void raiseSalary(ParameterSet parameters, ParameterSet outParameters)
throws Exception {
Dataset datasetEmployee = getDataset("datasetEmployee");
if (datasetEmployee.getCurrent() != null) {
float salary = datasetEmployee.getFloat("salary") + 500;
datasetEmployee.setFloat("salary", salary);
MessageHelper.addMessage(DoradoContext.getContext(), "["
+ datasetEmployee.getString("employee_name") + "]已加薪至"
+ salary + "!");
}
super.doUpdateData(parameters, outParameters);
}
public void saveAndLog(ParameterSet parameters, ParameterSet outParameters)
throws Exception {
int count = 0;
DBStatement statement = new DBStatement();
statement.setSql(DBStatement.INSERT, "LOG");
try {
Dataset datasetEmployee = getDataset("datasetEmployee");
RecordIterator ri = datasetEmployee.recordIterator();
ri.setVisibility(Dataset.FILTER_CHANGED); // 确保遍历到每一条有变化的记录
while (ri.hasNext()) {
Record record = ri.nextRecord();
String operation;
switch (record.getState()) {
case Record.STATE_NEW:
operation = "[Insert] ";
break;
case Record.STATE_MODIFIED:
operation = "[Modify] ";
break;
case Record.STATE_DELETED:
operation = "[Delete] ";
break;
default:
operation = "[Unknown]";
}
statement.parameters().setDataType("MSG_TIME",
DataType.DATETIME);
statement.parameters().setDate("MSG_TIME", new Date());
statement.parameters().setString("MSG",
operation + " " + record.getString("employee_name"));
statement.execute();
count++;
}
} finally {
statement.close();
}
super.doUpdateData(parameters, outParameters);
if (count > 0) {
MessageHelper.addMessage(DoradoContext.getContext(), "已添加了\""
+ count + "\"条日志记录!");
}
}
}
添加Command和Button
步骤1:添加一UpdateCommand,属性如下:
属性 | 值 |
|---|---|
id | commandSave |
async | true |
步骤2:选中commandSave下的DatasetInfos,点击添加DatasetInfo按钮,位置如下:

添加DatasetInfo以后,设置Dataset属性为datasetEmployee。
步骤3: 添加一Button,属性如下:
属性 | 值 |
|---|---|
id | buttonSave |
value | 保存 |
command | commandSave |
步骤4:添加一UpdateCommand,属性如下:
属性 | 值 |
|---|---|
id | commandDelete |
method | deleteSelection |
步骤5:为commandDelete添加DatasetInfo,设置其属性如下:
属性 | 值 |
|---|---|
dataset | datasetEmployee |
submitScope | selected |
步骤6:添加一Button,属性如下:
属性 | 值 |
|---|---|
id | buttonDelete |
value | 删除选中记录 |
command | commandDelete |
步骤7:添加一UpdateCommand,属性如下:
属性 | 值 |
id | commandRaiseSalary |
method | raiseSalary |
步骤8:为commandRaiseSalary添加一DatasetInfo,属性如下:
属性 | 值 |
|---|---|
dataset | datasetEmployee |
submitScope | current |
步骤9:添加一Button,属性如下:
属性 | 值 |
|---|---|
id | buttonRaiseSalary |
value | 为当前员工加薪 |
command | commandRaiseSalary |
步骤10:添加一UpdateCommand,属性如下:
属性 | 值 |
|---|---|
id | commandSaveAndLog |
method | saveAndLog |
步骤11:给commandSaveAndLog的onSuccess事件添加如下代码:
datasetLog.flushData();
步骤11:给commandSaveAndLog添加两个DatasetInfo,其dataset分别设置为datasetEmployee和datasetLog。
步骤12:添加一Button,属性如下:
属性 | 值 |
|---|---|
id | buttonSaveLog |
value | 保存并记录日志 |
command | commandSaveAndLog |
创建Jsp页面
生成Jsp页面以后再编辑一下布局,最后结果如下:
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %> <html> <head> <title>更新</title> </head> <body> <d:View config="update"> <d:Layout type="border"> <d:Pane position="top"> <d:Button id="buttonSave" /> <d:Button id="buttonDelete" /> <d:Button id="buttonRaiseSalary" /> <d:Button id="buttonSaveLog" /> </d:Pane> <d:Pane position="center"> <d:SplitPanel id="sp1" orientation="vertical" position="70%" width="100%" height="100%" showButtons="true"> <d:DataTable id="tableEmployee" /> <d:Splitter /> <d:DataTable id="tableLog" /> </d:SplitPanel> </d:Pane> </d:Layout> </d:View> </body> </html>
查看运行效果
启动服务器后,浏览效果如下:

知识点
关于Dataset的DummyField,可以参考《Dorado 5用户指南v1.1》的5.1.3.2节。关于ViewModel实现,可以参考《Dorado 5用户书册v1.1》的第5章。关于CommandUpdate,可以参考《Dorado 5组件详解 v1.1》的C部分第二章。