`
andyjames
  • 浏览: 31604 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

velocity模板渲染页面性能优化

    博客分类:
  • Java
阅读更多
Velocity模板渲染页面性能优化


对于页面性能优化这块,尤其是velocity宏的使用,如何使用宏,怎么样将宏的使用发挥到极致,达到更大的性能的提示,
我的建议如下:

1:一般我们不推荐使用宏,因为宏每次都要要JJT解析,然后才能再执行;
2:使用宏能达到最好的性能情况下,非常安全的,一般在页面有些信息是用户输入的情况
使用会比较好。
下面我针对他的一些意见和我们项目的一些情况,整理了一些关于宏使用的一些技术知识

一:我们如何定义宏和使用宏?
1:定义宏和使用宏
#macro指令用于定义一个VTL模板的重复代码块——宏。下面是一个简单的定义宏的例子:
#macro( d )
<tr><td></td><tr>
#end
这段代码定义了一个宏,名字为d,没有参数。下面是使用这个宏的代码:
#d()
Velocity在遇到#d()的时候,会用"<tr><td></td></tr>"替代上面的#d()这一行。
宏的参数:
宏也可以带参数,而且是任意多个参数。不过,宏定义时有几个参数,宏调用时就要提供同样数目的参数。
#macro( d $name)
    <tr><td>$name</td></tr>
#end

#d("name1")
宏的参数可以是以下VTL元素中的任意一种:引用、字符串字面值、数值字面值、整数范围(比如[1 .. 10]、[$start .. $end])、数组、布尔值true或者false。
宏的参数可以是方法,那么下面这个例子,需要特别注意:
#macro(test $a)
    $a $a $a
#end
#test($foo.bar())
上面这个例子中,$foo.bar()将会被调用3次,而不是一次。

内联的宏
当宏是在一个Velocity模板中定义时,这个宏(是inline的)只能被该模板使用,同一个网站下的其他模板是不能用的。如果是在一个Velocity宏模板库中定义的宏,就可以被任何同一网站下的模板使用。
和宏有关的一些Velocity属性
velocimacro.library——用逗号分隔的一组文件名,是Velocity宏模板库。默认值是VM_global_library.vm
velocimacro.permissions.allow.inline——宏是否可以在一个普通模板中定义。默认值是false。
velocimacro.permissions.allow.inline.to.replace.global——是否允许模板中的宏覆盖library中的宏。默认值是false。
velocimacro.permissions.allow.inline.local.scope——一个在普通模板中定义的宏,是否允许其他模板使用。默认是false。
velocimacro.context.localscope——在一个宏里通过#set()修改了context,此修改是否仅仅对这个宏自身,而不是永久性修改了context。默认值是false。
velocimacro.library.autoreload——Velocity宏模板库修改之后,是否自动重新加载。默认值是false。debug时可以设置为true,发布时设置为false。
其他一些注意点
宏必须在第一次使用它之前定义。当#Parse()一个模板文件时,尤其要注意这一点。

二: 引入指令和#Stop指令
#Include和#Parse都是用于将本地文件引入当前文件的指令,而且被引入的文件必须位于TEMPLATE_ROOT。这两者之间有一些区别。
#Include
被#Include引入的文件,其内容不会被Velocity引擎解析,所以这些文件应该是静态模板,即不含有VTL的模板。使用#Include()指令时,参数是被双引号括起来的文件名或者是表示文件名的变量。如果有多个文件,以逗号隔开即可。比如#Include("a.gif", "b.html", $file)。
#Parse
#Parse用来在当前模板中引入并执行另一个(本地的)模板——可以是静态的,也可以是动态的——并把结果嵌入到当前位置。#Parse()指令的参数,可以是一个双引号括起来的文件名,也可以是一个变量,但是它不能接受多个参数。
被#Parse引入的文件仍然可以使用#Parse指令。在velocity.properties文件中有一个属性directive.parse.max.depth,默认值是10,它指定了#Parse嵌套的最大层次。既然#Parse嵌套是允许的,#Parse递归也是允许的。
假如a.vm #Parse b.vm,那么a.vm中定义的变量$v,在b.vm中可以随便使用。如果b.vm也定义了$v,那么b.vm中用到的将会是自己的$v,而不是a.vm中的$v。
#Stop
#Stop指令会停止模板引擎的执行,并返回。这在debug中比较有用。

三:#include和#parse到底有什么区别?
parse方法是解析文件,宏是全局方法(调用该方法返回数据),调用方法比较快。
#parse是动态加载的,需要***.vm中的宏定义在 velocity启动的时候就应该得到加载
#include
1.可包含本地文件(不包含VTL)
2.文件内容不经过template engine处理
3.出于安全性的考虑,此文件只能位于TEMPLATE_ROOT目录下

#parse
1.可以引入包含VTL的模板
2.任何模板文件只能位于TEMPLATE_ROOT目录下

比如macro.vm里面添加
#macro (static $src)
  $env.getProperties("app.static")/$src
#end
#macro (function_name param_names)
  // code...
#end
这样使用 #static("...")方法调用
parse与include的区别在于,若包含的文件中有Velocity脚本标签,将会进一步解析,而include将原样显示。

实例1:
#macro(macroName)#end 脚本函数(宏)调用,不推荐在界面模板中大量使用。
如:在使用EasyJWeb Tools快速生成的添删改查示例中,可以点击列表的标题栏进行升降排序显示,这是我们在EasyJWeb应用中经常看到的一个排序状态显示的模板内容。
函数(宏)定义,一般放在最前面
#macro(orderPic $type)
#if ($orderField.equals($type))
<img src="/images/ico/${orderType}.gif">
#end
#end
具体的调用如:<font color="#FFFFFF">头衔#orderPic("title")</font>
实例2:
包含文件#inclue("模板文件名")或#parse("模板文件名")
主要用于处理具有相同内容的页面,比如每个网站的顶部或尾部内容。
使用方法,可以参考EasyJF开源Blog及EasyJF开源论坛中的应用!
如:#parse("/blog/top.html")或#include("/blog/top.html")


四: Velocity宏使用中需要注意的问题
1、变量输出要带上静止修饰符,避免模板直接空指针报错
举例 :$var错误,$!var正确
如果变量referce与html代码连在一起,需要加上{}
举例 :$! {var}gadsgaggaggas
2、Macro的使用
由于宏存在着安全和性能问题,并且会影响模板的可读性,在模板中不推荐使用宏。
3、变量引用不要加引号,避免重复转义举例:
$stringUtil.equals("$text", "&") 错误
$stringUtil.equals($text, "&") 正确
4、关于velocity的版本
目前推荐使用 velocity 1.6.1,因为以往velocity版本往往会出现向下不兼容的情况 版本升级需要经过架构部门(校长)的充分论证和评估才能实施。
5、Velocity的安全性
为避免VELOCITY页面渲染后产生XSS漏洞,应用应该采用校长的安全方案在应用中引入toolkit-service-velocity.1.5 包。
XSS的过滤,使用velocity提供的xss过滤功能
1)对于html,可以使用  #SHTML($html)2)对于JS,可以用 #SJS($js)
3)对于xml,可以使用#SXML($xml)
4)屏蔽转义,可以使用#SLITERAL()
上述宏,因为非常消耗CPU,因此如果不含特定内容,不到万不得已,不得使用。

五:总结:
1:模块化的东西最好不要放入循环当中,parse或者宏都只是加载一段公共的代码片段而已,循环只是对数据处理来说的;
2:用parse和宏区别不大,parse解析的是一个vm文件,宏返回一段vm代码,优化的过程不是说使用parse或者宏,而是文件或宏里面的数据处理代码,这些代码才有高低效率之分,parse和宏只是在不同场景下不同的使用方法而已。
参考文章:http://people.apache.org/~henning/velocity/html/ch07.html

 

分享到:
评论
1 楼 myreligion 2011-03-24  
toolkit-service-velocity.1.5 共享下吧,呵呵,我们没有这个只能文本保存时提前转义~~。

toolkit-service-velocity应该是自定义director吧?都是java语言直接的String操作,应该挺快的吧?反正只要有转义需求,也不会比其他模板慢吧?

相关推荐

    Velocity模板使用指南中文版

    ** Velocity 模板使用指南中文版 ** Velocity 是一个基于 Java ...通过阅读这份《Velocity 模板使用指南中文版》,你将能够掌握 Velocity 的基础和进阶知识,从而在实际项目中灵活运用 Velocity 实现高效的模板渲染。

    SpringBoot集成Mybatis,velocity模板展示数据

    在完成数据处理后,通过ModelAndView对象将数据传递给Velocity模板,Velocity引擎解析模板并渲染数据,最后返回给客户端展示。 总的来说,SpringBoot集成Mybatis和Velocity模板引擎,可以实现高效的数据处理和动态...

    Velocity模板应用

    以上就是Velocity模板应用的基本介绍,它提供了高效、灵活的方式来构建动态内容,让开发者可以专注于业务逻辑,而将页面渲染的任务留给模板引擎。通过熟练掌握Velocity,我们可以提高Web应用的开发效率和代码质量。

    velocity生成静态页面实例

    在“velocity生成静态页面实例”中,我们首先需要一个 Velocity模板文件(通常以`.vm`为扩展名),在这个文件中,我们可以使用Velocity语法来定义页面结构,并插入动态数据占位符。例如,我们可以写一个简单的模板:...

    Velocity--java的模板引擎

    Velocity模板语言(VTL)提供了一系列的指令,如#$、##、#set、#if、#else、#foreach等,用于控制模板的逻辑和数据绑定。例如: - `#$variable`:输出变量的值。 - `#set($var = "value")`:设置变量。 - `#if($...

    Velocity模板引擎 v2.2.0.zip

    - **性能优化**:合理使用缓存,避免不必要的计算,可以提升模板引擎的执行效率。 在实际项目中,Velocity常常与Spring MVC、Struts等框架集成,以实现更强大的功能。对于前端开发者来说,理解并熟练掌握Velocity...

    velocity模板引擎

    - **性能优化**:合理使用缓存,减少不必要的模板解析和编译。 - **安全性**:防止模板注入攻击,限制模板中可执行的Java代码。 总的来说,Velocity模板引擎以其简单易用、高效灵活的特点,在Java Web开发领域占据...

    velocity 电子书

    7. **性能优化** - 了解如何通过缓存管理、减少不必要的模板解析和优化VTL代码来提升Velocity的性能。 - 使用Velocity Profiler工具进行性能分析和调试。 8. **最佳实践** - 学习如何编写可维护、可扩展的模板,...

    三大框架整合 前端视图使用velocity渲染,数据访问层使用hibernate+mysql,

    1. **前端视图**:Velocity模板负责生成动态HTML,Spring MVC或Spring Web Flow可以配合Velocity,接收请求、处理业务逻辑,并将结果传递给Velocity模板进行渲染。 2. **数据访问层**:Hibernate作为JPA的实现,用于...

    velocity中文

    Velocity可以轻松地与Spring MVC、Struts等主流Java Web框架集成,提供视图层的模板渲染。例如,在Spring MVC中,可以通过`VelocityViewResolver`来解析Velocity模板。 ### 6. 学习Velocity 学习Velocity时,建议...

    velocity的学习资料

    6. **性能优化** - 缓存管理:Velocity支持缓存编译后的模板,提高重复渲染的性能。 - 自定义指令:可以通过扩展Velocity,编写自定义指令以满足特定需求。 7. **最佳实践** - 尽量避免在模板中进行复杂的逻辑...

    Velocity简单案例

    10. **性能优化**: 通过缓存策略,Velocity可以提高模板的加载速度和渲染效率。例如,启用`cache.manager`和设置适当的缓存级别。 以上就是基于"Velocity简单案例"所涵盖的一些基本知识点。在实际应用中,开发者...

    apache velocity介绍及资料

    8. **性能优化**:讨论如何调整Velocity引擎的配置以提高模板渲染速度。 9. **与其他技术集成**:Velocity可以与Spring、Struts等框架集成,实现更复杂的Web应用。 10. **案例分析**:手册可能包含实际项目中的...

    浅谈Java模板引擎性能对比

    Thymeleaf 3模板引擎的性能排名最低,这可能是由于Thymeleaf 3需要更多的资源来解析和渲染模板。然而,Thymeleaf 3具有许多其他优点,如支持国际化和多语言支持。 Velocity 1.7模板引擎 Velocity是Apache软件基金...

    velocity1.5

    Velocity 1.5版本是该技术的一个重要里程碑,它在1.4的基础上进行了一些改进和优化,提高了性能和稳定性,使得开发者能够更加高效地处理视图层的渲染工作。 **1. 模板引擎基础** Velocity作为一个模板引擎,其主要...

    velocity_lib1.7-jar包

    1. 性能优化:Velocity 1.7 版本在性能上进行了提升,减少了内存占用,提高了模板渲染速度。 2. 支持MVC模式:通过与Spring等框架集成,Velocity可以很好地适应MVC架构,使模型、视图和控制器各司其职。 3. 强大的...

    Velocity资料汇总

    4. **上下文(Context)**:上下文是Velocity模板引擎中的核心数据结构,它存储了所有可供模板使用的变量和对象。开发者可以向上下文中放入Java对象,然后在模板中通过变量名访问这些对象。 5. **解释器...

Global site tag (gtag.js) - Google Analytics