Velocity应用

在应用程序(Application)中使用Velocity


Velocity被设计为一个通用的功具包,它也常用于一般的应用程序中. 如这篇指南开始所讨论的那样, 另外,这里还有一些对一般应用程序来说很有用的工具类:

 

 1.The Velocity Helper Class   

  Velocity 提供一个 utility class ( org.apache.velocity.app.Velocity ). 这个类中提共一个初始化Velocity所必需的方法, 具体的细节可以到文档中查看.

  Velocity runtime engine在运行时是单实例模式,它可以给 Velocity的用户通过同一个jvm提供日志,资源访问方法. 这个engine运行时仅初始化一次. 当然,你可以尝初对init()进行多次调用, 但只有第一次有效. The Velocity utility class 目前提供5个命令来配置运行时engine:

5个配置方法是 :

setProperty( String key, Object o )
这么简单,不用解释了吧.

Object getProperty( String key )
嗯,也不说了

init()
用默认的参数文件初始化

init( Properties p )
用一个特定的java.util.Properties对象初始化.

init( String filename )
用指定名字的参数文件初始化

注意:除非你指定了,否则初始时会使用默认参数. 仅当在调用init()时的配置会对系统生效。

通用的 initializing Velocity 一般步骤如下:

设置你指定的配置参数值在文件org/apache/velocity/runtime/defaults/velocity.properties中,或放入java.util.Properties, 在第一次调用init( filename )或 init( Properties ) .

单独设置每个配置参数通过调用 setProperty(),最后调用init(). 这适合一些一有自己的CMS系统(configuration management system )程序。

运行时一但初始化, 你就可以开始工作了.. 只需要考虑组装什么样的数据对象到你的输出模板上, Velocity utility class 可以帮你更容易做到这些.这里有一些命令摘要描述如下 :

evaluate( Context context, Writer out, String logTag, String instring )
evaluate( Context context, Writer writer, String logTag, InputStream instream )
这个命令用来修饰输入流,你可以将包含TVL的模板文件从内置的String对象、DB、或非文件系统的数据源输入,
invokeVelocimacro( String vmName, String namespace, String params[], Context context, Writer writer )你可以直接访问Velocimacros. 也可以通过evaluate()命令来完成,这里你只需简单的传入VM文件名(模板文件), 创建一组VM参数放到Context,然后输出. 注意放入Context的参数必须是键-值对出现的.

mergeTemplate( String templateName, Context context, Writer writer )
这个命令用来执行Velocity的模板合并和渲染功能. 它将应用context中的数据对象到指定文件名的模板中.将结果输出的指定的Writer. 当然,如果没有特别的需要,不建议这么做.

boolean templateExists( String name )
检测当前配置的资源中,是否存在name的模板名.

这样,我们就更容易编写使用Velocity的java代码了. Here it is

import java.io.StringWriter;

import org.apache.velocity.app.Velocity;

import org.apache.velocity.VelocityContext;

public class Example2

{

    public static void main( String args[] )

    {

        /* first, we init the runtime engine.  Defaults are fine. */

       Velocity.init();

       /* lets make a Context and put data into it */

        VelocityContext context = new VelocityContext();

       context.put("name", "Velocity");

        context.put("project", " Jakarta ");

         /* lets render a template */

        StringWriter w = new StringWriter();

        Velocity.mergeTemplate("testtemplate.vm", context, w );

        System.out.println(" template : " + w );

        /* lets make our own string to render */

        String s = "We are using $project $name to render this.";

        w = new StringWriter();

        Velocity.evaluate( context, w, "mystring", s );

        System.out.println(" string : " + w );

    }

}

运行如上程序,在运行程序的目录下将得到模板文件testtemplate.vm (默认配置中模板文件的输出位置是当前目录):

template : Hi!  This Velocity from the Jakarta project.

 string : We are using Jakarta Velocity to render this.

where the template we used, testtemplate.vm, is

Hi!  This $name from the $project project.

 

在这里,我们不得不使用 mergeTemplate() and evaluate() in our program. 这主要是为了示例. 在一般应用中,这是很少使用到的,但我们提供了根据具体需要自由使用的途径.

