2019独角兽企业重金招聘Python工程师标准>>>

折腾的起因

清明在家写了一个压榨JDK剩余价值的微型服务+mvc,其中涉及到了模板引擎的使用问题! 起初想着用Freemarker或者copy出JFinal中的模板引擎出来使用,Freemarker.jar就要占用我800多k的空间,与我的想要的微型不符。于是思考着时候可以用能不能用java中的js引擎来解决问题。

js模板的选择

考虑到为微型的mvc,我选择了比较轻量级@贤心 的作品laytpl。(未压缩源码才不到4k)

集成show time

初始化script引擎并将laytpl绑定到全局变量

ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine engine = engineManager.getEngineByMimeType("text/javascript");
InputStream input = LayTemplate.class.getResourceAsStream("laytpl.js");
Reader reader = new BufferedReader(new InputStreamReader(input));
Bindings bindings = engine.createBindings();
engine.setBindings(bindings, ScriptContext.GLOBAL_SCOPE);
engine.eval(reader, bindings);

laytpl的兼容修改

由于laytpl是为浏览器或者nodejs设计,Nashorn中并没有windowconsole等对象和方法。

/**@Name : laytpl v1.2 - 精妙的JavaScript模板引擎@Author: 贤心@Date: 2014-10-27@Site:http://sentsin.com/layui/laytpl@License:MIT*/
var window = {};
var console = {error: function(log) {if ("undefined" != typeof log) {print(log);}},log: function(log) {if ("undefined" != typeof log) {print(log);}}
};// laytpl源码部分,由于篇幅太长省略...var laytpl = window.laytpl;

模板的渲染部分

Bindings bindings = engine.createBindings();// 避免并发问题
bindings.put("_html_", html);
bindings.put("data", data);
String html = (String) template.engine.eval("laytpl(_html_).render(data);", bindings);

集成演示

启动

> du -k dream-mvc.jar
92  dream-mvc.jar
> java -jar dream-mvc.jar
四月 03, 2017 3:01:41 下午 net.dreamlu.saber.server.ActionMapping info
信息: mappinged:[GET -> /]
Server listening on port 8080
Server startup in 107ms

html

