震惊,java8 Nashorn和laytpl居然能擦出这样火花!
震惊,java8 Nashorn和laytpl居然能擦出这样火花!
如梦技术 发表于11个月前
震惊,java8 Nashorn和laytpl居然能擦出这样火花!
  • 发表于 11个月前
  • 阅读 510
  • 收藏 3
  • 点赞 2
  • 评论 3

新睿云服务器60天免费使用,快来体验!>>>   

折腾的起因

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

标签: Java laytpl
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
如梦技术
粉丝 296
博文 35
码字总数 14983
作品 4
评论 (3)
罗格林
对空间要求这么高,这个mvc是打算用于嵌入式系统?
如梦技术

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

对空间要求这么高,这个mvc是打算用于嵌入式系统?
:sweat_smile:纯属练手+好玩。
我的名字叫李猜
666
×
如梦技术
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: