10.4.動作

2023-07-03 17:55 更新

概述

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

操作

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

擴展

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

擴展示例

自定義執(zhí)行存儲過程的BeanShell變量示例:
1.定義ProcedureTemplate對象
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;
/**
 * 存儲過程執(zhí)行對象
 * @author Lucas
 * 
 */
public class ProcedureTemplate extends RapidJdbcDaoSupport {
 /**
 * @param procedureSql
 * 執(zhí)行存儲過程語句
 * @param param
 * 向存儲過程傳遞的參數(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í)行無參存儲過程
 * 
 * @param procedureSql
 * 執(zhí)行存儲過程語句
 */
 public void execute(final String procedureSql) {
 this.getJdbcTemplate().execute(procedureSql);
 }
}
2.將ProcedureTemplate對象注冊為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;
/**
 * 注冊ProcedureTemplate對象實例
 * @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í)行存儲過程的ProcedureTemplate對象實例");
 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)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號