这有点不和我们这篇文张本意的“基础功能指南”这一意图, 但我想这是必须知道的. 首先, 你得到一个放置了数据对象的context对象, 不用的是使用了命令 mergeTemplate(), mergeTemplate() 所做的工作是合并模板, 在运行时调用低层功能(lower-level). 接下来,通过evaluate()方法使用一个String动态生成模板.

这是同样简单的使用Velocity engine的方式,这些可选功能也许可以帮你做一些重复的工作,比如生成模板的模板:)

 2.Exceptions 

There are three exceptions that Velocity will throw during the parse / merge cycle在解析/合并(parse/merge)模板周期中,Velocity或能出现三个Velocity异常.另外,还可能会有 IO problems, etc. Velocity自定义的异常可以在package org.apache.velocity.exception:

ResourceNotFoundException
velocity的资源管理器无法找到系统请求的资源时出现.

ParseErrorException
parse模板文件中的 VTL 语法出错时出现.

MethodInvocationException
Thrown when a method of object in the context thrown an exception during render time,当处理模板中,context中的对象的命令调用出错时.

当然,每一次出错时,相关的消息内容会保存到运行时的日志文件中,获取更多资料,请查看API文档。

 3.其它细节 

在以上的一些例程中,使用默认的properties配置你的程序非常方便. 但你可以根据自己的需要,用自己的配置文件通过在Velocity中调用init(String yourFileName)命令传入你的配置文件名, 或创建一个保存了你的配置参数的 java.util.Properties对象,通过调用 init(Properties)命令来实现. 这其中后一个方式是很便捷的, 你可以直接将一个独立的参数文件通过load()调用,将其中的配置参数置入Properties对象中. 你还可以做得列好---你可以在运行时运态的从你的程序框架中加入参数. 这样,你应可以将Velocity的配置参数和你原来应用的配置在不做大的更改情况下共用。

当需要从一个指定的目录提取模板文件时(默认为当前目录),你可以这样做 :

import java.util.Properties;

...

public static void main( String args[] )

