`
helloqiner
  • 浏览: 24432 次
  • 来自: ...
文章分类
社区版块
存档分类

让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
分享到:
评论
9 楼 zozoh 2011-04-20  
feiyan35488 写道
不知道能不能和tiles活sitemesh相比,模版是一方面,布局也是一方面

......... 有区别吗大哥?  都是弄堆 HTML ,然后互相引入一下而已 ........
8 楼 superhanliu 2011-04-20  
不错,作者研究的很深入。回头也要学习下这个smart4j
7 楼 feiyan35488 2011-04-20  
不知道能不能和tiles活sitemesh相比,模版是一方面,布局也是一方面
6 楼 zozoh 2011-04-20  
主要是要从容器中把 JSP 剥离,比较麻烦。
一个独立得模板引擎,不需要 ServerRequest 等等,起码,测试得时候方便点
5 楼 Reset 2011-04-20  
helloqiner 写道
使用模板的好处:
1.彻底的分离表现层和业务逻辑。
使用JSP 开发过程中在页面中大量的存在业务逻辑的代码,使得页面内容凌乱,项目较小还好说,项目大些的话后期大量的修改维护过程中就变得非常困难。
模板的原理就是:模板+数据模型=输出 ,模板只负责数据在页面中的表现,不涉及任何的逻辑代码,而所有的逻辑都只能在action或service层完成。这些后期维护工作将大幅度减小。

2.使得开发过程中的人员分工更加明确。
以往用JSP展现数据时,作为程序员的我们,并不熟悉界面设计技术,反之界面开发人员,也并不熟悉程序语言。对两者而言,交替性的工作本身就有难度。有时候稍有不慎,可能会将某个页面元素删除或去掉了某个程序符号,使得页面走样或程序错误,这样就需要双方相互沟通协作,解决出现的问题。有时候因为项目中的时间,任务量等因素的存在,可能这个工作就由一个人来完成,这样就可能加大某一方开发人员的工作量。
使用模板后,作为界面开发人员,只专心创建HTML文件、图像以及Web页面的其他可视化方面,不用理会数据;而程序开发人员则专注于系统实现,负责为页面准备要显示的数据。



JSP 也是模板引擎 
4 楼 myreligion 2011-04-19  
看到MVC和模板,就忍不住借机推广下“基于声明数据的MMVC架构”。Smart Model + 普通的MVC。[http://code.google.com/p/guzz/wiki/ArchitectureMMVC?wl=zh-Hans]
3 楼 zozoh 2011-04-19  
恩,这个确实很强 
2 楼 helloqiner 2011-04-19  
使用模板的好处:
1.彻底的分离表现层和业务逻辑。
使用JSP 开发过程中在页面中大量的存在业务逻辑的代码,使得页面内容凌乱,项目较小还好说,项目大些的话后期大量的修改维护过程中就变得非常困难。
模板的原理就是:模板+数据模型=输出 ,模板只负责数据在页面中的表现,不涉及任何的逻辑代码,而所有的逻辑都只能在action或service层完成。这些后期维护工作将大幅度减小。

2.使得开发过程中的人员分工更加明确。
以往用JSP展现数据时,作为程序员的我们,并不熟悉界面设计技术,反之界面开发人员,也并不熟悉程序语言。对两者而言,交替性的工作本身就有难度。有时候稍有不慎,可能会将某个页面元素删除或去掉了某个程序符号,使得页面走样或程序错误,这样就需要双方相互沟通协作,解决出现的问题。有时候因为项目中的时间,任务量等因素的存在,可能这个工作就由一个人来完成,这样就可能加大某一方开发人员的工作量。
使用模板后,作为界面开发人员,只专心创建HTML文件、图像以及Web页面的其他可视化方面,不用理会数据;而程序开发人员则专注于系统实现,负责为页面准备要显示的数据。
1 楼 Reset 2011-04-19  
它特点就是将模板文件或者字符串编译成java类直接执行,所以效率比一般的模板解释的方式处理要快。

JSP也是这样实现的 而且还继承servlet

相关推荐

Global site tag (gtag.js) - Google Analytics