让Nutz支持最快的模板引擎Smarty4j
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、首先要实现视图适配器
非常简单:
- /**
- * Smarty4j 视图适配器
- * @author QinerG(QinerG@gmail.com)
- */
- public class SmartyViewMaker implements ViewMaker {
- public View make(Ioc ioc, String type, String value) {
- if("st".equalsIgnoreCase(type)){
- return new SmartyView(value);
- }
- return null;
- }
- }
2、然后再实现具体的视图解析器
- /**
- * 使用 Smarty4j 模板生成页面
- * @author QinerG(QinerG@gmail.com)
- */
- public class SmartyView extends AbstractPathView implements View {
- private final String ext = ".html";
- private static Engine engine = new Engine();//加载模板引擎
- public SmartyView(String dest) {
- super(dest);
- engine.setTemplatePath("");
- engine.setDebug(true);
- }
- /* 渲染页面
- * @see org.nutz.mvc.View#render(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object)
- */
- public void render(HttpServletRequest req, HttpServletResponse resp,
- Object obj) throws Throwable {
- if ("".equals(engine.getTemplatePath())) {
- String realPath = req.getSession().getServletContext().getRealPath("/");
- engine.setTemplatePath(realPath);
- }
- String path = evalPath(req, obj);
- // 空路径,采用默认规则
- if (Strings.isBlank(path)) {
- path = Mvcs.getRequestPath(req);
- path = "WEB-INF"
- + (path.startsWith("/") ? "" : "/")
- + Files.renameSuffix(path, ext);
- }
- // 绝对路径 : 以 '/' 开头的路径不增加 '/WEB-INF'
- else if (path.charAt(0) == '/') {
- if (!path.toLowerCase().endsWith(ext))
- path += ext;
- }
- // 包名形式的路径
- else {
- path = "WEB-INF/" + path.replace('.', '/') + ext;
- }
- Template template = engine.getTemplate(path);
- Context ctx = new Context(); // 生成数据容器对象
- ctx.set("obj", obj);
- ctx.set("request", req);
- ctx.set("response", resp);
- ctx.set("session", req.getSession());
- template.merge(ctx, resp.getWriter());
- }
- }
好了,完成!
那么具体怎么用呢?
首先在主模块上声明使用 Smarty4j 适配器
- @Views({SmartyViewMaker.class})
- public class MainModule { }
然后在action上声明模板路径即可,如:
- @At("/index")
- @Ok("st:st.index")
- public void index() {
这个action的模板将对应 WEB-INF/st/index.html 文件。
当然模板路径也可以放在 WEB-INF 外面,如:
@Ok("st:abc.bbc") 或 @Ok("st:/abc/bbc")
对应的模板路径为:
abc/bbc.html
让Nutz支持最快的模板引擎Smarty4j的更多相关文章
- koa art-template模板引擎的使用
art-template 模板引擎介绍 art-template 是一个简约.超快的模板引擎. 它采用作用域预声明的技术来优化模板渲染速度,从而获得接近 JavaScript 极限的运行 性能,并且同 ...
- .NET Core中使用Razor模板引擎
一.简介 在MVC以外的场景中,我们往往需要完成一些模板引擎生成代码或页面的工作:在以前我们一般常用的有Razor.NVeocity.VTemplate.虽然所有的模板系统都具有一些共同特征,但 Ra ...
- Razor模板引擎
Razor模板引擎 阅读目录 一.简介 二.非Mvc中使用Razor 三.总结 回到目录 一.简介 在MVC以外的场景中,我们往往需要完成一些模板引擎生成代码或页面的工作:在以前我们一般常用的有Raz ...
- 必须掌握的前端模板引擎之art-template
常用的模板引擎有tpl.js.baiduTemplate.doT.js.art-template等等: 我所理解的模板引擎就是把js数据传到html中展示出来: art-template 是一个简约. ...
- 全球最快的JS模板引擎
废话不多说,先上测试: 亲测请访问:[在线测试地址]单次结果不一定准确,请多测几次. tppl 的编译渲染速度是著名的 jQuery 作者 John Resig 开发的 tmpl 的 43 倍!与第二 ...
- 全球最快的JS模板引擎:tppl
废话不多说,先上测试: 亲测请访问:[在线测试地址]单次结果不一定准确,请多测几次. tppl 的编译渲染速度是著名的 jQuery 作者 John Resig 开发的 tmpl 的 43 倍!与第二 ...
- 「快学springboot」SpringBoot整合freeMark模板引擎
前言 虽然现在流行前后端分离开发和部署,但是有时候还是需要用到服务端渲染页面的.比如:需要考虑到SEO优化等问题的时候,FreeMark其实还是很有作用的.本人的博客本来是用React开发的,但是后来 ...
- java开源模板引擎
Velocity Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义 ...
- Beetl学习总结(1)——新一代java模板引擎典范 Beetl入门
1. 什么是Beetl Beetl目前版本是2.7.0,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等特点.使得开发和维护模板有很好的体验.是新一代的模板引擎. ...
随机推荐
- Java面向对象编程 -1.3
类与对象的定义与使用 在Java之中类是一个独立的结构体,所以需要使用class来进行定义,而类之中主要由属性和方法所组成,那么属性就是一个个具体的变量,方法就是可以重复执行的代码. 定义一个类 cl ...
- SMBUS与I2C
SMBUS(系统管理总线)基于I2C总线,主要用于电池管理系统中.它工作在主/从模式:主器件提供时钟,在其发起一次传输时提供一个起始位,在其终止一次传输时提供一个停止位:从器件拥有一个唯一的7或10位 ...
- python字典操作方法详解
前言 字典是一种通过名字或者关键字引用的得数据结构,key 类型需要时被哈希,其键可以是数字.字符串.元组,这种结构类型也称之为映射.字典类型是Python中唯一內建的映射类型. 注意,浮点数比较很不 ...
- uniGUI之uniEdit(23)
主要新加属性: a]EmptyText在没有文本里显示的背景文本. b]作为其他控件的编辑输入控件. c]ClearButton清空按钮 d]左边显示文本 e]回车触发事件CharEOL:=#13 f ...
- 从数组A中删除在数组B中存在的元素,用C语言实现
从数组A中删除在数组B中存在的元素,用C语言实现 考验数组操作的能力,C语言的熟练程度. //功能:从数组A中删除在数组B中也存在的数据 //输入:arrA --- 数组A // lenA --- 数 ...
- 多数据库:SQLHelper
//=============================================================================== // This file is ba ...
- Python实现一个LRU
class Node: key = None value = None pre = None next = None def __init__(self, key, value): self.key ...
- icos下配置snake test
Topo: # $language = "Python" # $interface = "1.0"# Author:Bing Song# Date:6/21/2 ...
- css中class后面跟两个类,这两个类用空格隔开
css中class后面跟两个类,这两个类用空格隔开,那么这两个类对这个元素都起作用,如果产生冲突,那么后面的类将替代前面的类.
- 一键设置Fluent环境变量小程序
使用视频教程优酷播放地址: https://v.youku.com/v_show/id_XNDU2MTkwNDg5Mg==.html?spm=a2hzp.8244740.0.0 一键设置环境变量小软件 ...