??xml version="1.0" encoding="utf-8" standalone="yes"?>91精品久久久久久综合五月天,日本在线观看不卡,男人的天堂亚洲http://www.aygfsteel.com/fiele/category/47059.htmlC的博?/description>zh-cnTue, 16 Nov 2010 11:39:12 GMTTue, 16 Nov 2010 11:39:12 GMT60 Velocity语法(VM) http://www.aygfsteel.com/fiele/archive/2010/11/16/338193.html半导?/dc:creator>半导?/author>Tue, 16 Nov 2010 08:43:00 GMThttp://www.aygfsteel.com/fiele/archive/2010/11/16/338193.htmlhttp://www.aygfsteel.com/fiele/comments/338193.htmlhttp://www.aygfsteel.com/fiele/archive/2010/11/16/338193.html#Feedback0http://www.aygfsteel.com/fiele/comments/commentRss/338193.htmlhttp://www.aygfsteel.com/fiele/services/trackbacks/338193.html  Velocity语法(VM)  
 

1.     变量

(1) 变量的定?Q?

#set($name = "hello")      说明Qvelocity中变量是q型的?

当?set 指oӞ括在双引号中的字面字W串解析和重新解释Q如下所C:

#set($directoryRoot = "www" )

#set($templateName = "index.vm" )

#set($template = "$directoryRoot/$templateName" )

$template

输出会是: www/index.vm

注: 在velocity中?2.5q样的货币标识是没有问题得的Q因为velocity中的变量L以一个大写或者小写的字母开始的?

(2) 变量规范的写?

${name} Q也可以写成Q?name。提倡用前面的写法?

例如Q你希望通过一个变?vice 来动态的l织一个字W串?

 Jack is a $vicemaniac.

本来变量?$vice现在却变成了$vicemaniacQ这样Veloctiy׃知道您到底要什么了。所以,应该使用规范的格式书?Q?Jack is a ${vice}maniac
现在Velocity知道变量?vice而不?vicemaniac?

注意Q当引用属性的时候不能加{}

(3) 变量的赋? 

$name="hello"

赋值的左边必须是一个变量或者是属性引用。右边可以是下面六种cd之一Q?

变量引用,字面字符?属性引?Ҏ引用,字面数字,数组列表?

下面的例子演CZ上述的每U类型:

#set( $monkey = $bill ) ## variable reference

#set( $monkey.Friend = "monica" ) ## string

#set( $monkey.Blame = $whitehouse.Leak ) ## property reference

#set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference

#set( $monkey.Number = 123 ) ##number

#set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList

注意Q?①如果上qC子中的右值是null, 则左g会被赋|也就是说会保留以前的倹{?

②velocity模板中未被定义的变量被认ؓ是一个字W串。例如:

#set($foo = "gibbous")
$moon = $foo
输出l果为:
$moon = gibbous

?velocity 模板中不会将 reference 解释为对象的实例变量。例如: $foo.Name 被解释?Foo 对象?getName Q)ҎQ而不?Foo 对象?Name 实例变量。例如:

