文档章节

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

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

© 著作权归作者所有

共有 人打赏支持
如梦技术

如梦技术

粉丝 312
博文 35
码字总数 14983
作品 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
博为峰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 8新特性探究(十二)Nashorn :新犀牛

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

OSC闲人
2014/07/13
0
28
for in 和 for,以及getElementsByTagName('*')

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

DennisHill
2016/12/27
2
0
Java8-初识Lambda

廉颇老矣,尚能饭否 Java,这位已经20多岁的编程语言,称得上是编程语言界的老大哥了。他曾经攻城略地,碾压各路编程语言小弟,风光无限,不可一世。现在,也是家大业大,江湖地位,很难撼动...

Jackie_Zheng
2017/09/17
0
0
vmware workstation 初体验(第二弹)

吃完饭继续码字,为啥要分成两篇呢,吃饭只是其中一个原因而已,其实我是怕你们长不看好不好(上一篇1300多字= =) 接下来终于进入了win7的界面,我原本想从我的机器上拖一点东西到虚拟机上,纳尼,...

liudaolaoda1234
2013/10/18
0
0
UWA DAY 2018,我们不仅有干货,还有颜值!

原文链接:https://blog.uwa4d.com/archives/2318.html 文初,小编先要说声对不起了!虽然距离UWA DAY 2018开幕还有一个月,但由于售票过于火爆,为了保证活动质量,我们决定将于3月23日(本...

uwa4d
03/22
0
0
马化腾与刘强东结盟,为啥不选阿里巴巴

  前几日的乌镇饭局闹得沸沸扬扬。今天咱们就来聊聊,腾讯CEO马化腾为什么选择和京东刘强东结盟,而不是选择能言善道的马云。      众所周知,腾讯与阿里今年在市值上,首次全球前5,国...

火星来的IT美少女
2017/12/18
0
0
【java8】java新特性(一)——全局观

一、前言 年前的时候 ,我一个师姐出去工作,被鄙视了。说写的代码太垃圾。当时我也没有在意,回头想想自己,本以为自己写的代码天衣无缝,无可挑剔。但是自从自己遇到了Java8 后,我的世界观...

kisscatforever
03/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
9
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0
分布式事务常见的解决方案

随着互联网的发展,越来越多的多服务相互之间的调用,这时候就产生了一个问题,在单项目情况下很容易实现的事务控制(通过数据库的acid控制),变得不那么容易。 这时候就产生了多种方案: ...

小海bug
昨天
3
0
python从零学——scrapy初体验

python从零学——scrapy初体验 近日因为一些事情,需要从网上爬取一些东西,故而想通过使用爬虫来顺便学习下强大的python。现将一些学习中遇到的问题记录下来,以便日后查询 1. 开发环境的准...

咾咔叽
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部