{

    /* first, we init the runtime engine.  */

    Properties p = new Properties();

    p.setProperty("file.resource.loader.path", "/opt/templates");

    Velocity.init( p );

    /* lets make a Context and put data into it */

 ...

这样,Velocity在需要时,将自动到/opt/templates目录下查找模板文件,如果有问题可以查看velocity.log中所记录的出详细出错信息。它会帮你有效的消息错误.


在Servlet中使用Velocity 打印

 1.Servlet Programming

 

Velocity最通常用在servlet中做为www服务. 有非常多的理由告诉你这项任务是最适合Velocity完成的,最重要的一个就是Velocity's可以分离视图(表现层和)代码层.在这里可以看到更多的理由this
   在servlet中使用Velocity是非常简单的. 你只需要extend 己有的 VelocityServlet class和一个必须实现的方法: handleRequest().

public Template handleRequest( HttpServletRequest, HttpServletResponse, Context )

   这个方法直接传送HttpServletRequest 和 HttpServletResponse objects,. 这个方法可以返回null值表示所有处理己经完成, 相对而言,指示velocity调用velocity requestCleanup()更为常用. 如下代码示例(在例程中有)

 

 

 

public class SampleServlet extends VelocityServlet

{

    public Template handleRequest( HttpServletRequest request,

                                   HttpServletResponse response,

                                   Context context )

    {

        String p1 = " Jakarta ";

        String p2 = "Velocity";

        Vector vec = new Vector();

       vec.addElement( p1 );

        vec.addElement( p2 );

        context.put("list", vec );

        Template template = null;

        try

        {

            template =  getTemplate("sample.vm");

        }

        catch( ResourceNotFoundException rnfe )

        {

          // couldn't find the template

        }

        catch( ParseErrorException pee )

        {

          // syntax error : problem parsing the template

        }

        catch( Exception e )

        {}

       return template;

    }

}

  看起来好熟悉吧? 除过处理一些异常,基本的功能Velocity都己为你准备好了, 就连在应用程序中要你写的merge() 这一步,VelocityServlet自己也己处理,这就是基本的用法:取得context, 加入我们自己的对象最后返回模板 template.

  默认的 Context是作为 handleRequest() 传入的. 可以使用以下常量直接访问 request和response对象,VelocityServlet.REQUEST (value = 'req') and VelocityServlet.RESPONSE (value = 'res') ,如下是java例程 :

public Template handleRequest(  Context context )

{

    HttpServletRequest request =  (HttpServletRequest) context.get( REQUEST );

    HttpServletResponse response =  (HttpServletResponse) context.get( RESPONSE );

  ...

}

可以在模板中如下访问:

#set($name = $req.getParameter('name') )

一些更高级的用法,如VelocityServlet base class 可以在处理请求时重写更多的签名方法 :

Properties loadConfiguration( ServletConfig ) 

这可以重写常规的配置方法. 这常用在修改日志路径或运行时改写webapp root的绝对路径.

Context createContext(HttpServletRequest, HttpServletResponse ) 

你可以创建自己的Context object. 这可以使用更高级的技术, 如数据链或预载数据和工具类. 默认的实理仅返回一个己内置request and response 对象的VelocityContext.你直以在模板中直接访问他们的命令。

void setContentType( HttpServletRequest,HttpServletResponse )

你可以自己定义contentType, 或提取client定义的. 默认的contentType类型在velocity.properties文件中配置, 一般来说,默认的"text/html" 类型是不够详细的.

void mergeTemplate( Template, Context, HttpServletResponse )

你可以生成输出流(output stream). VelocityServlet使用含有多种输出对象的池, 在特定情形下,重写这个命令是有用的.

void requestCleanup( HttpServletRequest, HttpServletResponse , Context ) 

这个调用一般在处理完后做资源的清理工作,如有需要,在这个命令的重写内容中加上你的代码.

protected void error( HttpServletRequest, HttpServletResponse, Exception ) 

处理中,当错误发生时,这个方法会被调用. 默认的实现是将发送一个简单的HTML格式的错误内容到客户端. 你可以重写以定制错误处理.

更多的信息,请参考 API documentation.

2.Deployment  

发布基于Velocity的servlets 时,需要参数来配置 Velocity runtime. 在Tomcat上, 一个简单的方法是将velocity.properties文件放到你的webApp root目录下 (webapps/appname ) 然后在 WEB-INF/web.xml 文件中加上以下几行 :

<servlet>

  <servlet-name>MyServlet</servlet-name>

  <servlet-class>com.foo.bar.MyServlet</servlet-class>

  <init-param>

      <param-name>properties</param-name>

      <param-value>/velocity.properties</param-value>

  </init-param>

</servlet>

以上配置将确保MyServlet 可以被载入,Velocity也将会使velocity.properties来初始化.

注意: Velocity 在运行时使用的是单实例模式, 因此将 velocity-XX.jar放到YourWebAPP/WEB-INF/lib目录即可. 但当多个webApp要使用时,放入CLASSPATH 或Servlet容器的顶层 lib是最好的选择.


《Velocity1.4Web开发指南中文版》中文版 打印

1.使用Velocity构建Web应用

 

Velocity常见的用途是生成web页面, 通常用来替换JSP技术. 使用它生成页面有以下优势:

 

  • 简洁一般的web美工不需要懂程序语言的就可以设计动态业面.

     

  • Web系统容易维护 – MVC推荐的做法是在页面中不要存在其它的脚本语言出现..

     

  • 容易访问数据模型的命令和属性 – 页面设计者通过引用简单的就可访问context中的java数据对象.

     

  • 一致性 – Velocity可用做其它的文本模板生成任务,如如发送email.

本系列全面讲解了将Velocity应用从入门到精通其技术特点应用的每个方面,助你成为MVC构架的高手,本文由javaFound( <script language="JavaScript" type="text/javascript"> /n </script> NetJava.cn@gmail.com <script language="JavaScript" type="text/javascript"> </script> 此邮件地址受阻挡spam的自动程序保护,需要激活Javascript功能才能查阅。 <script language="JavaScript" type="text/javascript"> </script>

)译自http://velocity.apache.org/ .

 

2.Use a Framework

 

Velocity的主要目标是通过模板生成格式文档. 因此, Velocity自身不提供任何Web相关的功能. 当你需要开发Web应用时, 需要一个框架来接收HTTP请求和, 处理用户认证,执行业务逻辑调用,最后生成应答内容返回给客户端。这里有几个良好的可选方案:

 

1.      Velocity Tools / VelocityViewServlet – 这是最容易的起步方法,你在下载时可同时下载Velocity Tools (Velocity的一个子项目)来使用其所长 VelocityViewServlet. 这是一个很容易配置和安装的Servlet. 在你的web服务器上创建一个模板目录,编辑一下配置的XML文件就行了---这很容易,我们随后就讲到.

 

2.      Velocity Tools / VelocityStruts – 也许你比较熟悉流行的 Struts framework, Struts最初被设计为JSP应用提供更多的功能支撑.利用Velocity的 VelocityStruts 模块工具, 可以替代jsp而用模板语言做Web页面对面. 这样Struts的强大功能和Velocity有轻巧灵活就有效的结合到一起.

 

3.      第三方框架 – 还有更多的第三方框架可用,你可到wiki PoweredByVelocity 页面上了解更多, Spring 也许是目前最为知名的了. Jakarta Turbine 也有很多特色也是与Velocity结合最好的. 它使用VTL做为主要的页面语言, 它优秀的设计会让你惊异开发者到底是怎么设计的它. 另外还有 Click or Maverick frameworks, 也提供了与Velocity整合很好的结构.

 

4.      创建你自己的 – 最后的一招是创建你自己的应用结构,只需创建一个主要用于分发请求的Servlet servlet, 用来从文件或DB提取模板,整合你现有的业务域处理后,将结果发给用户,一点也不费力气,就可用它整合你现有的系统. 更进一步,你可以通过extends  VelocityViewServlet 来添加更多的你需要的功能.

 

另一方面,你可以多处引用VelocityServlet,但我们强烈建议你使用Velocity Tools中的VelocityViewServlet替代它.

 

  3.Web应用用例

 

这儿讲解一些在Web应用中的一般规则:

 

  4.不要改变己输出对象的状态!

 

Velocity实际上通过引用来调用对象的命令.当页面正在显示时,而程序中的对象发生了改变,这就会带来麻烦,如下例程示:

 

比如,以下是一个正常的调用一个List的命令size() 来显示结果.

 

There are $users.size() currently logged in.

 

例如你在一个计算银行帐额的页面中如下写道:

 

2005 data: $table.data

 

$table.calculateNextYear()

 

2006 data: $table.data

 

这里就有可能发生问题:你在通过VTL来改变一个对象的状态后,再输出对象的数据,----要保证输出的数据如你所愿,就绝对要保证在VTL中计算完成,没有其它操作改变这个对象的状态,但页面的设计者在使用VTL时肯定不能保证这一点:想像你刚计算出帐金额,在没输出前某个地方的另一个操作将这个金额清0了,你会晕死呢。。。。。. 这种问题出现的可能性无法从VTL本身的语法中消除,比如常用的#if 和 #foreach指令操作中就可能出现,或在你用来控制应用的会话状态时会出现更多.

 

因此:强烈建议仅仅是使用Velocity将需要的信息插入到文本中---Velocity中的引用只是从java数据对象取得信息,而这个提取的命令调用不要改变对象的任何状态!,不要在VTL中操作对象!

 

如果确实需要这样做 (像上面的那个例子) ,可以先把计算出的值放入一个由控制器管理下的map或list中,所有计算结果的提取或状态的改变都由一个控制器来代理.

 

另一个要注意的是, 不要将Iterator or Enumeration 对象放入context,可以用List或Set对象..

 

  5.HTML/XML字符转义

 

用户输入的包含特定 HTML or XML 符号的内容 (如 <, >, or &)在Web页面中需要转义. 这是保证这字符串有效的办法, 也可以防止出错 cross-site scripting. 与JSTL (the Java Standard Tag Language found in Java Server Pages)不同的是, Velocity 默认不会对这些字符做转义处理.

 

Velocity还是提供了这个事件接口: ReferenceInsertionEventHandler ,在这种字符插入到VTL中时让你接收事件.你可以在文件velocity.properties中配置EscapeHtmlReference处理器以处理的表达式. 以下配置将包装所有以msg开头的内容为HTML 内容实体(e.g. $msgText).

 

eventhandler.referenceinsertion.class = org.apache.velocity.app.event.implement.EscapeHtmlReference

 

eventhandler.escape.html.match = /msg.*/

 

注意:有时其它封类型.如,CSS( style sheets)中的@ 符号需要封装, Javascript中的单引号'也需要.

 

  6.应用安全性

 

Web应用是运行在网络上的一个服务,会有很多用户访问不同机密程序的资源, 安全性是其首要条件. 一些标准的Web安全规则是Velocity所支持的.一些用法 (系统配置,兼容性脚本,命令拦截)都可以参考 Building Secure Applications with Velocity. 以进一步了解, 你也需要防止模板设计者写下 "危险"的引用指令---你需要对java对象更好的封装.还可以这样做,只是我不知这话是什么意思: you may want to prevent template designers from including "dangerous" reflection-related methods by specifying the SecureUberspector to get/set properties and execute method calls.

 

runtime.introspector.uberspect = org.apache.velocity.util.introspection.SecureUberspector

 

 

  7.日志文件

 

Velocity日志配置方面需求较少,它默认的会在使用的web程序的当前目录下创建velocity.log,"current directory" –指的是应用服务器启动的目录,如你从tomcat的bin目录下双击start.bat启动,那这个日志就是在bin下.

 

  8.布署指南

 

这是一个将VelocityViewServlet构建到你的Web 应用中的简洁指南. (建议你先将VelocityViewServlet从源包中编译,但这不是必须的).我们建议按如下步骤使用:

 

需要 Java Developer's Kit (JDK) and Apache Ant 支持.

 

更多的信息可以查看 Velocity Tools documentation.

 

1.      下载Veloicyt tools和源码: download page.

 

2.      输出以下命令使用ant编译 Velocity Tools jar和例子:

 

3.             ant example.simple

 

4.      打开目录 "examples" ,你将看到"index.vm". 这是其中一些内容摘要::

 

5.             <html>

 

6.             <body>

 

7.             I'm a velocity template.

 

8.            

 

9.             #if( $XHTML )

 

10.            #set( $br = "<br />" )

 

11.          #else

 

12.            #set( $br = "<br>" )

 

13.          #end

 

14.         

 

15.          $br

 

16.          $br

 

17.         

 

18.          Here we use a custom tool: $toytool.message

 

19.         

 

20.          $br

 

21.          $br

 

22.         

 

23.          Here we get the date from the DateTool:  $date.medium

 

24.          </body>

 

25.          </html>

 

You can copy any additional velocity files into this same directory. In examples/WEB-INF you will see a file "toolbox.xml". This specifies a list of "Tools" that are automatically included in the context.

 

<toolbox>

 

  <xhtml>true</xhtml>

 

  <tool>

 

     <key>toytool</key>

 

     <class>ToyTool</class>

 

  </tool>

 

  <data type="number">

 

    <key>version</key>

 

    <value>1.1</value>

 

  </data>

 

  <data type="boolean">

 

    <key>isSimple</key>

 

    <value>true</value>

 

  </data>

 

  <data type="string">

 

    <key>foo</key>

 

    <value>this is foo.</value>

 

  </data>

 

  <data type="string">

 

    <key>bar</key>

 

    <value>this is bar.</value>

 

  </data>

 

  <tool>

 

    <key>map</key>

 

    <class>java.util.HashMap</class>

 

  </tool>

 

  <tool>

 

    <key>date</key>

 

    <scope>application</scope>

 

    <class>org.apache.velocity.tools.generic.DateTool</class>

 

  </tool>

 

</toolbox>

 

And finally the web.xml file specifies the name of the servlet and location of toolbox.properties.

 

<web-app>

 

  <servlet>

 

    <servlet-name>velocity</servlet-name>

 

    <servlet-class>

 

        org.apache.velocity.tools.view.servlet.VelocityViewServlet

 

    </servlet-class>

 

    <init-param>

 

      <param-name>org.apache.velocity.toolbox</param-name>

 

      <param-value>/WEB-INF/toolbox.xml</param-value>

 

    </init-param>

 

    <load-on-startup>10</load-on-startup>

 

  </servlet>

 

  <servlet-mapping>

 

    <servlet-name>velocity</servlet-name>

 

    <url-pattern>*.vm</url-pattern>

 

  </servlet-mapping>

 

  <welcome-file-list>

 

    <welcome-file>index.vm</welcome-file>

 

  </welcome-file-list>

 

</web-app>

 

26.   将这个目录下的东东全部考到你的tomcat的"webapps" 目录下. ---也可以只考 "simple.war",现在可以这样来访问了:

 

27.          http://localhost:8080/simple/index.vm

 

28.   你可以测试加入新的velocity模板. 你只需改变访问的URL就可访问这些页面. 可以在Toolbox.xml 中改变配置或创建你自己的工具,请查看 Velocity Tools 文档或 Wiki 取得更多信息.

 

 

《VTL语法参考指南中文版》 打印

1.关于本指南 

本文为Velocity的模板语言参考书,如需了解更多信息,请参见Velocity Guide .

2.语法参考 

1.变量定义 

变量名的有效字符集:

$ [ ! ][ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ][ } ]

