Dorado 5 : 1.3.6.MarmotUpdateCommand(Marmot更新命令) (RF2)

简述

目前很多软件公司的系统架构为了实现自己的业务逻辑层与实现代码的解藕,以及很多系统存在着大量第三方产品的集成工作,使得大家都不约而同的选用了Spring这种轻量的、灵活可配的框架,Spring作为一个成熟的、被广泛认可的IOC框架在dorado的marmot架构中也得到了很好的支持,详细说明参考<<Marmot入门指南.doc>>。Dorado的UpdateCommand对象一般默认都是直接向视图模型的实现类发出请求,并调用其中的相关方法(细节参考UpdateCommand),而MarmotUpdateCommand对象就有所不同,该命令执行时会自动的查找Spring中已经配置好的bean对象,并根据MarmotUpdateCommand中的method属性调用其中的业务方法。
由于其功能类似于UpdateCommand,所以其中的详细说明请参考UpdateCommand.

使用

由于其功能类似于UpdateCommand,所以其中的详细使用请参考UpdateCommand.

基本使用

一个典型MarmotUpdateCommand的定义代码如下:

<Control id="cmdRaiseSalary"
type="MarmotUpdateCommand"
resolver="employeeService"
method="raiseSalary">

<DatasetInfos>
<DatasetInfo dataset="dsEmployee" submitScope="current" />
</DatasetInfos>
<Parameters />
</Control>

DatasetInfos节点的说明参考UpdateCommand的基本使用中的内容。
而command的method属性用于指定spring中resolver指定的bean对象的方法名
MarmotUpdateCommand被执行时会自动将DatasetInfos中定义的记录集按照submitScope的范围查询需要提交的数据信息并收集好,按照method指定的方法向指定的resolver发出请求并传送这些数据。
employeeService在spring的配置如下:

<bean id="employeeService" parent="txProxyTemplate">
<property name="target">
<bean class="sample.view.EmployeeService"/>
</property>
</bean>

employeeService中定义一个方法,如上例就为raiseSalary,在raiseSalary内部可以访问客户端提交过来的数据,范例如下:

public Object raiseSalary(Map dataSetMap, Object parameter)
throws Exception {
DataSet dsEmployee = (DataSet) dataSetMap.get("dsEmployee");
return null;
}

通过参数datasetMap参数传入一个dataset的id获得客户端提交过来的数据,并且以DataSet结构封装。服务器端dataset与客户端的dataset具有相同的结构,并且提供了非常丰富的接口便于开发人员访问和使用它。
根据MarmotUpdateCommand的Method设定,可以在resolver中定义一个方法响应MarmotUpdateCommand的请求。详细说明请参考<<Marmot入门指南.doc>>。

参数使用

参考UpdateCommand的参数使用

事件处理

参考UpdateCommand的事件处理h2.关于outParameters()的作用
MarmotUpdateCommand的resolver方法调用,允许开发人员在resolver中返回一些自定义的信息,并且可以在客户端通过脚本从MarmotUpdateCommand的outParameters()参数集合中获取这些信息。注意写法与UpdateCommand不一样。开发人员需要自己创建一个Map对象,并作为方法的返回值。
范例:
employeeService代码:

public Object raiseSalary(Map dataSetMap, Object parameter)
throws Exception {
DataSet dsEmployee = (DataSet) dataSetMap.get("dsEmployee");

Employee employee = (Employee) dsEmployee.getRecords().iterator().
next();
float originalSalary = employee.getSalary();
float newSalary = originalSalary + 500;
employee.setSalary(newSalary);
employeeManager.update(employee);

Map outParameters = new HashMap();
outParameters.put(
"msg",
employee.getName() + "'s salary raised from " +
originalSalary + " to " + newSalary + " !");
return outParameters;
}

command调用命令:

var result = cmdRaiseSalary.execute();//根据result判断是否调用成功
if (result) alert(cmdRaiseSalary.outParameters().getValue("msg"));

常用技巧

动态添加参数

动态编程

在服务器段动态生成MarmotUpdateCommand

protected void initControls() throws Exception {
super.initControls();//系统默认函数,注意保留
MarmotUpdateCommand cmdUpdate = (MarmotUpdateCommand)createControl("MarmotUpdateCommand ", " cmdUpdate");
cmdUpdate.addDatasetInfo("dsEmployee","current");
cmdUpdate.setResolver("employeeService");
cmdUpdate.setMethod("raiseSalary");
}

使用视图模型实现类提供的createControl方法创建MarmotUpdateCommand对象,注意第一个参数用以指定组件的类型,第二个参数指定新建对象的id.

在服务器段获得View(视图模型)中定义的MarmotUpdateCommand,并动态它的属性

protected void initControls() throws Exception {
super.initControls();//系统默认函数,注意保留
MarmotUpdateCommand cmdUpdate = (MarmotUpdateCommand)getControl("cmdUpdate");
cmdUpdate.addDatasetInfo("dsEmployee","current");
cmdUpdate.setResolver("employeeService");
cmdUpdate.setMethod("raiseSalary");
}

在上面的代码中可以看到通过实现类提供的getControl函数获得我们需要的组件对象,所需要的就是给它一个MarmotUpdateCommand对象的id,注意开发时我们建议您直接在View的设计中添加一个空MarmotUpdateCommand组件,这样我们就可以在initControls方法中通过getControl方法获得这个空的MarmotUpdateCommand对象,并利用该对象提供的API进行各种设定和初始化的工作,如MarmotUpdateCommand的addDatasetInfo(),setResolver()方法。

主要属性说明

参考UpdateCommand的属性说明

属性

说明

resolver

指定spring中配置的bean对象的名称

method

命令执行时自动调用resolver指定bean的方法的名称,如果method为空,则有两个要求:
Resolver指定的bean必须实现org.marmot.view.DataResolver接口;
命令执行时系统自动调用org.marmot.view.DataResolver接口的execute方法,该方法详细定义参考marmot的api文档。

主要事件说明

参考UpdateCommand的事件说明