Java引用js代码实现高效动态机制
2017-10-11 18:49
246 查看
一直想分享一段10年Java web开发过程中,最满意一个软件项目的设计与实现,但总是由于自己的懒惰,不爱整理而停止不前,今天终于心血来潮,决定总结分享这段经历。
面对互联网科技时代,作为一名高级软件工程,要想在程序员的道路上一直走下去,那么我们避免不了要开阔自己的脑洞,拥有新的设计理念,一个完美设计理念至少支撑一个产品线,一个坏的理念视乎只能支持一个功能点,未来互联时代要想在软件行业走的一直前行,那么必须走产品路线,最好的产品是支持这一条产品线上的任何个性化需求的。
我之前的项目,就是从产品的理念出发,要求实现一个支持所有个性需求的项目。我们之前做的产品是对账。所谓对账就是两个文件之间中的各条记录,按照记录中唯一标识,对比金额,同时得到四种对账结果记录(金额一致,金额不一致,文件1多,文件2多)这四种结果。不同的对账结果有不同自动处理。同时我们的产品理念是可以支持多个系统间的对账,也就是说要支持不同格式的文件,不同的对账策略,不需要修改代码完成一个这样的产品的设计与实现。经过调研很久,最终我们决定使用Java代码引用js代码。也就是说通过页面配置js策略,然后利用对比文件的实现类解析js,实现超动态的产品效果。
代码实现如下:解析js
public Reconciliation createReconciliation(AccCheckCfg accCheckCfg){
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try {
engine.eval(accCheckCfg.getJsScript());
Reconciliation dydzwj = new Reconciliation();//定义对应实体
if (engine instanceof Invocable) {
Invocable invEngine = (Invocable) engine;
invEngine.invokeFunction("putParameters", null, dydzwj,-1);//将脚本中定义的内容复制到dydzwj对象中。
return dydzwj;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
js实例:
function putParameters(pojoInfo,recLog){
pojoInfo.setAutoProcess("01");
pojoInfo.setAutoEsbPath("");
pojoInfo.setTempletPath("");
pojoInfo.setXpath1("/message/body/bankCode");
pojoInfo.setValue1(recLog.getAccSysCode());
pojoInfo.setXpath2("/message/body/transDate");
pojoInfo.setValue2(recLog.getAccCheckTime());
pojoInfo.setXpath3("/message/body/transCode");
pojoInfo.setValue3(recLog.getDataRec1Key());
pojoInfo.setRetXpath1("/message/body/transCode");
pojoInfo.setRetXpath2("/message/body/temp1");
pojoInfo.setRetXpath3("/message/body/temp2");
}
面对互联网科技时代,作为一名高级软件工程,要想在程序员的道路上一直走下去,那么我们避免不了要开阔自己的脑洞,拥有新的设计理念,一个完美设计理念至少支撑一个产品线,一个坏的理念视乎只能支持一个功能点,未来互联时代要想在软件行业走的一直前行,那么必须走产品路线,最好的产品是支持这一条产品线上的任何个性化需求的。
我之前的项目,就是从产品的理念出发,要求实现一个支持所有个性需求的项目。我们之前做的产品是对账。所谓对账就是两个文件之间中的各条记录,按照记录中唯一标识,对比金额,同时得到四种对账结果记录(金额一致,金额不一致,文件1多,文件2多)这四种结果。不同的对账结果有不同自动处理。同时我们的产品理念是可以支持多个系统间的对账,也就是说要支持不同格式的文件,不同的对账策略,不需要修改代码完成一个这样的产品的设计与实现。经过调研很久,最终我们决定使用Java代码引用js代码。也就是说通过页面配置js策略,然后利用对比文件的实现类解析js,实现超动态的产品效果。
代码实现如下:解析js
public Reconciliation createReconciliation(AccCheckCfg accCheckCfg){
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try {
engine.eval(accCheckCfg.getJsScript());
Reconciliation dydzwj = new Reconciliation();//定义对应实体
if (engine instanceof Invocable) {
Invocable invEngine = (Invocable) engine;
invEngine.invokeFunction("putParameters", null, dydzwj,-1);//将脚本中定义的内容复制到dydzwj对象中。
return dydzwj;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
js实例:
function putParameters(pojoInfo,recLog){
pojoInfo.setAutoProcess("01");
pojoInfo.setAutoEsbPath("");
pojoInfo.setTempletPath("");
pojoInfo.setXpath1("/message/body/bankCode");
pojoInfo.setValue1(recLog.getAccSysCode());
pojoInfo.setXpath2("/message/body/transDate");
pojoInfo.setValue2(recLog.getAccCheckTime());
pojoInfo.setXpath3("/message/body/transCode");
pojoInfo.setValue3(recLog.getDataRec1Key());
pojoInfo.setRetXpath1("/message/body/transCode");
pojoInfo.setRetXpath2("/message/body/temp1");
pojoInfo.setRetXpath3("/message/body/temp2");
}
相关文章推荐
- 模拟实现Java动态代理机制
- JAVA动态绑定的内部实现机制
- 【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派
- 【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派
- 动态Proxy与Java ACL用户访问控制机制实现
- [原创]JAVA的动态代理机制及Spring的实现方式
- JAVA动态绑定的内部实现机制(转)-asp.net关注
- 【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派
- Java动态代理的实现机制
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
- 【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派
- JAVA动态绑定的内部实现机制
- 【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派
- java中的动态代理机制实现AOP
- 【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派
- Java动态代理的实现机制
- 模拟实现Struts拦截器-蕴含着代理模式,AOP,工厂模式,依赖注入,Java 反射,动态构造等机制
- JAVA动态绑定的内部实现机制
- 【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派
- [原创]JAVA的动态代理机制及Spring的实现方式