$ foo.getBar()  {同?$ foo.Bar Q?

$ data.getUser("jon") {同?$ data.User("jon") Q?

data.getRequest().getServerName() {同?

$ data.Request.ServerName {同?$ {data.Request.ServerName}

 

2.     循环

#foreach ($element in $list)
     This is $element.
     $velocityCount
#end

例子Q?

#set( $list = ["pine", "oak", "maple"])

#foreach ( $ element in  $ list)

$velocityCount

This is  $ element.<br>
#end

输出的结果ؓQ?

1 This is pine.
2 This is oak.
3 This is maple.

每次循环 $list 中的一个值都会赋l?$element 变量?
$list 可以是一?Vector?Hashtable 或?Array 。分配给 $element 的值是一?java 对象Qƈ且可以通过变量被引用。例如:如果 $element t 是一?java ?Product c,q且q个产品的名字可以通过调用他的 getNameQ) Ҏ得到?

#foreach ( $key in $list.keySet())
Key: $key -> Value: $list.get($key) <br>
#end

提示 Qvelocity中大写敏感?

Velocityq特别提供了得到循环ơ数的方法,$velocityCount变量的名字是Velocity默认的名字?

 

例子Q?

First example:
  #foreach ( $foo in [1..5] )
    $foo
  #end

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

  Third example:
  #set ( $arr = [0..1] )
  #foreach ( $i in $arr )
    $i
  #end
上面三个例子的输出结果ؓQ?
  First example Q?
  1 2 3 4 5

  Second example Q?
  2 1 0 -1 -2

  Third example Q?
  0 1

 

3.     条g语句

#if (condition)

#elseif (condition)

#else

#end

4.     语句的嵌?

    #foreach ($element in $list)

       ## inner foreach 内@?

       #foreach ($element in $list)

       This is $element. $velocityCount < br > inner < br >

       #end

       ## inner foreach 内@环结?

    ## outer foreach

    This is $element.

    $velocityCount < br > outer < br >

    #end

语句中也可以嵌套其他的语句,?if…#else…#end{?

5.       注释
(1)单行注释Q?br />   ## This is a single line comment.
(2) 多行注释Q?br />   #*
   Thus begins a multi-line comment. Online visitors won’t
   see this text because the Velocity Templating Engine will
  ignore it.
  *#
(3)文档格式Q?br />   #**
   This is a VTL comment block and
   may be used to store such information
  as the document author and versioning
   information:
   @version 1.1

   @author  xiao
     *#

6.     关系和逻辑操作W?

Velocity 也具有逻辑AND, OR ?NOT 操作W?

?

## example for AND

#if($foo && $bar)

   <strong> This AND that</strong>

#end

例子?if() 指o仅在$foo ?bar 斗ؓ真的时候才为真。如?foo 为假Q则表达式也为假Qƈ?$bar 不被求倹{如?$foo 为真QVelocity 模板引擎l检?bar的|如果 $bar 为真Q则整个表达式ؓ真。ƈ且输出This AND that 。如?$bar 为假Q将没有输出因ؓ整个表达式ؓ假?

7.Velocity 中的?

Velocity中的 宏我们可以理解ؓ函数?

①宏的定?

#macro(宏的名称 $参数1 $参数2 …)

   语句?卛_C)

#end

②宏的调?

#宏的名称($参数1 $参数2 …)

    说明Q参C间用I格隔开?

8Q?#stop

   停止执行模板引擎q返?把它应用于debug是很有帮助的?

9Q?include ?parse

#include?parse的作?都是 引入本地文g, Z安全的原因,被引入的本地文g只能在TEMPLATE_ROOT目录下?

区别Q?

(1) ?include不同的是Q?parse只能指定单个对象。?include可以有多?

如果您需要引入多个文Ӟ可以用逗号分隔pQ?
#include ( " one.gif " , " two.txt " , " three.htm " )
在括号内可以是文件名Q但是更多的时候是使用变量的:
#include ( “greetings.txt”, $seasonalstock )

(2) #include被引入文件的内容不会通过模板引擎解析Q?

?parse 引入的文件内?Velocity 解析其中的 velocity 语法q移交给模板Q意思就是说相当与把引入的文?copy 到文件中?

#parse是可以递归调用的,例如Q如果dofoo.vm包含如下行:

Count down.<br>

#set ($count = 8)

#parse ("parsefoo.vm")

<br>All done with dofoo.vm!

那么在parsefoo.vm模板中,你可以包含如下VTLQ?

$count

#set($count = $count - 1)

#if ( $count > 0 )<br>

#parse( "parsefoo.vm" )

#else

<br>All done with parsefoo.vm!

#end 的显C结果ؓQ?

Count down.

8

7

6

5

4

3

2

1

0

All done with parsefoo.vm!

All done with dofoo.vm!

注意Q在 vm中?parse来嵌套另外一个vm时的变量׃n问题。如Q?br /> ->a.vm 里嵌?b.vmQ?br /> ->a.vm 里定义了变量 $paramQ?br /> ->b.vm 里可以直接?paramQ无M限制?br /> 但需要特别注意的是,如果b.vm里同时定义有变量$paramQ则b.vm里将使用b.vm里定义的倹{?

10Q{义字W?\'的?

如果reference被定义,两个’\’意味着输出一?#8217;\’Q如果未被定义,刚按原样输出。如Q?

#set($email = "foo" )

$email

\$email

\\$email

\\\$email

输出Q?

foo
$email
\foo
\$email

如果 $email 未定?

$email

\$email

\\$email

\\\$email

输出Q?

$email
\$email
\\$email
\\$email

 

11Q?内置对象
Velocity内置了一些对象,在vm模版里可以直接调用,列D如下Q?br /> $request?response?sessionQ另外,模板内还可以使用 $msg内的消息工具讉K Struts 的国际化资源Q达到简便实现国际化的方法?

12. 数组讉K

Ҏl的讉K在Velocity 中存在问题,因ؓVelocity只能讉K对象的方法,而数l又是一个特D的ArrayQ所以虽然数l可以进行@环列举,但却不能定位讉K特定位置的元素,?strs[2]Q数l对固定位置元素的访问调用了Array的反方法get(Object array, int index)Q而Velocity没能提供q样的访问,所以数l要么改成List{其他类容器的方式来包装Q要么就通过公用Utilcȝ方式来提供,传入数组对象和要讉K的位|参敎ͼ从而达到返回所需值的目的?

 

 

CZ部分

1QHello world的示例代码:

(1)Velocity模板 (hello.html)

<!DOCTYPE HTML PUBLIC "-//W 3C //DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<TITLE> New Document </TITLE>

</HEAD>

<BODY>

    hello,$name!                 Q注意:q里的name与VelocityTest.java中的名称要一_

</BODY>

</HTML>

(2)velocity模板的内容{换的c?VelocityTest.java)

import java.io.File;

import java.io.FileOutputStream;

import java.io.PrintWriter;

import java.io.Writer;

import org.apache.velocity.Template;

import org.apache.velocity.VelocityContext;

import org.apache.velocity.app.Velocity;

import org.apache.velocity.app.VelocityEngine;

 

/**

 * Velocity转换

 * @author

 */

public class VelocityTest

{

    /**

     * d?

     * @param args

     */

    public static void main(String[] args)

 {

      //获取模板引擎

        VelocityEngine ve = new VelocityEngine();

        //模板文g所在的路径

        String path = "D:/java/jproject/regedit/webroot";      

        //讄参数

        ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);

//处理中文问题

        ve.setProperty(Velocity.INPUT_ENCODING,"GBK");

        ve.setProperty(Velocity.OUTPUT_ENCODING,"GBK");

        try

        {

            //初始化模?

            ve.init();

            //获取模板(hello.html)

Velocity 模板的名U?
 
            Template template = ve.getTemplate("hello.html");   

            //获取上下?

            VelocityContext root = new VelocityContext();

            //把数据填入上下文

            root.put("name","world");                     Q注意:与上面的对应Q?

//输出路径

            Strint outpath = "e:/helloworld.html";

            //输出

            Writer mywriter = new PrintWriter(new FileOutputStream(

                new File(outpath)));           

            template.merge(root, mywriter);

            mywriter.flush();          

        }

        catch (Exception e)

        {

            e.printStackTrace();

        }

    }

}

(3)环境的搭?

在lib目录内分别copy q:velocity-1.4.jarQvelocity-dept.jar;

下蝲地址Qhttp://jakarta.apache.org/velocity/

(4)q行后的l果如下Q?

<!DOCTYPE HTML PUBLIC "-//W 3C //DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<TITLE> New Document </TITLE>

</HEAD>

<BODY>

hello,world!

</BODY>

</HTML>

 

2Q?Servlet和Velocityl合 CZ

(1)example.html

  <html>
  <head><title>Velocity</title></head>
  <body bgcolor="#ffffff">
    <center>
    <h2>Welcom to Velocity!</h2>
    <i>Here's the list of people</i>
    <table cellspacing="0" cellpadding="5" width="20%" >
    <tr>
    <td bgcolor="#eeeeee" align="center">
    NamesQ?br />     </td>
    </tr>
    #foreach ($name in $theList)
    <tr>
    <td bgcolor="#eeeeee" align="center">$name</td>
    </tr>
    #end
    </table>
    </center>
  </body>
</html>

(2)servlet

package com.koal.velocity;

 

import java.io.IOException;

import java.io.FileNotFoundException;

import java.util.ArrayList;

import java.util.Properties;

import java.util.Vector;

import javax.servlet.ServletConfig;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.velocity.Template;

import org.apache.velocity.context.Context;

import org.apache.velocity.servlet.VelocityServlet;

import org.apache.velocity.app.Velocity;

import org.apache.velocity.exception.ResourceNotFoundException;

import org.apache.velocity.exception.ParseErrorException;

 

public class SampleServlet extends VelocityServlet 

{

    /**

     *   由VelocityServlet.init()调用Q?

     *   在此扑և模版的\?

     */

    protected Properties loadConfiguration(ServletConfig config )

        throws IOException, FileNotFoundException {

        Properties p = new Properties();

        //取得路径

        String path = config.getServletContext().getRealPath("/");

        if (path == null)

        {

            System.out.println(" SampleServlet.loadConfiguration() : unable to "

                    + "get the current webapp root.  Using '/'. Please fix.");

            path = "/";

        }

        //讄路径

        p.setProperty( Velocity.FILE_RESOURCE_LOADER_PATH, path);

       

        return p;

    }

 

    /**

     *  Velocity主要的商业逻辑处理ҎQ由VelocityServlet自动调用

     *  @param ctx 模板上下?nbsp;           

     *  @return Template 模板信息

     */  

    public Template handleRequest( HttpServletRequest request,

       HttpServletResponse response, Context ctx )

   {       

        //主要在此讄演示用的数据Q开发中在此调用相应的业务处理流E,

 

        //q设|返回到面的数?

        //待展C的列表数据
        String p1 = "W一位:LiuDong";
        String p2 = "W二位:Liang.xf";
        Vector personList = new Vector();
        //中文需要{?br />         try {
            personList.addElement(new String(p1.getBytes(), "ISO-8859-1") );
            personList.addElement(new String(p2.getBytes(), "ISO-8859-1") );
        } catch (Exception e) {
            System.out.println("数据转换异常Q?+e);   
        }
        //讄数据Q供面模版替换成显C的数据
        ctx.put("theList", personList );    

        //定义模板       

        Template outty = null;       

        try

        {

            //取模?

            outty =  getTemplate("example.html");           

        }

        catch( ParseErrorException pee )

        {

            System.out.println("SampleServlet: parse error for template " + pee);

        }

        catch( ResourceNotFoundException rnfe )

        {

            System.out.println("SampleServlet: template not found " + rnfe);

        }

        catch( Exception e )

        {

            System.out.println("Error " + e);

        }

       

        return outty;

}

 

(3)在web.xml中的配置Q?

<web-app>

<servlet> 

       <servlet-name>SampleServlet</servlet-name>

       <servlet-class>com.koal. velocity .SampleServlet</servlet-class>

</servlet>

    <servlet-mapping>

       <servlet-name>SampleServlet</servlet-name>

       <url-pattern>/SampleServlet</url-pattern>

</servlet-mapping>

</web-app>

 

(4)环境的搭?

在lib目录内分?copyq:commons-collections.jar , velocity- 1.4.jarQvelocity-dept.jar;
    Tomcatq行环境正常?br />     启动TomcatQ在IE上输入: http://localhost:8080/example Q页面显C数据列表:

 

本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/mmm123lmj/archive/2009/11/19/4833620.aspx



]]>
վ֩ģ壺 | ĵ| ͡| | | ʳ| Ϸ| ն| | | ߺ| ͨ| | | | ƽɽ| ٰ| ԭ| | | | | ˻| | ̨| | | Ҿ| | ۲| | Į| | կ| Ԫ| | ͳ| | | ٸ| ˰|