posts - 0,  comments - 17,  trackbacks - 0
来源:http://www.blogjava.net/pepsixp/archive/2005/03/11/1685.html
FreeMarker是一个用Java编写的模板引擎,主要用来生成HTML Web页面,特别是基于MVC模式的应用程序。虽然FreeMarker具有一些编程的能力,但不像PHP,通常由Java程序准备要显示的数据,由FreeMarker模板生成页面。  FreeMarker可以作为Web应用框架一个组件,但它与容器无关,在非Web应用程序环境也能工作的很好。 FreeMarker适合作为MVC的视图组件,还能在模板中使用JSP标记库。
<html>
<head>
  
<title>Welcome!</title>
</head>
<body>
  
<h1>Welcome ${user}!</h1>
  
<p>Our latest product:
  
<href="${latestProduct.url}">${latestProduct.name}</a>!
</body>
</html>  

上面的例子中,在简单的HTML中加入了一些由${…}包围的特定FreeMarker的指令,这个文件就称为模板了。而user、latestProduct.url和latestProduct.name来自于数据模型,由Java程序提供,模板设计者就不用关心数据从哪来的。

FreeMarker模板中可以包括下面四种特定部分:
一.) 文本:直接输出
二.) FTL标记(FreeMarker模板语言标记):类似于HTML标记,名字前加#(有些以@开始,用户自定义标记)予以区分,不会输出。
字符串- 使用单引号或双引号限定;如果包含特殊字符需要转义符:${"It's \"quoted\" andthis is a backslash: \\"}
有一类特殊的字符串:${r"C:\foo\bar"},输出结构为:C:\foo\bar,在引号前面加r被认为是纯文本。
数字-直接输入,不需要引号。${08}, ${+8}, ${8.00} and ${8} 都是相同的
布尔值-true和false,不使用引号
Sequences(序列)-由逗号分隔的变量列表,由方括号限定,类似java中的一维数组:

<#list ["winter", "spring", "summer", "autumn"] as x>
${x}
</#list>

输出结果:
winter
spring
summer
autumn

例二:[2 + 2, [1, 2, 3, 4], "whatnot"]
例三:2..5,等同于[2, 3, 4, 5];5..2,等同于[5,4,3,2]。注意方括号是不需要的。

Hashes(散列)-由逗号分隔的键-值列表,由大括号限定,键和值之间用冒号分隔:{"name":"green mouse", "price":150},键和值都是表达式,但是键必须是字符串。

获取变量-${variable},变量名只能是字母、数字、下划线、$、@和#的组合,且不能以数字开头。下列表达式是等价的:
book.author.name
book["author"].name
book.author.["name"]
book["author"]["name"]

获取Sequence(序列)片断-使用[startindex..endindex],例如:seq中存储了"a", "b", "c", "d","e",那么seq[1..2]包含了b和c两个值。

可以使用.variablename语法访问FreeMarker内置变量。

字符串操作
{"Hello ${user}!"} <==> ${"Hello " + user + "!"}
${"${user}${user}${user}${user}"} <==> ${user + user + user + user}

${…}只能在文本中使用,下面是错误的代码:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>  //此处的代码也是错误的,因为if指令需要的是boolean,实际的却是个字符串

子字符串的操作,假设user的值为"Big Joe":
${user[0]}${user[4]}  <==>  BJ
${user[1..4]}  <==> ig J

Sequences(序列)操作

<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user>
- ${user}
</#list>

结果:
- Joe
- Fred
- Julia
- Kate

Hashes(散列)操作

<#assign ages {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>
- Joe is ${ages.Joe}
- Fred is ${ages.Fred}
- Julia is ${ages.Julia}  

结果:
- Joe is 30
- Fred is 25
- Julia is 18 

算术运算

<#-- x的值设定为5 -->
${x * x - 100}
${x / 2}
${12 % 10}

结果:
-75
2.5
2

注意: 操作符两边必须是数字;使用"+"时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串。

使用内建的指令int获得整数部分

${(x/2)?int}
${1.1?int}
${1.999?int}
${-1.1?int}
${-1.999?int}

结果:
2
1
1
-1
-1

比较操作符-<#if expression>...</#if>
1.)使用=(或==,完全相等)测试两个值是否相等,使用!= 测试两个值是否不相等
2.)=和!=两边必须是相同类型的值,否则会产生错误,例如<#if 1 = "1">会引起错误
3.)Freemarker是精确比较,所以"x"、"x  "和"X"是不相等的
4.)对数字和日期可以使用<、<=、>和>=,但不能用于字符串
5.)由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if (x > y)>,另一种替代的方法是,使用lt、lte、gt和gte来替代<、<=、>和>=

逻辑操作符-&&(and)、||(or)、!(not),只能用于布尔值,否则会产生错误
<#if x < 12 && color = "green">
  We have less than 12 things, and they are green.
</#if>
<#if !hot> <#-- here hot must be a boolean -->
  It's not hot.
