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

让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

相关推荐

    nutz需要的jar包

    Nutz DAO支持多种数据库,如MySQL、Oracle、SQL Server等,并且支持JDBC模板、SQL映射文件(类似于MyBatis)等多种方式编写SQL。`nutz-dao`包含的jar包如`jdbc-driver`,用于连接不同的数据库,而`nutz-runtimex`则...

    SpringMVC+Nutz框架介绍范本模板.pdf

    - **Beetl模板引擎**:提供便捷的视图层开发,支持国际化。 - **日志记录**:通过`@SLog`注解自动记录操作日志,便于追踪问题。 - **文件输出**:`@SFile`注解实现文件的自动输出,如PDF格式。 - **JSON输出**:`@...

    SpringMVC+Nutz框架介绍范本模板.docx

    .`SpringMVC+Nutz框架介绍范本模板.docx

    nutz的freemarker视图插件

    - Nutz的MVC模式中,视图层支持多种模板引擎,包括JSP、Velocity、Freemarker等。 2. **Freemarker**: - Freemarker是一个模板语言,它与Java代码分离,使得开发者可以专注于页面布局和设计,而无需关心业务逻辑...

    Nutz开发用到的jar包

    它支持RESTful API、模板引擎、拦截器、数据绑定等功能,使得Web开发更加便捷。 3. **Nutz DAO**:DAO(Data Access Object)层负责与数据库交互。Nutz DAO提供了简单易用的API,用于执行SQL查询、事务管理等操作,...

    nutz学习资料2

    4. **SQL支持**:Nutz提供了强大的数据库操作API,可以方便地进行SQL查询和结果映射。 5. **Web开发**:Nutz支持RESTful API设计,可以构建高性能的Web服务。 6. **命令行工具**:Nutz提供了一系列的命令行工具,...

    nutz_redis集成依赖包

    3. **Nutz Redis集成**:Nutz Redis模块提供了一套完整的API,让开发者可以轻松地在Nutz应用中操作Redis。集成过程包括添加依赖、配置Redis连接信息、编写代码进行数据操作等步骤。 4. **依赖包管理**:在集成Nutz ...

    nutz框架使用手册.zip

    Nutz MVC允许开发者自定义路由规则,支持RESTful API,提供了模板引擎和视图解析机制。 4. **Nutz插件和扩展**:Nutz框架允许开发者通过插件机制来扩展其功能,如缓存管理、任务调度、安全控制等。手册会介绍如何...

    nutz代码生成器

    1. 源代码:项目的主程序代码,包括生成器的实现、数据库连接处理、模板引擎等。 2. 模板文件:预定义的代码模板,可以根据需求进行修改或添加自定义模板,以满足特定的代码风格和项目规范。 3. 配置文件:可能包含...

    nutz生成javabean工具.zip

    Nutz是一个轻量级、高性能的Java开发框架,它提供了许多实用工具,包括数据库操作、Web开发、模版引擎等。在给定的压缩包"nutz生成javabean工具.zip"中,我们可以看到一个名为"NutzCodematic-master"的项目,这很...

    nutz框架开发手册

    #### 四、Nutz框架质量保障 - **测试覆盖率**:Nutz框架非常重视代码质量,其JUnit测试覆盖率较高,并且持续增加。通过大量的单元测试来确保框架的稳定性和可靠性。 - **持续改进**:框架维护者会定期更新和完善...

    nutz邮箱验证jar包

    Nutz邮箱验证jar包可能提供模板引擎,支持动态插入变量和格式化输出,方便开发者自定义邮件模板。 4. **异步处理**:为了提高用户体验,邮箱验证通常会设计成异步操作。这意味着验证请求会被放入队列,然后由后台...

    springboot+nutz+beetl整合工程

    Nutz是一款优秀的Java ORM框架,而Beetl则是一款高效的Java模板引擎,它们都将为我们的应用程序提供强有力的支持。 首先,让我们详细了解一下SpringBoot。SpringBoot是由Pivotal团队提供的全新框架,其设计目标是...

    nutz 缓存

    2. **缓存策略**:Nutz支持两种缓存策略,即LRU(Least Recently Used,最近最少使用)和LFU(Least Frequently Used,最不经常使用)。LRU会优先淘汰最近最少使用的数据,而LFU则会淘汰访问频率最低的数据。 3. **...

    wendal-nutz-master.zip

    6. **Web**:NUTZ提供了Web应用的开发支持,包括路由、请求处理、模板引擎等,可以快速构建RESTful API和服务。 在压缩包“wendal-nutz-master.zip”中,你可能会找到以下内容: - 项目结构:通常包括src/main/...

    nutz 文件上传例子

    此外,`nutz.plugin.multiupload` 插件提供了更高级的文件上传支持,包括多文件上传、断点续传等功能。使用这个插件,你需要在控制器中注入相关的服务,然后调用服务接口来处理上传请求。 通过标签 "源码",我们...

    nutz-1.r.62.zip

    3. **Web开发**:Nutz对HTTP请求处理、响应生成、URL映射等提供了全面的支持,同时集成了模板引擎,如Freemarker和JSP,方便生成动态网页内容。 4. **约定优于配置**:Nutz遵循这一原则,许多配置都有默认值,减少...

Global site tag (gtag.js) - Google Analytics