让Nutz支持最快的模板引擎Smarty4j

简介: Smarty4j是一个开源的模板引擎。没错,它就是著名的php模板引擎之Java移植版。 它特点就是将模板文件或者字符串编译成java类直接执行,所以效率比一般的模板解释的方式处理要快。它发展较晚,所以没有 velocity、FreeMarker 有名,人气也比 php 版本的模板引擎差好多。

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、首先要实现视图适配器 
非常简单: 

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



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

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



好了,完成! 

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

Java代码   收藏代码
  1. @Views({SmartyViewMaker.class})   
  2. public class MainModule { }  



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

Java代码   收藏代码
  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 

目录
相关文章
|
测试技术
33 # 基本模板引擎
33 # 基本模板引擎
57 0
|
4月前
|
Python
配置模板引擎
【8月更文挑战第6天】配置模板引擎。
46 7
|
7月前
|
前端开发 JavaScript Java
thmeleaf模板引擎使用总结
thmeleaf模板引擎使用总结
|
前端开发 JavaScript Java
前端最常用的模板引擎-Handlebars
前端最常用的模板引擎-Handlebars
122 0
|
Java
Java:SpringBoot 整合 Freemarker模板引擎渲染html
Java:SpringBoot 整合 Freemarker模板引擎渲染html
293 0
Java:SpringBoot 整合 Freemarker模板引擎渲染html
|
Java 程序员 Apache
模板引擎——FreeMarker初体验
FreeMarker 是一款模板引擎:一种基于模板的、用来生成输出文本(任何来自于 HTML格式的文本用来自动生成源代码)的通用工具。
|
Java 应用服务中间件
详解模板引擎二
详解模板引擎二
115 0
详解模板引擎二
|
前端开发 PHP 数据库
浅谈smarty MVC框架
这次又是项目开发遇到的问题,做一个简单的表单处理,将数据写入数据库,流程很简单,由于客户不了解php框架导致我开发用了原生php,当我交付的时候对方说需要使用mvc方式且需要使用smarty框架,这里做一下踩坑总结(由于博主并不是很熟悉这个框架,今天的分享只用于探讨和记录,若有叙述不正确的,欢迎指正)
109 0
浅谈smarty MVC框架
|
Java Spring
常见的模版引擎
常见的模版引擎
80 0
|
编解码 JavaScript 前端开发