zoukankan      html  css  js  c++  java
  • [velocity] velocity详解

    (1)为什么要使用模版语言?

    在服务器端可以使用 Velocity 处理模板和生成的动态内容(HTMLXML等)。这和 JSP 技术的目标非常接近。但是,JSP 模型可以毫无阻碍地访问底层的 Servlet API 和 Java 编程语言。它基本上是一种在很大程度上开放的访问模型。而作为一种完全自包含的模板引擎和脚本解释器,Velocity 拥有完全封闭的模型。任何针对系统和/或 Java 编程语言的访问都必须明确地启用。默认情况,Velocity 模板中不能访问 Java 编程语言的任何方面。这种封闭的模型使 Velocity 能够提供分离的模板表示层,与任何应用程序业务逻辑或者数据管理代码清晰地划分开。从而保证了web site 的长期可维护性.

    第一次解释jsp需要经过转换成java代码,再编译成class文件等步骤,而velocity则在速度上更快,因为它不需要经过像解释jsp页面那么多的步骤,其次velocity也可以用作其它实现的模板技术,像我在项目中就遇到过使用velocity来作为邮件的模板,而jsp显然做不到这样的功能

    拓展:在java领域,表现层技术主要有三种:jspfreemarkervelocity 
    jsp是大家最熟悉的技术 
    优点: 
    1、功能强大,可以写java代码 
    2、支持jsp标签(jsp tag 
    3、支持表达式语言(el 
    4、官方标准,用户群广,丰富的第三方jsp标签库 
    5、性能良好。jsp编译成class文件执行,有很好的性能表现 
    缺点:没有明显缺点,非要挑点骨头就是,由于可编写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 

    综合对比: 
    1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tageljsp好。 
    2freemarker宏定义比jsp tag方便,内置大量常用功能,比如html过滤,日期金额格式化等等,支持jsp标签。且freemarker和velovity一样,作为模版语言,都可以实现严格的mvc分离

    (2)Velocity模版语言(VTL)使用详解

    ① VTL变量声明

    所有的VTL statement 都是以#开头,且包含一个指示符,当客户访问你的页面时, the Velocity Templating Engine 将搜索页面中的所有符号,如果确定这是一个VTL 声明时就按一定规则处理动态内容符号#仅仅只是表明这可能是一个VTL 声明.记住以下的规则:
    使用$字符开始的references用于得到什么;使用 #字符开始的directives用于作些什么。

    在下面的例子中,一个值被分配给$foo变量,并在其后被引用。
    <html>
    <body>
    #set ( $foo = “Velocity” ) 
    Hello $foo World!
    </body>
    </html>
    上面的实现结果是在页面上打印“Hello Velocity World

    ② 注释语法

    单行注释:## 内容

    多行注释:#* 内容 *#

    文档格式:#** 内容  *#

    ③ 正式引用标记

    ${mudSlinger}     变量
    ${customer.Address}   属性
    ${purchase.getTotal()}   方法

    如果写成如下的语法格式,当值为null的时候会原样输出字符串

    $mudSlinger     变量
    $customer.Address   属性
    $purchase.getTotal()   方法

    所以尽量使用正式的标记或者可以写成如下的方式:

    $!mudSlinger     变量
    $!customer.Address   属性
    $!purchase.getTotal()   方法

    也可以一同使用

    $!{mudSlinger}     变量
    $!{customer.Address}   属性
    $!{purchase.getTotal()}   方法

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

    1.getaddress() 2. getAddress() 3. get(“address”) 4. isAddress()

    ④ 如何在velocity中使用特殊字符?

    $字符:货币字符 

    VTL中使用$2.5这样的货币标识是没有问题得的,VTL不会将它错认为是一个reference,因为VTL中的reference总是以一个大写或者小写的字母开始。但还是要明白,VTL中使用“”作为逃逸符。如:$name将会输出$name字符串。

    ⑤ 常用基础语法

    1)条件语句

    #if ( $foo )  1  #else  2  #end

    上例中的条件语句将在以下两种条件下成立:
    1.$foo是一个boolean型的变量,且它的值为true
    2.$foo变量的值不为null

    #if( $foo < 60 )  完蛋了 #elseif( $foo == 60 ) 万幸  #else 浪费 #end

    2)循环语句
        #foreach ( $product in $allProducts )
         这是第$velocityCount次循环,值为: $product 
        #end

    每次循环$allProducts中的一个值都会赋给$product变量。

    $velocityCount 变量的名字是Velocity默认的名字,你也可以通过修改velocity.properties文件来改变它。默认情况下,计数从“1”开始,但是你 可以在velocity.properties设置它是从“1”还是从“0”开始。下面就是文件中的配置:
    directive.foreach.counter.name = velocityCount
    directive.foreach.counter.initial.value = 1

    现在我们假设$allProducts是一个Hashtable,如果你希望得到它的key应该像下面这样:
    <ul>
    #foreach ( $key in $allProducts.keySet() ) 
    <li>Key: $key -> Value: $allProducts.get($key) </li>
    #end 
    </ul>

    3) 关系、逻辑运算符

    相等 ==     不等 !=    且 &&    ||   非 !

    4) include 

    #include script element允许模板设计者引入本地文件。被引入文件的内容将不会通过模板引擎被render。为了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目录下。
    #inclued ( “one.txt” ) 
    如果您需要引入多个文件,可以用逗号分隔就行:
    #include ( “one.gif”, “two.txt”, “three.htm” ) 
    在括号内可以是文件名,但是更多的时候是使用变量的:
    #inclue ( “greetings.txt”, $seasonalstock )

    5) parse
    #parse script element允许模板设计者一个包含VTL的本地文件。Velocity将解析其中的VTLrender模板。
    #parse( “me.vm” )
    就像#include#parse接受一个变量而不是一个模板。任何由#parse指向的模板都必须包含在TEMPLATE_ROOT目录下。与#include不同的是,#parse只能指定单个对象。
    你可以通过修改velocity.properties文件的parse_direcive.maxdepth的值来控制一个template可以包含的最多#parse的个数――默认值是10#parse是可以递归调用的

    6) Range Operator

    #foreach ( $bar in [2..-2] )  $bar #end

    结果:2 1 0 -1 -2

    #set ( $arr = [0..1] ) 
         #foreach ( $i in $arr ) $i #end

    结果:0 1

    7) 内置对象

    velocity内置了一些对象,在vm模版里可以直接调用,列举如下:
    $request$response$session,另外,模板内还可以使用 $msg内的消息工具访问 Struts 的国际化资源,达到简便实现国际化的方法。

    8) 四则运算

    直接进行四则运算将会默认为字符串连接,因此运算应该是如下的方式解决。

    如果$foo=2.$foo + 1 结果是21,而不是3.

    需要先#set ( $value = $foo + 1 ) ,然后$value 结果才是3

    9) 解析步骤

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

    初始化Velocity==>创建context对象==>添加数据到context==>选择模板==>合并模板和数据,产生输出页面

    10) velocity.properties文件详解(spring集成的时候主要是配置在prop标签中)

    1. tools.view.servlet.error.template = error.vmzd 

    处理错误信息的模板路径 

    2. tools.view.servlet.layout.directory = /WEB-INF/layout/ 所有布局文件的默认路径 

    3. tools.view.servlet.layout.default.template = defauzlt.vm 

    默认的布局文件 

    4. #模板编码: 

    input.encoding=ISO-8859-1 //模板输入编码 

    output.encoding=ISO-8859-1 //模板输出编码 

    5. velocimacro.library=/WEB-INF/vm/macro.vm,/WEB-INF/vm/tuanmacro.vm 

    是一个逗号分隔的所有Velocimacro 模板库的列表 

    3)如何把VTL集成到spring的项目框架中?

    ① 需要的jar

    commons-collections.jar

    velocity-1.5.jar

    velocity-dept.jar

    velocity-tool-view1.4.jar

    下载地址:http://jakarta.apache.org/velocity/

    ② 引入Velocity

    application-context.xml配置文件里配置VelocityConfigurer,当然也可以在dispatcher-servlet(application-springmvc.xml里面配置,这完全取决于你自己的想法。

    下面的配置使Spring能够知道我们的模板文件是放在哪里的

    <bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">        <property name="resourceLoaderPath" value="/WEB-INF/views"/>    </bean>

    dispatcher-servlet里配置VelocityViewResolver

    下面的配置则是针对一个模板文件使用的是什么后缀。

    <bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">         <property name="suffix" value=".vm"/>    </bean>

    本项目例子:

     

     

     

    格式化时间:

    $date.format('yyyy-MM-dd HH:mm:ss',$element.createTime)

  • 相关阅读:
    【LabVIEW】多列列表框使用汇总
    【LabVIEW】数据类型 汇总
    U-BOOT移植 前准备
    linux 的 输入子系统 与 平台设备系统个人理解
    关于内核编译的理解
    关于 内核编译make menuconfig 不能使用的解决
    函数式接口的使用 (Function、Predicate、Supplier、Consumer)
    获取单列集合,双列集合,数组的Stream流对象以及简单操作
    多线程的创建、匿名内部类方式创建线程、定义、调度步骤
    异常类的使用
  • 原文地址:https://www.cnblogs.com/avivaye/p/4418878.html
Copyright © 2011-2022 走看看