一直想分享一段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");
}
本文出自 “樵夫的扁担” 博客,谢绝转载!
原文地址:http://8582235.blog.51cto.com/8572235/1971512