10.4.動(dòng)作

2023-07-03 17:55 更新

概述

動(dòng)作是Rapido當(dāng)中提供的用于實(shí)現(xiàn)將前臺(tái)數(shù)據(jù)提交給后臺(tái)處理或執(zhí)行一個(gè)Ajax調(diào)用的功能,從本質(zhì)上來(lái)說(shuō),它所完成的就是Dorado7當(dāng)中的UpdateAction與AjaxAction兩種類型Action要做的事情。動(dòng)作在定義的過(guò)程當(dāng)中,如果選擇與某實(shí)體關(guān)聯(lián),那么最終將會(huì)生成一個(gè)UpdateAction;如果不選擇與某實(shí)體關(guān)聯(lián),那么它就是一個(gè)AjaxAction。
動(dòng)作定義中,除了可以選擇具體要綁定的實(shí)體外,還允許用戶編寫B(tài)eanShell腳本與綁定若干個(gè)預(yù)先定義好的實(shí)現(xiàn)了IAction接口的實(shí)現(xiàn)類,這樣就盡可能賦予動(dòng)作最大的靈活性,在不編寫Java代碼的情況下完成足夠多的后臺(tái)復(fù)雜的業(yè)務(wù)邏輯,以進(jìn)一步增加Rapido開發(fā)復(fù)雜業(yè)務(wù)頁(yè)面的能力。

操作

切換到Rapido工作區(qū),展開動(dòng)作節(jié)點(diǎn),在需要維護(hù)動(dòng)作的包下雙擊,就可以打開動(dòng)作維護(hù)頁(yè)面,效果如下圖所示:

擴(kuò)展

前面提過(guò),動(dòng)作定義時(shí)可以添加若干個(gè)預(yù)置的“具體動(dòng)作”,它們是一些實(shí)現(xiàn)了IAction接口的配置在Spring當(dāng)中的Java類,在Rapido當(dāng)中默認(rèn)提供了三個(gè)IAction接口實(shí)現(xiàn),分別是:
1. 根據(jù)流程模版的ID,開啟一個(gè)流程實(shí)例。
2. 保存流程任務(wù)審批過(guò)程中的審批意見信息。
3. 根據(jù)任務(wù)ID完成一個(gè)具體的流程任務(wù)。
可以看到,這三個(gè)接口實(shí)現(xiàn)都與流程相關(guān),有了這三個(gè)實(shí)現(xiàn),就可以將Rapido做的頁(yè)面與流程關(guān)聯(lián)起來(lái),從而實(shí)現(xiàn)與流程相關(guān)業(yè)務(wù)頁(yè)面開發(fā)。IAction接口內(nèi)容如下:
package com.bstek.bdf2.rapido.action;
import java.util.Collection;
import java.util.Map;
import com.bstek.bdf2.rapido.domain.Parameter;
/**
 * 用于定義前后臺(tái)交互時(shí)要執(zhí)行的具體動(dòng)作,<br>
 * 動(dòng)作可以累加,也就是說(shuō)可以一次性執(zhí)行多個(gè)當(dāng)前接口的實(shí)現(xiàn)類,<br>
 *
用戶可以通過(guò)實(shí)現(xiàn)該接口,在execute方法中添加具體的需要執(zhí)行的具體邏輯代碼,然后將實(shí)現(xiàn)類配置到spring當(dāng)中即
可
 * @author jacky.gao@bstek.com
 * @since 2012-7-5
 */
public interface IAction {
 /**
 * 返回當(dāng)前動(dòng)作的名稱
 * @return 返回動(dòng)作名稱
 */
 String getName();
 /**
 * 具體要執(zhí)行的動(dòng)作代碼,這里的參數(shù)只有一個(gè)Map,<br>
 * 在這個(gè)Map當(dāng)中包含了當(dāng)前業(yè)務(wù)數(shù)據(jù)的ID(key為businessId)以及所有在動(dòng)作定義時(shí)定義的參數(shù)
 * @param map 外部傳入的參數(shù)
 */
 Map<String,Object> execute(Map<String,Object> map);
 /**
 * 執(zhí)行這個(gè)實(shí)現(xiàn)時(shí)需要哪些參數(shù)
 * @return 返回一個(gè)Parameter對(duì)象實(shí)例集合
 */
 Collection<Parameter> requiredParameters();
}
如果您需要編寫一個(gè)IAction接口實(shí)現(xiàn),那么同樣需要將實(shí)現(xiàn)類配置到Spring上下文當(dāng)中。
在編寫B(tài)eanShell腳本時(shí),除了可以使用Rapido內(nèi)置的變量外,用戶可以通過(guò)實(shí)現(xiàn)com.bstek.bdf2.bsh.VariableRegister,該接口源碼如下:
package com.bstek.bdf.bsh;
import java.util.Map;
/**
 * 注冊(cè)BeanShell腳本中要使用的變量信息,實(shí)現(xiàn)類需要配置到Spring環(huán)境當(dāng)中,<br>
 * 因此在注冊(cè)時(shí)可使用Spring環(huán)境中各種類型的Bean對(duì)象
 * @author jacky.gao@bstek.com
 * @since 2012-8-28
 */
