Velocity Java表现层技术

一,Velocity语法-表现层技术(JspFreemarker等)

Velocity是一个基于java的模板引擎(template engine),它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。作为一个比较完善的模板引擎,Velocity的功能是比较强大的,但强大的同时也增加了应用复杂性。此语法是一种Java模版引擎技术,是辅助java开发的,使用velocity模板语法可以使jsp的页面后缀直接使用*.html并在*.html中使用此语法调用数据库

当Velocity应用应用程序时,一般分一下几步:

(1)、初始化Velocity

  (2)、创建context对象

(3)、添加数据到context

(4)、选择模板

(5)、合并模板和数据,产生输出页面

 

    

基本语法Velocity模板语言(VTL)

1"#"用来标识Velocity的脚本语句,包括#set#if #else#end#forEach#end#include#parse#macro等;VTL 声明( statement),所有的VTL statement 都是以#开头,符号#仅仅只是表明这可能是一个VTL 声明

:

#if($info.imgs)

<img src="$info.imgs" border=0>

#else

<img src="noPhoto.jpg">

#end

 

2"$"用来标识一个对象(或理解为变量);如

如:$i$msg$TagUtil.options(...)等。

(

所有的引用在模板中都表现为一个字符串. 假设一个引用变量$foo 的值事实上是一个int, Velocity engine 在处理时将调用它的.toString()去解析这个字符串所代表的对象(int).

注意:模板中引用的必须是通过java Bean 中的getter/setter 实现的,而直接的java 对象的数据域是不能直接引用的,如$foo.Name 会解析到class Foo’s getName() 的实例方法,但不会解析到Foos 类的public Name 这个实例变量.

VTL 中有三种references:变量引用(variables),属性引用(properties)和命令引用(methods).

 

属性引用中的属性查找规则

前己提及,属性可以引用到对象的命令. Velocity 会使用合适的策略选择引用到的命令. 它会根据协定

的命令命令格式查找. 无论属性引用的的名字是否大小写,Velocity 都有固定的查找规则.如在

$customer.address 引用时,查找顺序是:

1. getaddress()

2. getAddress()

3. get(“address”)

4. isAddress()

对于VTL中大写的属性名Address 引用,将是:

1. getAddress()

2. getaddress()

3. get(“Address”)

4. isAddress()

 

)

 

3"{}"用来明确标识Velocity变量;

比如在页面中,页面中有一个$someonename,此时,Velocity将把someonename作为变量名,若我们程序是想在someone这 个变量的后面紧接着显示name字符,则上面的标签应该改成 ${someone}name

 

4"!"用来强制把不存在的变量显示为空白。

如当页面中包含$msg,如果msg对象有值,将显示msg的值,如果不存在msg对象同,则在页面中将显示$msg字符。这是我们不希望的,为了把不存 在的变量或变量值为null的对象显示为空白,则只需要在变量名前加一个“!”号即可。

如:$!msg

 

5,关于#set的使用

页面视图自己声明Velocity脚本变量,也就是尽量少使用#set,这个页面都在这个变量的作用区域,

应用示例范围

1$!obj  直接返回对象结果。

如:在html标签中显示java对象msg的值。<p>$!msg</p>

html标签中显示经过HtmlUtil对象处理过后的msg对象的值  <p>$!HtmlUtil.doSomething($!msg)</p>

 

2#if($!obj) #else #end 判断语句

如:在EasyJWeb各种开源应用中,我们经常看到的用于弹出提示信息msg的例子。

#if($msg)

<script>

alert('$!msg');

</script>

#end

上面的脚本表示当对象msg对象存在时,输出<script>等后面的内容。

 

3#foreach( $info in $list) $info.someList #end  循环读取集合list中的对象,并作相应的处理。

如:EasyJF开源论坛系统中论(0.3)坛首页显示热门主题的html界面模板脚本:

#foreach( $info in $hotList1) 

<ahref="/bbsdoc.ejf?easyJWebCommand=show&&cid=$!info.cid" target="_blank">$!info.title</a><br>

#end 

上面的脚本表示循环遍历hotList1集合中的对象,并输出对象的相关内容。

 

4、包含文件#inclue("模板文件名")#parse("模板文件名")

主要用于处理具有相同内容的页面,比如每个网站的顶部或尾部内容。

使用方法,可以参考EasyJF开源BlogEasyJF开源论坛中的应用!

如:#parse("/blog/top.html")#include("/blog/top.html")

parseinclude的区别在于,若包含的文件中有Velocity脚本标签,将会进一步解析,而include将原样显示

 

二、VelocityJspFreemarker的对比

java领域,表现层技术主要有三种:jspfreemarkervelocity。 

jsp是大家最熟悉的技术 

优点: 

1、功能强大,可以写java代码 

2、支持jsp标签(jsp tag) 

3、支持表达式语言(el) 

4、官方标准,用户群广,丰富的第三方jsp标签库 

5、性能良好。jsp编译成class文件执行,有很好的性能表现 

缺点: 

jsp没有明显缺点,非要挑点骨头那就是,由于可以编写java代码,如使用不当容易破坏mvc结构。 

 

velocity是较早出现的用于代替jsp的模板语言 

优点: 

1、不能编写java代码,可以实现严格的mvc分离 

2、性能良好,据说比jsp性能还要好些 

3、使用表达式语言,据说jsp的表达式语言就是学velocity的 

缺点: 

1、不是官方标准 

2、用户群体和第三方标签库没有jsp多。 

3、对jsp标签支持不够好 

 

freemarker 

优点: 

1、不能编写java代码,可以实现严格的mvc分离 

2、性能非常不错 

3、对jsp标签支持良好 

4、内置大量常用功能,使用非常方便 

5、宏定义(类似jsp标签)非常方便 

6、使用表达式语言 

缺点: 

1、不是官方标准 

2、用户群体和第三方标签库没有jsp多 

 

总结

性能:velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差,但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tageljsp好。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值