文档章节

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

如梦技术
 如梦技术
发布于 2017/04/03 15:48
字数 492
阅读 555
收藏 3

折腾的起因

清明在家写了一个压榨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 {
  
  @GetMapping
  public 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

© 著作权归作者所有

共有 人打赏支持
如梦技术

如梦技术

粉丝 320
博文 39
码字总数 15442
作品 4
朝阳
后端工程师
私信 提问
加载中

评论(3)

我的名字叫李猜
我的名字叫李猜
666
如梦技术
如梦技术

引用来自“罗格林”的评论

对空间要求这么高,这个mvc是打算用于嵌入式系统?
😅纯属练手+好玩。
罗格林
罗格林
对空间要求这么高,这个mvc是打算用于嵌入式系统?
Java 8 Nashorn 引擎

Java 8 Nashorn 脚本引擎 java8 终于来了.函数式接口,lambda表达式期待很久了.新的武器在手,应该可以玩出新花样. 前两天无意中发现java8 中还带了另外一个有意思的东西. Nashorn 一个javascr...

架构梦想
2014/03/25
0
33
擦“简”而过

距离饱醉豚先生发表文章(11.06 )过去快一个月了,业内很多朋友也拿着个话题作为茶后笑料。大部分同行已经搬离了简书,尤其是技术大咖。我也从最初喜欢简书的简洁大方到现在的放弃。 看过他...

仇诺伊
2017/12/15
0
0
for in 和 for,以及getElementsByTagName('*')

由于原生js中,没有能通过class获取元素的方法,OK,来,自己写 正在我沾沾自喜的时候,尼玛,出幺蛾子了 页面结构是这样的 我了个擦,返回了一个8个元素的数组,有木有,好难过,这不是我想...

DennisHill
2016/12/27
2
0
Java 8新特性探究(十二)Nashorn :新犀牛

Nashorn是什么 Nashorn,发音“nass-horn”,是德国二战时一个坦克的命名,同时也是java8新一代的javascript引擎--替代老旧,缓慢的Rhino,符合 ECMAScript-262 5.1 版语言规范。你可能想jav...

OSC闲人
2014/07/13
0
28
博为峰Java技术题 ——JavaSE Java 8 新特性

博为峰小博老师: Java 8(又称为jdk1.8)是Java语言开发的一个主要版本 Oracle公司于2014年3月18日发布Java 8它支持函数式编程,新的 JavaScript引擎,新的日期API,新的Stream API等。 [新特性...

博为峰教研组
2016/12/05
3
0

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-2

上篇文章(java框架学习日志-1)虽然跟着写了例子,也理解为什么这么写,但是有个疑问,为什么叫控制反转?控制的是什么?反转又是什么? 控制其实就是控制对象的创建。 反转与正转对应,正转...

白话
44分钟前
2
0
Integer使用双等号比较会发生什么

话不多说,根据以下程序运行,打印的结果为什么不同? Integer a = 100;Integer b = 100;System.out.println(a == b);//print : trueInteger a = 200;Integer b = 200;System.out.pr...

兜兜毛毛
昨天
8
0
CockroachDB

百度云上的CockroachDB 云数据库 帮助文档 > 产品文档 > CockroachDB 云数据库 > 产品描述 开源NewSQL – CockroachDB在百度内部的应用与实践 嘉宾演讲视频及PPT回顾:http://suo.im/5bnORh ...

miaojiangmin
昨天
6
0
I2C EEPROM驱动实例分析

上篇分析了Linux Kernel中的I2C驱动框架,本篇举一个具体的I2C设备驱动(eeprom)来对I2C设备驱动有个实际的认识。 s3c24xx系列集成了一个基于I2C的eeprom设备at24cxx系列。at24cxx系列芯片包...

yepanl
昨天
6
0
设计模式之工厂模式

本篇博文主要翻译这篇文章: https://www.journaldev.com/1392/factory-design-pattern-in-java 由于翻译水平有限,自认为许多地方翻译不恰当,欢迎各位给出宝贵的建议,建议大家去阅读原文。...

firepation
昨天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部