Examples:

  • 一般方式: $mud-Slinger_9
  • 静态(输出原始字面): $!mud-Slinger_9
  • 正规格式: ${mud-Slinger_9}

2.访问属性 

格式规则:

$ [ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ]* .[a..z, A..Z ][ a..z, A-Z, 0..9, -, _ ]* [ } ]

Examples:

  • 一般格式: $customer.Address  :调用customer对象的getAddress()命令.
  • 正规格式: ${purchase.Total}

3.命令调用 

格式规则:

$ [ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ]* .[ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ]*( [ optional parameter list... ] ) [ } ]

Examples:

  • 一般写码: $customer.getAddress()
  • 正规写法: ${purchase.getTotal()}
  • 传入调用参数: $page.setTitle( "My Home Page" )

VTL的属性调用可以理解为命令调用的简写方式,一般会调用对象的get/set命令.

3.动作指令 

1.#set – 建立变量对值的引用 

格式规则:

# [ { ] set [ } ] ( $ref = [ ", ' ]arg[ ", ' ] )

Examples:

  • 变量引用: #set( $monkey = $bill )
  • 引用原始字符串: #set( $monkey.Friend = 'monica' )
  • 属性引用: #set( $monkey.Blame = $whitehouse.Leak )
  • 命令引用: #set( $monkey.Plan = $spindoctor.weave($web) )

