Dorado 5 : a.远程方法调用 (T1A)

远程方法调用,主要通过RPCCommand对象与UpdateCommand对象实现,类似于方法调用,远程方法调用必定要允许开发人员动态指定方法调用的输入参数集合以及方法调用结束之后,允许开发人员根据程序运行结果,将输出参数反馈给客户端。客户端可以在远程方法调用结束之后获取输出参数,进行页面逻辑处理。
远程方法调用Command的共同属性

  1. async:该属性决定Command命令是否允许异步调用;
  2. method:该属性用以指定远程调用的方法名称;
  3. showLoadingTip:该属性用以设定命令执行时是否显示"正在执行..."提示框;

另外Command对象都拥有parameters属性集合与outParameters属性集合,分别作为远程方法调用的输入参数集合与输出参数集合。

Command使用方法

Command的使用方法如下:

  1. 设定command的method属性,指定要调用的远程方法;
  2. 设定command的parameters集合,用以设定要传递到远程方法的相关参数值;
  3. 执行command的execute方法,激活远程方法调用;
  4. 在远程方法中接收客户端上传的参数集合并调用后台的业务逻辑代码;
  5. 在后台的业务逻辑代码调用结束之后,初始化并生成输出参数集合;
  6. 在客户端command的execute返回值为true的时候获取远程方法返回的outParameters中的值,并处理页面逻辑;

其中Command的execute方法在远程方法调用结束之后,并从远程方法获得反馈结果时,会返回一个true或false值,用以表示远程方法调用成功还是失败,如:

 if (command.execute()) alert("调用成功!"); 
else alert("调用失败!");

同样的处理逻辑我们也可以放在command的onSuccess与onFailure事件中处理。
事件调用顺序图如下:

范例实做

以下范例实现一个视图模型实现类的远程方法调用,由于范例宗在说明远程方法的调用机制,所以该例子被设计为实现一个加法功能。客户端输入两个数字,并通过command的parameters传递到远程方法中,由远程方法负责运算,并将合计值返回到客户端。

新建视图模型CommandRpc

在新建的视图模型中,在Controls中添加两个TextEditor,id分别为editorNum1,editorNum2, 分别对应实现加法运算的两个运算子。
另为了使界面看上与好看一些,我们添加一个Lable对象labeAdd,并设置其value为"+",以及一个Button对象buttonEquals,其value属性为"="。
最终效果如下:

添加RPCCommand对象

添加RPCCommand对象commandRpc。并在buttonEquals按钮的onClick事件中添加代码如下:

 commandRpc.parameters().setValue("num1",editorNum1.getValue()); 
 commandRpc.parameters().setValue("num2", editorNum2.getValue()); 
 commandRpc.execute();

定义视图模型实现类的远程方法

利用向导新增当前视图模型的一个实现类,并在其中添加如下的方法:

 public void remortCall1(ParameterSet parameters, ParameterSet outParameters) 
 throws Exception { 
 }

设定commandRpc的method属性为remortCall1。表示commandRpc调用execute()方法时,将激活这个remortCall1方法。注意观察这个方法,其中parameters就是commandRpc调用之前我们对其中num1与num2赋值操作的commandRpc的parameters对象,而outParameters是我们计划返回给客户端的参数集合,则我们可以修改remortCall1方法为:

 public void remortCall1(ParameterSet parameters, ParameterSet outParameters) 
 throws Exception { 
 	int num1 = parameters.getInt("num1"); 
 	int num2 = parameters.getInt("num2"); 
 	outParameters.setInt("result", num1*num2); 
 }

这样就将运算结果放在outParameters中,并利用command远程调用机制,outParameters最终会被返回到客户端。则我们就可以判断commandRpc的execute方法返回的结果为true情况下取出outParameters中的值。如:

 commandRpc.parameters().setValue("num1",editorNum1.getValue()); 
 commandRpc.parameters().setValue("num2", editorNum2.getValue()); 
 var success = commandRpc.execute(); 
 if (success){ 
 	alert(commandRpc.outParameters().getValue("result")); 
 } 
 else{ 
 	alert("调用失败!") 
 }

生成JSP页面并测试

写好所有的处理逻辑之后,就可以利用视图模型的JSP生成向导生成JSP页面,并在浏览器中运行测试加法运算:

输入完后按=按钮,得到最终运算后的返回结果:

UpdateCommand

通常情况下,执行一个远程方法调用,我们通过RPCCommand实现就基本可以满足需求,开发人员只要在调用command的execute()方法之前,将需要交给远程方法的参数放在parameters()集合中就可以,但是对于一些特殊情况,例如我们在方法调用的时候还希望提交一个二维结构的数据表,如客户端的dataset,则我们使用默认的RPCCommand对象的parameters()集合保存dataset的信息就显得不太方便了。幸好dorado5中提供了UpdateCommand对象,帮助我们解决这个问题。查看如下的UpdateCommand对象的设置:

通过该组件对象的属性观察,我们注意到其中包含一个DatasetInfos的特殊属性集合,这就是UpdateCommand与RPCCommand对象的最大不同之处,在实际使用时我们可以通过该属性指定本视图模型中的多个dataset对象,使得该命令执行时可以同时将datasetInfos中关联的dataset对象信息一起发送到远程方法中。
使用方法如下:
在UpdateCommand的DatasetInfos中添加新的节点,并使它关联到当前视图模型的某一个dataset对象,如下图:

在远程方法中通过getDataset(String datasetId)方法获取UpdateCommand对象提交过来的dataset对象,代码如下:

 Dataset dataset = getDataset("datasetEmployee");

这样我们就可以利用dataset的数据访问接口获取其中的数据,以便于做后续业务逻辑。
另外一个UpdateCommand值得我们注意的一个属性是alwaysPerform,由于UpdateCommand一般用于数据提交,而dorado基于网络数据量的考虑,默认情况下如果DatasetInfos中定义的dataset没有合适的数据提交到远程方法中,就不执行提交动作,dorado认为其是多余的动作,而如果在实际环境中,可能我们又想必须调用远程方法,使其执行,则我们可以通过修改alwaysPerform属性为true,强制UpdateCommand执行时一定要调用远程方法。