</#if> 

内置函数-用法类似访问hash(散列)的子变量,只是使用"?"替代".",例如:user?upper_case
下面列出常用的一些函数:
对于字符串
html-对字符串进行HTML编码
cap_first-使字符串第一个字母大写
lower_case-将字符串转换成小写
trim-去掉字符串前后的空白字符
对于Sequences(序列)
size-获得序列中元素的数目
对于数字
int-取得数字的整数部分(如-1.9?int的结果是-1)

例一:

<#-- test的值为Tom & Jerry -->
${test?html}
${test?upper_case?html}

结果:
Tom &amp; Jerry
TOM &amp; JERRY

例二:

<#-- seasons的值为"winter", "spring", "summer", "autumn" --> 
${seasons?size}
${seasons[1]?cap_first} 
<#-- left side can by any expression -->
${"horse"?cap_first}  

结果:
4
Spring
Horse 

方法的调用
${repeat("What", 3)}
${repeat(repeat("x", 2), 3) + repeat("What", 4)?upper_case}
结果:
WhatWhatWhat
xxxxxxWHATWHATWHATWHAT

操作符优先顺序
后缀            [subvarName] [subStringRange] . (methodParams)
一元            +expr、-expr、!
内建            ?
乘法            *、 / 、%
加法            +、-
关系            <、>、<=、>=(lt、lte、gt、gte)
相等            =、!=
逻辑            &&
逻辑            ||
数字范围      ..

三.) Interpolation:由${...}或#{...}两种类型,输出计算值,可以定义输出的格式
例一:

<#setting number_format="currency"/>
<#assign answer=42/>
${answer}
${answer?string}  <#-- the same as ${answer} --
>
${answer?string.number}
${answer?string.currency}
${answer?string.percent} 

结果:
$42.00
$42.00
42
$42.00
4,200%

例二:

${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
${lastUpdated?string("EEE, MMM d, ''yy")}
${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}  

结果:
2003-04-08 21:24:44 Pacific Daylight Time
Tue, Apr 8, '03
Tuesday, April 08, 2003, 09:24:44 PM (PDT)

例三:

<#assign foo=true/>
${foo?string("yes", "no")}

结果:
yes

例四:

<#-- x is 2.582 and y is 4 -->
#{x; M2}   
<#-- 2.58 -->
#{y; M2}   
<#--    -->
#{x; m1}   
<#-- 2.6 -->
#{y; m1}   
<#-- 4.0 -->
#{x; m1M2} 
<#-- 2.58 -->
#{y; m1M2} 
<#-- 4.0  -->  

说明:mX-小数部分最小X位;MX-小数部分最大X位。

四.) 注释:<#--和-->

下面是一个常用的模板例子:

<p>We have these animals:
<table border=1>
  
<tr><th>Name<th>Price
  
<#list animals as being>
  
<tr>
    
<td>
      
<#if being.size = "large"><b></#if>
      ${being.name}
      
<#if being.size="large"></b></#if>
    
<td>${being.price} Euros
  
</#list>
 
</table> 
<#include "/copyright_footer.html">

注意点
1.) FreeMarker是区分大小写的;
2.) FTL标记不能位于另一个FTL标记内部,例如:<#if <#include 'foo'>='bar'>...</if>;
3.) ${…}只能在文本中使用;
4.) 多余的空白字符会在模板输出时去除;
5.) 如果使用的指令不存在,会产生一个错误消息。

posted on 2008-05-12 23:51 xyz 阅读(316) 评论(0)  编辑  收藏 所属分类: 网络文摘

只有注册用户登录后才能发表评论。


网站导航:
 

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

留言簿

随笔档案(1)

文章分类(44)

文章档案(46)

收藏夹(1)

Adobe

AOP

API

appServer

BI

c

  • c-free
  • codeblocks
  • codelite
  • CodeLite IDE 是一个强大的开源,跨平台的 C/C++整合开发环境. 支持包括 Windows、Linux 和 Mac 系统下运行
  • codelite官网
  • dev-c++
  • Dev-C++是一个C&C++开发工具,它是一款自由软件,遵守GPL协议。
  • GCC
  • GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。之后也变得可处理 Fortran、Pascal、Objective-C、Java, 以及 Ada 与其他语言。

Cache

CMS

DB

eclipse

FreeMarker

hibernate

html5

ibatis

java

jquery

js

json

Linux

Log

mail server

mobile

mysql

oauth

openID

other

PHP

portal

report

Scheduler

schema

Security

SOA

spring

struts

UI原型设计

w3c

Wap

webservice

xml

供应链管理

博客链接

好网站

工作流

开源网

招聘

插件下载

操作系统

构建可伸缩的系统

构建工具

测试

  • IETest
  • IE官网
  • OpenSTA
  • Siege
  • Siege是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力

游戏

源码托管

经营

资源

金融/财务

搜索

  •  

最新评论