直接引用数字: #set( $monkey.Number = 123 )

  • 列表赋值引用: #set( $monkey.Numbers = [1..3] )
  • 对象数组: #set( $monkey.Say = ["Not", $my, "fault"] )

右值也可以做为一个表达式出现,如下加,减,cheng,除和取模:

  • Addition: #set( $value = $foo + 1 )
  • Subtraction: #set( $value = $bar - 1 )
  • Multiplication: #set( $value = $foo * $bar )
  • Division: #set( $value = $foo / $bar )
  • Remainder: #set( $value = $foo % $bar )

2.#if/#elseif/#else-条件判断 

格式规则:

# [ { ] if [ } ] ( [条件表达式] ) [输出内容] [ # [ { ] elseif [ } ] ( [condition] ) [output] ]* [ # [ { ] else [ } ] [output] ] # [ { ] end [ } ]

Usage:

  • condition – 如果是boolean型,根据true或false决定,否则非null时认为是true.
  • output –可以包含VTL的输出内容.

Examples (showing different operators):

Operator Name 

Symbol 

Alternative Symbol 

Example 

Equals Number

==

eq

#if( $foo == 42 )

Equals String

==

eq

#if( $foo == "bar" )

Object Equivalence

==

eq

#if( $foo == $bar )

Not Equals

