浏览 5629 次
精华帖 (9) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-19
最后修改:2011-04-20
它特点就是将模板文件或者字符串编译成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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-04-19
它特点就是将模板文件或者字符串编译成java类直接执行,所以效率比一般的模板解释的方式处理要快。
JSP也是这样实现的 而且还继承servlet |
|
返回顶楼 | |
发表时间:2011-04-19
使用模板的好处:
1.彻底的分离表现层和业务逻辑。 使用JSP 开发过程中在页面中大量的存在业务逻辑的代码,使得页面内容凌乱,项目较小还好说,项目大些的话后期大量的修改维护过程中就变得非常困难。 模板的原理就是:模板+数据模型=输出 ,模板只负责数据在页面中的表现,不涉及任何的逻辑代码,而所有的逻辑都只能在action或service层完成。这些后期维护工作将大幅度减小。 2.使得开发过程中的人员分工更加明确。 以往用JSP展现数据时,作为程序员的我们,并不熟悉界面设计技术,反之界面开发人员,也并不熟悉程序语言。对两者而言,交替性的工作本身就有难度。有时候稍有不慎,可能会将某个页面元素删除或去掉了某个程序符号,使得页面走样或程序错误,这样就需要双方相互沟通协作,解决出现的问题。有时候因为项目中的时间,任务量等因素的存在,可能这个工作就由一个人来完成,这样就可能加大某一方开发人员的工作量。 使用模板后,作为界面开发人员,只专心创建HTML文件、图像以及Web页面的其他可视化方面,不用理会数据;而程序开发人员则专注于系统实现,负责为页面准备要显示的数据。 |
|
返回顶楼 | |
发表时间:2011-04-19
恩,这个确实很强
|
|
返回顶楼 | |
发表时间:2011-04-19
看到MVC和模板,就忍不住借机推广下“基于声明数据的MMVC架构”。Smart Model + 普通的MVC。[http://code.google.com/p/guzz/wiki/ArchitectureMMVC?wl=zh-Hans]
|
|
返回顶楼 | |
发表时间:2011-04-20
helloqiner 写道 使用模板的好处:
1.彻底的分离表现层和业务逻辑。 使用JSP 开发过程中在页面中大量的存在业务逻辑的代码,使得页面内容凌乱,项目较小还好说,项目大些的话后期大量的修改维护过程中就变得非常困难。 模板的原理就是:模板+数据模型=输出 ,模板只负责数据在页面中的表现,不涉及任何的逻辑代码,而所有的逻辑都只能在action或service层完成。这些后期维护工作将大幅度减小。 2.使得开发过程中的人员分工更加明确。 以往用JSP展现数据时,作为程序员的我们,并不熟悉界面设计技术,反之界面开发人员,也并不熟悉程序语言。对两者而言,交替性的工作本身就有难度。有时候稍有不慎,可能会将某个页面元素删除或去掉了某个程序符号,使得页面走样或程序错误,这样就需要双方相互沟通协作,解决出现的问题。有时候因为项目中的时间,任务量等因素的存在,可能这个工作就由一个人来完成,这样就可能加大某一方开发人员的工作量。 使用模板后,作为界面开发人员,只专心创建HTML文件、图像以及Web页面的其他可视化方面,不用理会数据;而程序开发人员则专注于系统实现,负责为页面准备要显示的数据。 JSP 也是模板引擎 |
|
返回顶楼 | |
发表时间:2011-04-20
主要是要从容器中把 JSP 剥离,比较麻烦。
一个独立得模板引擎,不需要 ServerRequest 等等,起码,测试得时候方便点 |
|
返回顶楼 | |
发表时间:2011-04-20
不知道能不能和tiles活sitemesh相比,模版是一方面,布局也是一方面
|
|
返回顶楼 | |
发表时间:2011-04-20
不错,作者研究的很深入。回头也要学习下这个smart4j
|
|
返回顶楼 | |
发表时间:2011-04-20
feiyan35488 写道 不知道能不能和tiles活sitemesh相比,模版是一方面,布局也是一方面
......... 有区别吗大哥? 都是弄堆 HTML ,然后互相引入一下而已 ........ |
|
返回顶楼 | |