Smarty4j是一个开源的模板引擎。没错,它就是著名的php模板引擎之Java移植版。 
它特点就是将模板文件或者字符串编译成java类直接执行,所以效率比一般的模板解释的方式处理要快。它发展较晚,所以没有 velocity、FreeMarker 有名,人气也比 php 版本的模板引擎差好多。 
但是它很快! 
本着怀疑一切的态度,我自己进行了实测。在渲染1000遍一个简单的页面时(只引入几种简单的数据类型), Smarty4j 耗时 16 毫秒,velocity 耗时 63 毫秒,FreeMarker 则用了 109 毫秒。渲染5000遍时,Smarty4j 耗时 172 毫秒,velocity 耗时 328 毫秒,FreeMarker 则用了 390 毫秒。(以上测试均为多次测试后取的平均值) 
复杂页面耗时相差更大。所以把项目里的 velocity 或 FreeMarker 换成 Smarty4j 可以使你的应用提速不少。

已经有网友将 Smarty4j 提供了插件集成到 struts2 中了。那么能不能把它集成到国产的小巧的 Nutz MVC 框架中呢? 
翻看了 Nutz 的用户手册后发现这是件非常容易的事情。

下面我们就开始吧:

1、首先要实现视图适配器 
非常简单:

  1. /**
  2. * Smarty4j 视图适配器
  3. * @author QinerG(QinerG@gmail.com)
  4. */
  5. public class SmartyViewMaker implements ViewMaker {
  6. public View make(Ioc ioc, String type, String value) {
  7. if("st".equalsIgnoreCase(type)){
  8. return new SmartyView(value);
  9. }
  10. return null;
  11. }
  12. }

2、然后再实现具体的视图解析器

  1. /**
  2. * 使用 Smarty4j 模板生成页面
  3. * @author QinerG(QinerG@gmail.com)
  4. */
  5. public class SmartyView extends AbstractPathView implements View {
  6. private final String ext = ".html";
  7. private static Engine engine = new Engine();//加载模板引擎
  8. public SmartyView(String dest) {
  9. super(dest);
  10. engine.setTemplatePath("");
  11. engine.setDebug(true);
  12. }
  13. /* 渲染页面
  14. * @see org.nutz.mvc.View#render(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object)
  15. */
  16. public void render(HttpServletRequest req, HttpServletResponse resp,
  17. Object obj) throws Throwable {
  18. if ("".equals(engine.getTemplatePath())) {
  19. String realPath = req.getSession().getServletContext().getRealPath("/");
  20. engine.setTemplatePath(realPath);
  21. }
  22. String path = evalPath(req, obj);
  23. // 空路径,采用默认规则
  24. if (Strings.isBlank(path)) {
  25. path = Mvcs.getRequestPath(req);
  26. path = "WEB-INF"
  27. + (path.startsWith("/") ? "" : "/")
  28. + Files.renameSuffix(path, ext);
  29. }
  30. // 绝对路径 : 以 '/' 开头的路径不增加 '/WEB-INF'
  31. else if (path.charAt(0) == '/') {
  32. if (!path.toLowerCase().endsWith(ext))
  33. path += ext;
  34. }
  35. // 包名形式的路径
  36. else {
  37. path = "WEB-INF/" + path.replace('.', '/') + ext;
  38. }
  39. Template template = engine.getTemplate(path);
  40. Context ctx = new Context(); // 生成数据容器对象
  41. ctx.set("obj", obj);
  42. ctx.set("request", req);
  43. ctx.set("response", resp);
  44. ctx.set("session", req.getSession());
  45. template.merge(ctx, resp.getWriter());
  46. }
  47. }

好了,完成!

那么具体怎么用呢? 
首先在主模块上声明使用 Smarty4j 适配器

  1. @Views({SmartyViewMaker.class})
  2. public class MainModule { }

