概述
動作是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;
更多建議: