概述
该章节讲述了一个典型的数据提交页面,可以利用复选框来同时更新或删除记录。同时展示了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部分第二章。
Attachments:





