文档章节

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

如梦技术
 如梦技术
发布于 2017/04/03 15:48
字数 492
阅读 543
收藏 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

© 著作权归作者所有

共有 人打赏支持
如梦技术

如梦技术

粉丝 318
博文 39
码字总数 15442
作品 4
朝阳
后端工程师
加载中

评论(3)

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

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

对空间要求这么高,这个mvc是打算用于嵌入式系统?
:sweat_smile:纯属练手+好玩。
罗格林
罗格林
对空间要求这么高,这个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

没有更多内容

加载失败,请刷新页面

加载更多

Centos7安装docker和docker-compose

docker-安装 yum update yum install -y docker-engine docker-compose pip install -U docker-compose...

落叶清风
20分钟前
1
0
7个Python实战项目代码,让你感受下大神是如何起飞的!

关于Python有一句名言:不要重复造轮子。 但是问题有三个: 1、你不知道已经有哪些轮子已经造好了,哪个适合你用。有名有姓的的著名轮子就400多个,更别说没名没姓自己在制造中的轮子。 2、确...

糖宝lsh
21分钟前
1
0
【随记】Maven 与mysql 版本(maven mysql 5.1.38用的最多)

MySQL Connector/J 我的电脑mysql版本为5.7.20-log maven pom.xml 依赖可用5.1.38 pom.xml依赖代码 $加<properties>变量名的实例代码 <properties><!-- data --><mysql-connector-ja......

颖伙虫
24分钟前
1
0
观察者模式

意图: 在对象的内部状态发生变化时,自动通知外部对象进行响应。 构成 被观察者:内部状态有可能被改变,而且又需要通知外部的对象。 观察者:需要对内部状态的改变做出响应的对象。 Java实...

noob_fly
31分钟前
1
0
设计模式之 MVC

MVC 是 模块化思想或者分层思想的实践。 当我们设计一个Web应用的时候,我们的业务流是,读取数据库中的数据,进行逻辑处理,渲染到页面;如果是交互型的页面,那么页面有输入或者事件发生的...

backbye
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部