震惊,java8 Nashorn和laytpl居然能擦出这样火花!
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中并没有window
、console
等对象和方法。
/**@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居然能擦出这样火花!相关推荐
- c语言修仙受控可看吗,强推三本神奇到爆的小说,c语言修仙,程序员与修真会擦出什么火花...
大家好,我是小龙.今天我给大家推荐三本神奇到爆的小说,c语言修仙,程序员与修真会擦出什么火花! 一<c语言修仙>[一十四洲] [简介]: 林浔是一个程序员,通宵编代码后发现自己身体内多了一 ...
- 光明日报:当教育遇上区块链,会擦出什么火花
说起现在最火的新兴技术,区块链必是处在风口上的答案之一.日前,京津冀大数据教育区块链试验区成立,为"区块链+教育"的融合发展之路,提供了一个新的窗口. 当传统的教育行业与区块链相遇 ...
- 5G,上天了!卫星和基站擦出了火花?
大家好,我是无线深海,我们好久不见. 本期我们来聊聊卫星通信,以及卫星通信和地面通信的融合:非地面网络的故事. 对于5G来说,这可能只是后半场的锦上添花:但对仍处于畅想中的6G来说,空天地海一体化通信 ...
- Golang 和 lua 相遇会擦出什么火花?
在 GitHub 玩耍时,偶然发现了 gopher-lua ,这是一个纯 Golang 实现的 Lua 虚拟机.我们知道 Golang 是静态语言,而 Lua 是动态语言,Golang 的性能和效率各 ...
- 安搭Share:当色彩与文物碰撞会擦出什么火花
每年流行色的发布,都会引发新一轮设计风尚,那么当色彩与文物碰撞会有怎样的呈现呢,如果你有这样的好奇心,不妨一起来看看色彩微妙变化与文物的碰撞. 中国传统正五色主要有青.赤.黄.白.黑,"五色 ...
- 机器学习 + NFT,跨界联合可以擦出什么火花?
前几天在Github上看到一个用SN-GAN技术生成punk的项目,项目地址:https://github.com/teddykoker/cryptopunks-gan,跑了一遍感觉很有趣,所以就研究 ...
- java 接口的泛型方法_Java泛型/泛型方法/通配符/泛型接口/泛型泛型擦出
从JDK1.5以后引入了三大常用新特性:泛型.枚举(enum).注解(Annotation).其中JDK1.5中泛型是一件非常重要的实现技术,它可以帮助我们解决程序的参数转换问题.本文为大家详细介绍一 ...
- mysql数据库,当数据类型是float时,查询居然查询不出数据来
mysql数据库,当数据类型是float时,查询居然查询不出数据来,类似如下: 以后mysql数据库不用float类型,而double类型可以查得出来. 转载于:https://www.cnblogs ...
- 当稳定币遇上BCH,将会擦出什么样的火花?
2019独角兽企业重金招聘Python工程师标准>>> 当稳定币遇上BCH,将会擦出什么样的火花? 币圈太黑了,什么都割,我空仓都被割,拿着USDT都被割-- 2018年10月15日 ...
- 5G与智慧杆将擦出什么样的火花?
伴随着5G时代如火如荼地发展,整合了监控摄像头.5G微基站等硬件,通过信息感知和大数据交互技术,能实现智慧交通.信息发布等功能的智慧灯杆正在城市建设中广泛应用. 那么,问题来了! 在这样的大环境下, ...
最新文章
- 人工神经网络发现生物神经网络,智源超高清电镜图像分割挑战赛开赛
- java10支持mybatis_写了10年的代码,我最怕写Mybatis这些配置,现在有详解了
- 最新php常用函数200个,180多个PHP常用函数总结
- c语言sin函数返回nan,C语言入口函数和LD_PRELOAD环境变量
- 条件语句和循环语句_总结一下条件语句和循环语句
- Pandas 数据框增、删、改、查、去重、抽样基本操作
- TCP报文段的首部格式
- 18. Window createPopup() 方法
- iOS图形学(四):iOS中的绘图框架
- Tomcat 修改启动端口号
- R语言决策树实战教程
- python 残差图_python 残差
- 关于ASO优化刷榜、冲榜、维榜、锁榜科普百科
- Pycharm2017补丁破解
- itools3.0服务器维护,iTools3.0微信管理功能更新 可支持语音信息
- Vue中如何关闭语法检查
- 腾讯区块链发行多少腾讯区块链如何投资?
- 华为高清会议摄像机预置位的使用方法
- 微信小程序转码百度小程序
- c语言 注册商标标志,什么是标识符?
热门文章
- 【Kettle Spoon】数据迁移Spoon的使用
- 零点起飞学java web_零点起飞学Java Web开发 (徐林林) 高清PDF_IT教程网
- 视频基本原理 -视频接口之 - MIPI接口(五)
- Sigma algebra
- 博弈论分析题_《博弈论》期末考试试题
- 将字符串中大写转小写,小写转大写
- 计算机常用的信息表示方法,计算机中信息的表示
- 高通see架构ppg测试流程sns_client_test_cpp
- 浅谈SQL基础操作概念
- 通过路由器SF上网设置方法.....