!=

ne

#if( $foo != $bar )

Greater Than

>

gt

#if( $foo > 42 )

Less Than

<

lt

#if( $foo < 42 )

Greater Than or Equal To

>=

ge

#if( $foo >= 42 )

Less Than or Equal To

<=

le

#if( $foo <= 42 )

Boolean NOT

!

not

#if( !$foo )

注意:

1.      “== “操作可以用来比较数字,字符串,或同一个类的不同对象或不同类型的对象. 当是不同类的对象时,会调用它们的toString()命令结果来做比较看是否相等.

2.      也可以如下用法,但注意else处,用{}括起.

#if( $foo == $bar)it's true!#{else}it's not!#end</li>

3.#foreach---使用循环通过列表迭代对象 

Format:

# [ { ] foreach [ } ] ( $ref in arg ) statement # [ { ] end [ } ]

Usage:

  • $ref – 引用的要迭代的对象.
  • arg – 可能是:一个列表引用 (i.e. object array, collection, or map), an array list, 或其它列表.
  • statement – 当velocity发现下一个有效对像在列表中,输出可以是一个合法的VTL.

示例 #foreach()用法,:

  • 引用: #foreach ( $item in $items )
  • 数组列表: #foreach ( $item in ["Not", $my, "fault"] )
  • 根据设定的界限: #foreach ( $item in [1..3] )