然后在action上声明模板路径即可,如:

  1. @At("/index")
  2. @Ok("st:st.index")
  3. public void index() {

这个action的模板将对应 WEB-INF/st/index.html 文件。

当然模板路径也可以放在 WEB-INF 外面,如: 
@Ok("st:abc.bbc") 或 @Ok("st:/abc/bbc") 
对应的模板路径为: 
abc/bbc.html

让Nutz支持最快的模板引擎Smarty4j的更多相关文章

  1. koa art-template模板引擎的使用

    art-template 模板引擎介绍 art-template 是一个简约.超快的模板引擎. 它采用作用域预声明的技术来优化模板渲染速度,从而获得接近 JavaScript 极限的运行 性能,并且同 ...

  2. .NET Core中使用Razor模板引擎

    一.简介 在MVC以外的场景中,我们往往需要完成一些模板引擎生成代码或页面的工作:在以前我们一般常用的有Razor.NVeocity.VTemplate.虽然所有的模板系统都具有一些共同特征,但 Ra ...

  3. Razor模板引擎

    Razor模板引擎 阅读目录 一.简介 二.非Mvc中使用Razor 三.总结 回到目录 一.简介 在MVC以外的场景中,我们往往需要完成一些模板引擎生成代码或页面的工作:在以前我们一般常用的有Raz ...

  4. 必须掌握的前端模板引擎之art-template

    常用的模板引擎有tpl.js.baiduTemplate.doT.js.art-template等等: 我所理解的模板引擎就是把js数据传到html中展示出来: art-template 是一个简约. ...

  5. 全球最快的JS模板引擎

    废话不多说,先上测试: 亲测请访问:[在线测试地址]单次结果不一定准确,请多测几次. tppl 的编译渲染速度是著名的 jQuery 作者 John Resig 开发的 tmpl 的 43 倍!与第二 ...

  6. 全球最快的JS模板引擎:tppl

    废话不多说,先上测试: 亲测请访问:[在线测试地址]单次结果不一定准确,请多测几次. tppl 的编译渲染速度是著名的 jQuery 作者 John Resig 开发的 tmpl 的 43 倍!与第二 ...

  7. 「快学springboot」SpringBoot整合freeMark模板引擎

    前言 虽然现在流行前后端分离开发和部署,但是有时候还是需要用到服务端渲染页面的.比如:需要考虑到SEO优化等问题的时候,FreeMark其实还是很有作用的.本人的博客本来是用React开发的,但是后来 ...

  8. java开源模板引擎

      Velocity  Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义 ...

  9. Beetl学习总结(1)——新一代java模板引擎典范 Beetl入门

    1. 什么是Beetl Beetl目前版本是2.7.0,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等特点.使得开发和维护模板有很好的体验.是新一代的模板引擎. ...

随机推荐

  1. 洛谷P1991 无线通讯网(最小生成树性质+连通块)

    题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...

  2. 使用docker构建第一个spring boot项目

    在看了一些简单的docker命令之后 打算自己尝试整合一下docker+spring boot项目本文是自己使用docker+spring boot 发布一个项目1.docker介绍 docke是提供 ...

  3. 动态规划-爬楼梯问题java实现

    最近开始看算法导论,研究了一下动态规划,下面就开始直入主题开始记录近期看的第一个知识点动态规划.提起动态规划就不得不提几个动态规划的金典问题爬楼梯.国王金矿.背包问题.今天就仔细分析一下爬楼梯问题. ...

  4. 【PAT甲级】1001 A+B Format (20 分)

    题意:给两个整数a,b,计算a+b的值并每三位用逗号隔开输出(−1e6​​≤a,b≤1e6​​) AAAAAccepted code: #include<bits/stdc++.h> us ...

  5. 虚拟机与ubuntu系统的安装与基础操作

    1.虚拟机的下载: 常见的虚拟机软件有:VMware  VirtuaIBOX  Virtual PC  等. 这里主要介绍VMware ,VMware目前已经有很多个版本,可以根据个人情况进行选择.安 ...

  6. Trie学习总结

    Trie树学习总结 字典树,又称前缀树,是用于快速处理字符串的问题,能做到快速查找到一些字符串上的信息. 另外,Trie树在实现高效的同时,会损耗更多的空间,所以Trie是一种以空间换时间的算法. T ...

  7. python-定时任务-apschelduer

    python-定时任务-apschelduer 1.      apscheduler 1.1.    install pip install apscheduler 1.2.    basic co ...

  8. Css——设置input输入框光标颜色

    在使用 input 输入框时,我们可能会遇到需要给其设置光标颜色的情况.谷歌浏览器的默认光标颜色是黑色的,GitHub 上的光标却是白色,那么这个用 CSS 怎么改变呢? 上面描述的情景有两种实现方式 ...

  9. BKP寄存器

    STM32的BKP: 备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据.他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电.当系统在待机模式下被唤醒,或系统复位或 ...

  10. bat批处理下如何像shell一样将命令执行的效果赋值给变量

    在bat下如何实现像shell一样,把执行命令行后的结果赋值给变量呐? 刚开始,可真难为到我了.随着对bat批处理知识熟悉的加深. 学习到了!!! 举个 栗子: svnlook  uuid  C:\R ...