1.不要在 BeanShell 中使用 “< / >”

//错误的示例:
Map<String, String> map = new HashMap<String, String>();
 
//正确的示例:
Map map = new HashMap();

2. BeanShell 可引入的包

Joget 支持的所有的java类库都在 jw/WEB-INF/lib 下面 ,如果你想额外的引入包,则需要把jar文件放到这里并重启 tomcat。

常用类库

3. 尽可能的让代码容易调试

//错误的示例:
try {
   	 //do something
} catch (Exception e) {
    LogUtil.error("BeanShell", e, "Error executing script");
}


//正确的示例:
try {
    //do something
} catch (Exception e) {
    LogUtil.error("CRM app - Backend userview", e, "Error retrieving user department in Report category permission");
}

4. 代码函数化

为了可读性和可维护性,编写BeanShell 时,也要像编写 JAVA 代码一样,注意对业务逻辑分步函数化

  • 步骤一
  • 步骤二
  • 步骤三
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.joget.apps.app.model.AppDefinition;
import org.joget.apps.app.service.AppService;
import org.joget.apps.app.service.AppUtil;
import org.joget.workflow.model.service.WorkflowManager;
import org.joget.workflow.model.WorkflowAssignment;
import org.joget.workflow.model.WorkflowProcess;

public void method1(){
	//步骤1


}


public void method2(){
	//步骤2


}
public Object execute(WorkflowAssignment assignment, AppDefinition appDef, HttpServletRequest request) {
	//调用步骤1
	method1();
	//调用步骤2
	method2();


	//后续执行(或者封装为步骤3)
    AppService appService = (AppService) AppUtil.getApplicationContext().getBean("appService");
    WorkflowManager workflowManager = (WorkflowManager) AppUtil.getApplicationContext().getBean("workflowManager");
     
    //get current record id
    String recordId = appService.getOriginProcessId(assignment.getProcessId());
     
    //get process
    WorkflowProcess process = appService.getWorkflowProcessForApp(appDef.getAppId(), appDef.getVersion().toString(), "process2");
     
    //start process
    workflowManager.processStart(process.getId(), null, null, null, recordId, false);
     
    return null;
}
  
//调用方法 , 参数是由 joget 自动注入进去的 。 
//因为是process tool ,所以有这三个参数。 
//具体可以参考注入参数: https://dev.joget.org/community/display/KBv6/Bean+Shell+Programming+Guide#BeanShellProgrammingGuide-UseasProcessToolUseasProcessTool
return execute(workflowAssignment, appDef, request);


5. 一个BeanShell代码块需要在多个tool中使用,则考虑写成插件或者放在环境变量中

如果你的脚本需要在一个应用程序中重复使用多次,或者可以在将来的开发中供其他应用程序使用,请考虑将Bean Shell脚本制作为插件或者使用环境变量引用,而不是在您的应用程序中多次复制和粘贴它。

在这种情况下,很难维护Bean Shell脚本。假设要进行更改,则还必须更新所有使用相同脚本的位置。除此之外,普通的插件实现比Bean Shell解释器运行的脚本具有更好的性能。

  • 直接使用环境变量的示例

6.重用代码中的现有插件,使其更简洁,易于维护

如果您的脚本的一部分可以由Joget Workflow中的现有插件完成,则可以重复使用该插件,而不必再次编写它。 

要重用插件,可以使用PluginManager检索插件  ,然后设置其属性并执行。

例: 

  1. 重用Multi Row Binder插件加载数据
  2. 重用电子邮件工具发送电子邮件

7.样例代码

8.Try catch中不能return

     在BeanShell中的try catch中不能使用return返回数值,使用后无法正常返回结果。如果需要用return,可在try catch外部使用。








使用 “ < / >”可能会出现未知的报错。








如果你不确定是否会有jar包冲突,请不要随意添加jar包!


导入包时,尽量不要使用通配符 * ,因为 beanshell 搜索类库并加载相对来说比较耗时

  • No labels