如下可以取得循环次数的当前值:

<table>

#foreach( $customer in $customerList )

    <tr><td>$velocityCount</td><td>$customer.Name</td></tr>

#end

</table>

默认的循环次数的引用变量名为 $velocityCount. 可以在配置文件velocity.properties中做如下修改成你想要的:

# Default name of the loop counter

# variable reference.

directive.foreach.counter.name = velocityCount

 

# Default starting value of the loop

# counter variable reference.

directive.foreach.counter.initial.value = 1

注意,可以对所有可循环的次数加一个最大值来控制,默认的是-1,表示元限制:

# The maximum allowed number of loops.

directive.foreach.maxloops = -1

4.#include – 在模板中引入本地文件,不用Velocity解析这个文件 

Format:

# [ { ] include [ } ] ( arg[ arg2 ... argn] )

  • arg – 目录TEMPLATE_ROOT下面的有效文件名.

Examples:

  • 直接写文件名: #include( "disclaimer.txt,"opinion.txt" ):如有多个文件时用逗号分开
  • 使用变量引用的文件名: #include( $foo,$bar )

5.#parse – 在模板引用处使用Velocity解析另一个模板输出 

Format:

# [ { ] parse [ } ] ( arg )

  • arg -目录TEMPLATE_ROOT下面的有效文件名.

Examples:

  • 直接写文件名: #parse( "lecorbusier.vm" )
  • 使用变量引用的文件名: #parse( $foo )

通过设置配置中的解析层次深度的最大值velocity.properties中项 parse_directive.maxdepth in可以防止死循环. (The default parse depth is 10.)

6.#stop – 中断模板解析 

Format:

# [ { ] stop [ } ]

Usage:

在当前模板指令处停止解析,为方便调试用.

7.#macro – 让用户可以定义宏操作(Velocimacro (VM):一组实现特定功能的VTL) 

Format:

# [ { ] macro [ } ] ( vmname $arg1 [ $arg2 $arg3 ... $argn ] ) [ VM VTL code... ] # [ { ] #end [ } ]

  • vmname – 宏名字 VM (#vmname)
  • $arg1 $arg2 [ ... ] – 要传给宏的参数VM..
  • [ VM VTL code... ] –宏代码,有效的VTL.

一次定义好了,就可以在其它模板的任何地方使用宏指令来应用.

#vmname( $arg1 $arg2 )

宏(VM)可以写在以下两个地方:

1.      (模板库)Template library: 可以配置用户定义的库以便全站使用

2.      Inline: 放入到一般的模板文件中, 仅当配置参数 velocimacro.permissions.allowInline=true 时生效.

4.Comments 注解 

Comments不是运行时所必须的,但你一定要写.

1.单行注解 

Example:

## This is a comment.

2.多行注解 

Example:

#*
This is a multiline comment.
This is the second line
*#

5.Feedback 

如果您有什么问题或建议,请联系 <script language="JavaScript" type="text/javascript"> /n </script> Velocity developers list <script language="JavaScript" type="text/javascript"> </script> 此邮件地址受阻挡spam的自动程序保护,需要激活Javascript功能才能查阅。 <script language="JavaScript" type="text/javascript"> </script> . 或译者 <script language="JavaScript" type="text/javascript"> /n </script> Netjava.cn@gmail.com <script language="JavaScript" type="text/javascript"> </script> 此邮件地址受阻挡spam的自动程序保护,需要激活Javascript功能才能查阅。 <script language="JavaScript" type="text/javascript"> </script> Thanks!

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值