public interface VariableRegister {
 /**
 * 返回注冊(cè)到BeanShell上下文中的變量集合
 * @return 返回一個(gè)變量集合的Map,Map中key為變量名,Value就是一個(gè)VariableInfo對(duì)象,用于描述變量信息
 */
 Map<String,VariableInfo> register();
}
一旦將實(shí)現(xiàn)該接口的Bean配置到Spring當(dāng)中,我們?cè)趧?dòng)作中編寫B(tài)eanShell腳本時(shí)就可以下圖所示的可用腳本變量中看到新加的BeanShell變量信息。

擴(kuò)展示例

自定義執(zhí)行存儲(chǔ)過(guò)程的BeanShell變量示例:
1.定義ProcedureTemplate對(duì)象
package com.bstek.rapido.demo;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.CallableStatementCreator;
import com.bstek.bdf.rapido.RapidJdbcDaoSupport;
/**
 * 存儲(chǔ)過(guò)程執(zhí)行對(duì)象
 * @author Lucas
 * 
 */
public class ProcedureTemplate extends RapidJdbcDaoSupport {
 /**
 * @param procedureSql
 * 執(zhí)行存儲(chǔ)過(guò)程語(yǔ)句
 * @param param
 * 向存儲(chǔ)過(guò)程傳遞的參數(shù)
 * @return
 */
 @SuppressWarnings({ "unchecked", "rawtypes" })
 public Map<String, Object> call(final String procedureSql,
 final Map<String, Object> param) {
 final Map<String, Object> outParam = new HashMap<String, Object>();
 this.getJdbcTemplate().execute(new CallableStatementCreator() {
 @Override
 public CallableStatement createCallableStatement(Connection con)
 throws SQLException {
 CallableStatement cs = con.prepareCall(procedureSql);
 int i = 1;
 for (String key : param.keySet()) {
 Object obj = param.get(key);
 if (obj instanceof String) {
 int j = i++;
 cs.setString(j, (String) obj);
 cs.registerOutParameter(j, Types.VARCHAR);
 } else if (obj instanceof Integer) {
 int j = i++;
 cs.registerOutParameter(j, Types.INTEGER);
 cs.setInt(j, (Integer) obj);
 } else if (obj instanceof Long) {
 int j = i++;
 cs.registerOutParameter(j, Types.INTEGER);
 cs.setLong(j, (Long) obj);
 }
 }
 return cs;
 }
 }, new CallableStatementCallback() {
 @Override
 public Object doInCallableStatement(CallableStatement cs)
 throws SQLException, DataAccessException {
 cs.execute();
 int i = 1;
 for (String key : param.keySet()) {
 Object obj = param.get(key);
 if (obj instanceof String) {
 outParam.put(key, cs.getString(i++));
 } else if (obj instanceof Integer) {
 outParam.put(key, cs.getInt(i++));
 } else if (obj instanceof Long) {
 outParam.put(key, cs.getLong(i++));
 }
 }
 return null;
 }
 });
 return outParam;
 }
 /**
 * 執(zhí)行無(wú)參存儲(chǔ)過(guò)程
 * 
 * @param procedureSql
 * 執(zhí)行存儲(chǔ)過(guò)程語(yǔ)句
 */
 public void execute(final String procedureSql) {
 this.getJdbcTemplate().execute(procedureSql);
 }
}
2.將ProcedureTemplate對(duì)象注冊(cè)為BeanShell變量
package com.bstek.rapido.demo;
import java.util.HashMap;
import java.util.Map;
import com.bstek.bdf.d7.bsh.VariableExecutor;
import com.bstek.bdf.d7.bsh.VariableInfo;
import com.bstek.bdf.d7.bsh.VariableRegister;
/**
 * 注冊(cè)ProcedureTemplate對(duì)象實(shí)例
 * @author Lucas
 * 
 */
public class ProcedureTemplateRegister implements VariableRegister {
 private ProcedureTemplate procedureTemplate;
 public ProcedureTemplate getProcedureTemplate() {
 return procedureTemplate;
 }
 public void setProcedureTemplate(ProcedureTemplate procedureTemplate) {
 this.procedureTemplate = procedureTemplate;
 }
 @Override
 public Map<String, VariableInfo> register() {
 Map<String, VariableInfo> map = new HashMap<String, VariableInfo>();
 VariableInfo procedureTemplateInfo = new VariableInfo();
 procedureTemplateInfo.setName("procedureTemplate");
 procedureTemplateInfo.setDesc("自定義的執(zhí)行存儲(chǔ)過(guò)程的ProcedureTemplate對(duì)象實(shí)例");
 procedureTemplateInfo.setVariableExecutor(new VariableExecutor() {
 public Object execute() {
 return procedureTemplate;
 }
 });
 map.put("procedureTemplate", procedureTemplateInfo);
 return map;
 }
}
3.配置到Spring配置文件中
<bean id="procedureTemplate" class="com.bstek.rapido.demo.ProcedureTemplate" />
<bean class="com.bstek.rapido.demo.ProcedureTemplateRegister">
 <property name="procedureTemplate" ref="procedureTemplate" />
</bean>
4.BeanShell腳本中使用procedureTemplate變量
Map resultMap=new HashMap();
Map paramMap=new HashMap();
 paramMap.put("id","123");
 paramMap.put("name","beanShell");
 resultMap = procedureTemplate.call("exec test_insert ?,?",paramMap);
 resultMap.put("id_test",resultMap.get("id"));
return resultMap;
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)