<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Insert title here</title>
</head>
<body><h3>{{ d.title }}</h3><p class='intro'>{{ d.intro }}</p><ul>{{# for(var i = 0, len = d.list.length; i < len; i++){ }}<li><span>{{ d.list[i].name }}</span><span>所在城市:{{ d.list[i].city }}</span></li>{{# } }}</ul>
</body>
</html>

Controller

@Controller
public class TestController {@GetMappingpublic String test() {Map<String, Object> data = new HashMap<>();data.put("title", "test");data.put("intro", "hello");List<City> list = new ArrayList<>();list.add(new City("湖北", "hb"));list.add(new City("北京", "bj"));data.put("list", list);return LayTemplate.render("index.html", data);}
}

最终的页面渲染

参考

https://wiki.openjdk.java.net/display/Nashorn/Main

https://github.com/themarcelor/NashornDemo

转载于:https://my.oschina.net/qq596392912/blog/872813

震惊,java8 Nashorn和laytpl居然能擦出这样火花!相关推荐

  1. c语言修仙受控可看吗,强推三本神奇到爆的小说,c语言修仙,程序员与修真会擦出什么火花...

    大家好,我是小龙.今天我给大家推荐三本神奇到爆的小说,c语言修仙,程序员与修真会擦出什么火花! 一<c语言修仙>[一十四洲] [简介]: 林浔是一个程序员,通宵编代码后发现自己身体内多了一 ...

  2. 光明日报:当教育遇上区块链,会擦出什么火花

    说起现在最火的新兴技术,区块链必是处在风口上的答案之一.日前,京津冀大数据教育区块链试验区成立,为"区块链+教育"的融合发展之路,提供了一个新的窗口. 当传统的教育行业与区块链相遇 ...

  3. 5G,上天了!卫星和基站擦出了火花?

    大家好,我是无线深海,我们好久不见. 本期我们来聊聊卫星通信,以及卫星通信和地面通信的融合:非地面网络的故事. 对于5G来说,这可能只是后半场的锦上添花:但对仍处于畅想中的6G来说,空天地海一体化通信 ...

  4. Golang 和 lua 相遇会擦出什么火花?

    在 GitHub 玩耍时,偶然发现了 gopher-lua ,这是一个纯 Golang 实现的 Lua 虚拟机.我们知道 Golang 是静态语言,而 Lua 是动态语言,Golang 的性能和效率各 ...

  5. 安搭Share:当色彩与文物碰撞会擦出什么火花

    每年流行色的发布,都会引发新一轮设计风尚,那么当色彩与文物碰撞会有怎样的呈现呢,如果你有这样的好奇心,不妨一起来看看色彩微妙变化与文物的碰撞. 中国传统正五色主要有青.赤.黄.白.黑,"五色 ...

  6. 机器学习 + NFT,跨界联合可以擦出什么火花?

    前几天在Github上看到一个用SN-GAN技术生成punk的项目,项目地址:https://github.com/teddykoker/cryptopunks-gan,跑了一遍感觉很有趣,所以就研究 ...

  7. java 接口的泛型方法_Java泛型/泛型方法/通配符/泛型接口/泛型泛型擦出

    从JDK1.5以后引入了三大常用新特性:泛型.枚举(enum).注解(Annotation).其中JDK1.5中泛型是一件非常重要的实现技术,它可以帮助我们解决程序的参数转换问题.本文为大家详细介绍一 ...

  8. mysql数据库,当数据类型是float时,查询居然查询不出数据来

    mysql数据库,当数据类型是float时,查询居然查询不出数据来,类似如下: 以后mysql数据库不用float类型,而double类型可以查得出来. 转载于:https://www.cnblogs ...

  9. 当稳定币遇上BCH,将会擦出什么样的火花?

    2019独角兽企业重金招聘Python工程师标准>>> 当稳定币遇上BCH,将会擦出什么样的火花? 币圈太黑了,什么都割,我空仓都被割,拿着USDT都被割-- 2018年10月15日 ...

  10. 5G与智慧杆将擦出什么样的火花?

    伴随着5G时代如火如荼地发展,整合了监控摄像头.5G微基站等硬件,通过信息感知和大数据交互技术,能实现智慧交通.信息发布等功能的智慧灯杆正在城市建设中广泛应用. 那么,问题来了! 在这样的大环境下, ...

最新文章

  1. 人工神经网络发现生物神经网络,智源超高清电镜图像分割挑战赛开赛
  2. java10支持mybatis_写了10年的代码,我最怕写Mybatis这些配置,现在有详解了
  3. 最新php常用函数200个,180多个PHP常用函数总结
  4. c语言sin函数返回nan,C语言入口函数和LD_PRELOAD环境变量
  5. 条件语句和循环语句_总结一下条件语句和循环语句
  6. Pandas 数据框增、删、改、查、去重、抽样基本操作
  7. TCP报文段的首部格式
  8. 18. Window createPopup() 方法
  9. iOS图形学(四):iOS中的绘图框架
  10. Tomcat 修改启动端口号
  11. R语言决策树实战教程
  12. python 残差图_python 残差
  13. 关于ASO优化刷榜、冲榜、维榜、锁榜科普百科
  14. Pycharm2017补丁破解
  15. itools3.0服务器维护,iTools3.0微信管理功能更新 可支持语音信息
  16. Vue中如何关闭语法检查
  17. 腾讯区块链发行多少腾讯区块链如何投资?
  18. 华为高清会议摄像机预置位的使用方法
  19. 微信小程序转码百度小程序
  20. c语言 注册商标标志,什么是标识符?

热门文章

  1. 【Kettle Spoon】数据迁移Spoon的使用
  2. 零点起飞学java web_零点起飞学Java Web开发 (徐林林) 高清PDF_IT教程网
  3. 视频基本原理 -视频接口之 - MIPI接口(五)
  4. Sigma algebra
  5. 博弈论分析题_《博弈论》期末考试试题
  6. 将字符串中大写转小写,小写转大写
  7. 计算机常用的信息表示方法,计算机中信息的表示
  8. 高通see架构ppg测试流程sns_client_test_cpp
  9. 浅谈SQL基础操作概念
  10. 通过路由器SF上网设置方法.....