- 浏览: 496821 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (271)
- json (6)
- hibernate (12)
- javascript (25)
- session cookie (2)
- struts2 (12)
- 数据库 (23)
- spring (25)
- freemarker (2)
- 其它 (17)
- ibatis (5)
- Web Service (5)
- java基础 (54)
- hessian (2)
- lucene (7)
- DWR (1)
- 导出excel (1)
- CSS (1)
- java 邮件 (5)
- SSH转载 (5)
- 文件断点 上传 (8)
- jQuery (7)
- ant (2)
- tuscany (5)
- maven (7)
- rsa (2)
- tomcat (2)
- svn (3)
- comet (2)
- log4j (2)
- linux (4)
- hadoop (1)
- 设计模式 (4)
- ssh (2)
- git (3)
- quartz (1)
- dubbo (2)
- mysql (2)
- 注解 (1)
- easyui (1)
- tree (1)
- 堆栈 (1)
- 泛型 (1)
- eclipse (1)
- annotation (1)
- mvc (3)
- shiro (1)
- Nexus (1)
- jackson (1)
- itext (1)
- mina (1)
- nio (1)
- ehcache (2)
- memcached (1)
- restful (2)
- mongodb (1)
- solr (1)
- zookeeper (1)
- redis (1)
- vpn (0)
- elastic (2)
- xxl-job (1)
最新评论
-
g_tao:
作者你好,你这个例子中服务端是跑在tomcat中吗
阿里巴巴dubbo处理文件上传下载 -
g_tao:
作者你好,能把整个项目给我发一份吗?guotao114@126 ...
阿里巴巴dubbo处理文件上传下载 -
tanmingjuntan:
楼上 本文提供的代码样例 和 你之前提供的例子有出入好多都没 ...
使用HttpURLConnection.setChunkedStreamingMode(10*1024);的时候,不同的参数导致文件上传损坏 -
dreamoftch:
dannielhome 写道请问下这个upload.exe是什 ...
断点文件上传流程 -
dannielhome:
请问下这个upload.exe是什么东西呢
断点文件上传流程
struts2与FreeMarker整合提供的内建变量如下:
名称 作用
stack 值栈本身, 方便使用 ${stack.findString('ognl expr')}的方式调用
action 最近执行的action
response HttpServletResponse
res 与response相同
request HttpServletRequest
req 与reqeust相同
session HttpSession
application ServletContext
base request的上下文路径(context path)
freemarker中exist,default说明
<#if s?exists>
${s?if_exists}
exists用在逻辑判断,而if_exists用来打印东西时用到,如果存在打印,不存在打印空字符串.
exp1?exists将会被exp1??代替
exp1?if_exists将会被exp1!代替
exp1?default(exp2)将会被exp1!exp2.
FTL区分大小写,所以list是正确的FTL指令,而List不是;${name}和${NAME}是不同的
如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息
FreeMarker会忽略FTL标记中的空白字符, 但是,<、</和指令之间不允许有空白字符
局部变量隐藏(而不是覆盖)同名的plain变量;循环变量隐藏同名的局部变量和plain变量
==================序列=================
序列:由逗号分隔的子变量列表,由方括号限定,索引从0开始
例如: <#list ["winter", "spring", "summer", "autumn"] as x>
${x}
</#list>
可以使用数字范围定义数字序列,例如2..5等同于[2, 3, 4, 5],但是更有效率,注意数字范围没有方括号,可以定义反递增的数字范围,如5..2
序列片断:使用[startIndex..endIndex]语法,从序列中获得序列片断(也是序列);startIndex和endIndex是结果为数字的表达式
=====. 子串 ===============================
假设user的值为”tom cat”
${user[0]}${user[4]} ? tc
${user[1..4]} ? om c
===================散列=================
散列(hash):由逗号分隔的键/值列表,由大括号限定,键和值之间用冒号分隔
例如:{"name":"green mouse", "price":150}
键和值都是表达式,但是键必须是字符串
${..}只能用于文本部分,下面的代码是错误的:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>
应该写成:
<#if isBig>Wow!</#if>
====================算术运算=============
+、-、×、/、%,下面是一个例子:
avg 求平均值
${avg(3,5,20)} ${avg(student.zhangyaang.age,student.situ.age)}
${x * x - 100}
${x / 2}
${12 % 10}
操作符两边必须是数字,因此下面的代码是错误的:
${3 * "5"} <#-- WRONG! -->
使用+操作符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串,例如:
${3 + "5"}
输出结果是:
35
使用内建的int(后面讲述)获得整数部分,例如:
${(x/2)?int} 输出结果是(假设x为5)2
=================== 比较操作符=============
使用=(或==,完全相等)测试两个值是否相等,使用!=测试两个值是否不相等
=和!=两边必须是相同类型的值,否则会产生错误,例如<#if 1 = "1">会引起错误
Freemarker是精确比较,所以对"x"、"x "和"X"是不相等的
对数字和日期可以使用<、<=、>和>=,但不能用于字符串
由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if (x > y)>
另一种替代的方法是,使用lt、lte、gt和gte来替代<、<=、>和>=
===================逻辑操作符===============
&&(and)、||(or)、!(not),只能用于布尔值,否则会产生错误
================== 内建函数=================
内建函数的用法类似访问散列的子变量,只是使用“?”替代“.”,下面列出常用的一些函数
---------------字符串使用的:
html:对字符串进行HTML编码
cap_first:使字符串第一个字母大写
lower_case:将字符串转换成小写
upper_case:将字符串转换成大写
trim:去掉字符串前后的空白字符
-------------序列使用的:
size:获得序列中元素的数目
-------------数字使用的:
int:取得数字的整数部分(如-1.9?int的结果是-1)
=======================操作符优先顺序==============
操作符组 操作符
后缀 [subvarName] [subStringRange]. (methodParams)
一元 +expr、-expr、!
内建 ?
乘法 *、 / 、%
加法 +、-
关系 <、>、<=、>=(lt、lte、gt、gte)
相等 ==(=)、!=
逻辑and &&
逻辑or ||
数字范围 ..
====================插值 Interpolation=============
Interpolation有两种类型:
通用Interpolation:${expr}
数字Interpolation:#{expr}或#{expr; format}
注意:Interpolation只能用于文本部分
通用Interpolation ,插入字符串值:直接输出表达式结果
插入数字值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个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%
插入日期值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation
例如:
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
${lastUpdated?string("EEE, MMM d, ''yy")}
插入布尔值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation
例如:
<#assign foo=true/>
${foo?string("yes", "no")}
输出:yes
数字Interpolation的#{expr; format}形式可以用来格式化数字,format可以是:
mX:小数部分最小X位
MX:小数部分最大X位
例如:
<#assign x=2.582/>
<#assign y=4/>
#{x; M2} <#-- 2.58 -->
#{y; M2} <#-- 4 -->
===============string============
--截取字符串
exp?substring(from,toExclusive)
exp?substring(from)
--第一个单词的首字母大写
exp?cap_first
例如:${"greEN mouse"?cap_first} 输出:GreEN mouse
--取消第一个单词的首字母大写
exp?uncap_first
--所有单词的首字母大写
capitalize
例如: ${" green mouse"?capitalize} 输出: Green Mouse
--字符串转换成日期时间值
date, time, datetime
例如:
<#assign test1 = "10/25/1995"?date("MM/dd/yyyy")>
<#assign test2 = "15:05:30"?time("HH:mm:ss")>
<#assign test3 = "1995-10-25 03:05 PM"?datetime("yyyy-MM-dd hh:mm a")>
${test1}
${test2}
${test3}
输出:
Oct 25, 1995
3:05:30 PM
Oct 25, 1995 3:05:00 PM
也可以不带格式化参数,将按照默认的格式显示
例如:<#assign test1 = "Oct 25, 1995"?date>
<#assign test2 = "3:05:30 PM"?time>
<#assign test3 = "Oct 25, 1995 03:05:00 PM"?datetime>
--判断字符串以什么字符串结束
ends_with 返回Boolean值
例如:"redhead"?ends_with("head") 返回:true
--判断字符串以什么字符串开始
starts_with 返回Boolean值
--逃逸字符
< ======== <
> ======== >
& ======== &
" ======== "
\ ======== \\
{ ======== \{
} ======== \}
\n 换行(u000A)
\r Return (u000D)
\t Tab (u0009)
\b Backspace (u0008)
\f Form feed (u000C)
\l <
\g >
\a &
--获取字符串在字符串中的下标索引,索引值从0开始
index_of
例如:"abcabc"?index_of("bc") 输出:1
"abcabc"?index_of("bc",2) 输出:4
--取最后匹配的字符串的索引
last_index_of
例如:"abcabc"?last_index_of("ab") 输出:3
"abcabc"?last_index_of("ab", 2) 输出:0
--根据java语言的转义字符串规则转义字符串
j_string
例如:<#assign beanName = 'The "foo" bean.'>
String BEAN_NAME = "${beanName?j_string}";
输出:String BEAN_NAME = "The \"foo\" bean.";
--根据javascript语言的转义字符串规则转义字符串
js_string
例如:
<#assign user = "Big Joe's \"right hand\"">
<script>
alert("Welcome ${user?js_string}!");
</script>
输出:
<script>
alert("Welcome Big Joe\'s \"right hand\"!");
</script>
--取字符串的长度
length
--将字符串转换成小写
lower_case
例如:"GrEeN MoUsE"?lower_case 输出:"green mouse"
--将字符串转换成大写
upper_case
--左补齐
left_pad 补齐的长度大于等于number
例如:
[${""?left_pad(5)}]
[${"a"?left_pad(5)}]
[${"abcdefg"?left_pad(5)}]
输出:
[ ]
[ a]
[abcdefg]
[abcdefg]
可以指定补齐的字符
[${"a"?left_pad(5, "-")}]
输出:[----a]
--右补齐
right_pad
--判断是否包含某个字符串
contains
例如:<#if "piceous"?contains("ice")>It contains "ice"</#if>
输出:
It contains "ice"
--匹配正则表达式
matches 返回boolean值
例如:"fooo"?matches('fo*') 返回:true
--字符串转换成数字
number
--替换字符串
replace
例如:
${"this is a car acarus"?replace("car", "bulldozer")}
输出:this is a bulldozer abulldozerus
--字符串拆分
split
例如:
<#list "someMOOtestMOOtext"?split("MOO") as x>
- ${x}
</#list>
输出:
- some
- test
- text
--去除前后的空格
trim
例如: (${" green mouse "?trim}) 输出:(green mouse)
--word_list
例如:
<#assign words = " a bcd, . 1-2-3"?word_list>
<#list words as word>[${word}]</#list>
输出:[a][bcd,][.][1-2-3]
==================数字=====================
将数字转换成字符串
string
例如: <#assign answer=42/>
${answer}
${answer?string} <#-- the same as ${answer} -->
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
输出:
42
42
42
$42.00
4,200%
================日期时间=================
将日期时间转换成指定格式的字符串
string
例如:
${openingTime?string.short}
${openingTime?string.medium}
${openingTime?string.long}
${openingTime?string.full}
输出:
12:45 PM
12:45:09 PM
12:45:09 PM CEST
12:45:09 PM CEST
备注:date(年月日), time(时间), datetime(年月日+时间)
==============booleans ==================
将逻辑boolean值转换成字符串
string
例如:foo?string 输出:"true"
foo?string("yes", "no") 输出:"yes"
================序列 sequences=============
--取序列的第一个变量
first 如果序列为空将报错
--取序列的最后一个变量
last 如果序列为空将报错
--序列中是否包含某个变量
seq_contains
例如:<#assign x = ["red", 16, "blue", "cyan"]>
"blue": ${x?seq_contains("blue")?string("yes", "no")}
输出:"blue": yes
--取变量在序列中首次出现的索引值
seq_index_of
例如:
<#assign colors = ["red", "green", "blue"]>
${colors?seq_index_of("blue")}
输出:2
--取变量在序列中末次出现的索引值
seq_last_index_of
--序列顺序翻转
reverse
--返回序列的大小
size
--升序排列序列
sort
例如:<#assign ls = ["whale", "Barbara", "zeppelin", "aardvark", "beetroot"]?sort>
<#list ls as i>${i} </#list>
输出:aardvark Barbara beetroot whale zeppelin
--按照关键字升序排列序列
sort_by
例如:
<#assign ls = [
{"name":"whale", "weight":2000},
{"name":"Barbara", "weight":53},
{"name":"zeppelin", "weight":-200},
{"name":"aardvark", "weight":30},
{"name":"beetroot", "weight":0.3}
]>
Order by name:
<#list ls?sort_by("name") as i>
- ${i.name}: ${i.weight}
</#list>
Order by weight:
<#list ls?sort_by("weight") as i>
- ${i.name}: ${i.weight}
</#list>
--将序列分成多组
chunk
例如:
<#assign seq = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']>
<#list seq?chunk(4) as row>
<#list row as cell>${cell} </#list>
</#list>
<#list seq?chunk(4, '-') as row>
<#list row as cell>${cell} </#list>
</#list>
输出:
a b c d
e f g h
i j
a b c d
e f g h
i j - -
==================== hashes==========
keys--取关键字
例如:
<#assign h = {"name":"mouse", "price":50}>
<#assign keys = h?keys>
<#list keys as key>${key} = ${h[key]}; </#list>
输出:
name = mouse; price = 50;
values--取value值
=====================其他插件方法=======
--表达式运算
eval
例如:"1+2"?eval 输出:3
--判断变量的类型
Built-in Returns true if the value is a ...
is_string string
is_number number
is_boolean boolean
is_date date (all types: date-only, time-only and date-time)
is_method method
is_transform transform
is_macro macro
is_hash hash
is_hash_ex extended hash (i.e. supports ?keys and ?values)
is_sequence sequence
is_collection collection
is_enumerable sequence or collection
is_indexable sequence
is_directive macro or transform
is_node node
##################指令参考################
===============if, else, elseif===========
<#if condition>
...
<#elseif condition2>
...
<#elseif condition3>
...
...
<#else>
...
</#if>
================switch, case, default, break===========
<#switch value>
<#case refValue1>
...
<#break>
<#case refValue2>
...
<#break>
...
<#case refValueN>
...
<#break>
<#default>
...
</#switch>
=================list, break======================
<#list sequence as item>
...
</#list>
<#list seq as x>
${x}
<#if x = "spring"><#break></#if>
</#list>
<#list students[0..5] as s_list></#list>取list的前5条记录
list项的索引 xxx_index 索引值从0开始
判断是否有下一项 xxx_has_next
例如:
<#assign seq = ["winter", "spring", "summer", "autumn"]>
<#list seq as x>
${x_index + 1}. ${x}<#if x_has_next>,</#if>
</#list>
输出:
1. winter,
2. spring,
3. summer,
4. autumn
=====================include=================
<#include filename>
or
<#include filename options>
options:含两项encoding=encoding, parse=parse
encoding 编码字符串 parse 是否解析模板
=====================import=================
<#import path as hash>
===============noparse===================
<#noparse>
...
</#noparse>
不解析某段文字
例如:
<#noparse>
<#list animals as being>
<tr><td>${being.name}<td>${being.price} Euros
</#list>
</#noparse>
输出:
<#list animals as being>
<tr><td>${being.name}<td>${being.price} Euros
</#list>
=======================compress=====================
<#compress>
...
</#compress>
去掉多余的空格和换行
例如:
<#assign x = " moo \n\n ">
(<#compress>
1 2 3 4 5
${moo}
test only
I said, test only
</#compress>)
输出:
(1 2 3 4 5
moo
test only
I said, test only)
=====================定义变量 给变量赋值 assign=========
<#assign name=value>
or
<#assign name1=value1 name2=value2 ... nameN=valueN>
or
<#assign same as above... in namespacehash>
or
<#assign name>
capture this
</#assign>
or
<#assign name in namespacehash>
capture this
</#assign>
==============定义全局变量 赋值 global===========
<#global name=value>
or
<#global name1=value1 name2=value2 ... nameN=valueN>
or
<#global name>
capture this
</#global>
===============setting 设置freemarker的系统变量=================
<#setting name=value>
===================去除空格============
<#t> <#lt> <#rt> <#nt> 成对使用 类似 trim方法
##################freemarker中的保留字###################
true: boolean value ``true''
false: boolean value ``false''
gt: comparison operator ``greater than''
gte: comparison operator ``greater than or equivalent''
lt: comparison operator ``less than''
lte: comparison operator ``less than or equivalent''
as: used by a few directives
in: used by a few directives
using: used by a few directives
========================注释comment=============
旧格式:<#--...-->
新格式:
<#comment> .........</#comment>
=====================循环foreach===============
<#foreach item in sequence>
类似于:<#list sequence as item>.
==================默认值default===================
exp1?default(exp2)
类似于原来的 exp1!exp2
===============判断变量是否存在exists if_exists==============
exists 老版本中 (exp1)?exists
if_exists 新版本中 (exp1)?if_exists
所有内置函数:
chunk, is_date, last, root, j_string, round, contains, is_hash, long, float, ends_with, namespace, matches, time, values, seq_last_index_of, uncap_first, byte, substring, is_transform, web_safe, groups, seq_contains, is_macro, index_of, word_list, int, is_method, eval, parent, xml, number, capitalize, if_exists, rtf, node_type, double, is_directive, url, size, default, floor, ceiling, is_boolean, split, node_name, is_enumerable, seq_index_of, is_sequence, sort, is_node, sort_by, left_pad, cap_first, interpret, children, node_namespace, chop_linebreak, date, short, last_index_of, is_collection, ancestors, length, trim, datetime, is_string, reverse, c, keys, upper_case, js_string, has_content, right_pad, replace, is_hash_ex, new, is_number, lower_case, is_indexable, string, exists, html, first
名称 作用
stack 值栈本身, 方便使用 ${stack.findString('ognl expr')}的方式调用
action 最近执行的action
response HttpServletResponse
res 与response相同
request HttpServletRequest
req 与reqeust相同
session HttpSession
application ServletContext
base request的上下文路径(context path)
freemarker中exist,default说明
<#if s?exists>
${s?if_exists}
exists用在逻辑判断,而if_exists用来打印东西时用到,如果存在打印,不存在打印空字符串.
exp1?exists将会被exp1??代替
exp1?if_exists将会被exp1!代替
exp1?default(exp2)将会被exp1!exp2.
FTL区分大小写,所以list是正确的FTL指令,而List不是;${name}和${NAME}是不同的
如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息
FreeMarker会忽略FTL标记中的空白字符, 但是,<、</和指令之间不允许有空白字符
局部变量隐藏(而不是覆盖)同名的plain变量;循环变量隐藏同名的局部变量和plain变量
==================序列=================
序列:由逗号分隔的子变量列表,由方括号限定,索引从0开始
例如: <#list ["winter", "spring", "summer", "autumn"] as x>
${x}
</#list>
可以使用数字范围定义数字序列,例如2..5等同于[2, 3, 4, 5],但是更有效率,注意数字范围没有方括号,可以定义反递增的数字范围,如5..2
序列片断:使用[startIndex..endIndex]语法,从序列中获得序列片断(也是序列);startIndex和endIndex是结果为数字的表达式
=====. 子串 ===============================
假设user的值为”tom cat”
${user[0]}${user[4]} ? tc
${user[1..4]} ? om c
===================散列=================
散列(hash):由逗号分隔的键/值列表,由大括号限定,键和值之间用冒号分隔
例如:{"name":"green mouse", "price":150}
键和值都是表达式,但是键必须是字符串
${..}只能用于文本部分,下面的代码是错误的:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>
应该写成:
<#if isBig>Wow!</#if>
====================算术运算=============
+、-、×、/、%,下面是一个例子:
avg 求平均值
${avg(3,5,20)} ${avg(student.zhangyaang.age,student.situ.age)}
${x * x - 100}
${x / 2}
${12 % 10}
操作符两边必须是数字,因此下面的代码是错误的:
${3 * "5"} <#-- WRONG! -->
使用+操作符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串,例如:
${3 + "5"}
输出结果是:
35
使用内建的int(后面讲述)获得整数部分,例如:
${(x/2)?int} 输出结果是(假设x为5)2
=================== 比较操作符=============
使用=(或==,完全相等)测试两个值是否相等,使用!=测试两个值是否不相等
=和!=两边必须是相同类型的值,否则会产生错误,例如<#if 1 = "1">会引起错误
Freemarker是精确比较,所以对"x"、"x "和"X"是不相等的
对数字和日期可以使用<、<=、>和>=,但不能用于字符串
由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if (x > y)>
另一种替代的方法是,使用lt、lte、gt和gte来替代<、<=、>和>=
===================逻辑操作符===============
&&(and)、||(or)、!(not),只能用于布尔值,否则会产生错误
================== 内建函数=================
内建函数的用法类似访问散列的子变量,只是使用“?”替代“.”,下面列出常用的一些函数
---------------字符串使用的:
html:对字符串进行HTML编码
cap_first:使字符串第一个字母大写
lower_case:将字符串转换成小写
upper_case:将字符串转换成大写
trim:去掉字符串前后的空白字符
-------------序列使用的:
size:获得序列中元素的数目
-------------数字使用的:
int:取得数字的整数部分(如-1.9?int的结果是-1)
=======================操作符优先顺序==============
操作符组 操作符
后缀 [subvarName] [subStringRange]. (methodParams)
一元 +expr、-expr、!
内建 ?
乘法 *、 / 、%
加法 +、-
关系 <、>、<=、>=(lt、lte、gt、gte)
相等 ==(=)、!=
逻辑and &&
逻辑or ||
数字范围 ..
====================插值 Interpolation=============
Interpolation有两种类型:
通用Interpolation:${expr}
数字Interpolation:#{expr}或#{expr; format}
注意:Interpolation只能用于文本部分
通用Interpolation ,插入字符串值:直接输出表达式结果
插入数字值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个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%
插入日期值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation
例如:
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
${lastUpdated?string("EEE, MMM d, ''yy")}
插入布尔值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation
例如:
<#assign foo=true/>
${foo?string("yes", "no")}
输出:yes
数字Interpolation的#{expr; format}形式可以用来格式化数字,format可以是:
mX:小数部分最小X位
MX:小数部分最大X位
例如:
<#assign x=2.582/>
<#assign y=4/>
#{x; M2} <#-- 2.58 -->
#{y; M2} <#-- 4 -->
===============string============
--截取字符串
exp?substring(from,toExclusive)
exp?substring(from)
--第一个单词的首字母大写
exp?cap_first
例如:${"greEN mouse"?cap_first} 输出:GreEN mouse
--取消第一个单词的首字母大写
exp?uncap_first
--所有单词的首字母大写
capitalize
例如: ${" green mouse"?capitalize} 输出: Green Mouse
--字符串转换成日期时间值
date, time, datetime
例如:
<#assign test1 = "10/25/1995"?date("MM/dd/yyyy")>
<#assign test2 = "15:05:30"?time("HH:mm:ss")>
<#assign test3 = "1995-10-25 03:05 PM"?datetime("yyyy-MM-dd hh:mm a")>
${test1}
${test2}
${test3}
输出:
Oct 25, 1995
3:05:30 PM
Oct 25, 1995 3:05:00 PM
也可以不带格式化参数,将按照默认的格式显示
例如:<#assign test1 = "Oct 25, 1995"?date>
<#assign test2 = "3:05:30 PM"?time>
<#assign test3 = "Oct 25, 1995 03:05:00 PM"?datetime>
--判断字符串以什么字符串结束
ends_with 返回Boolean值
例如:"redhead"?ends_with("head") 返回:true
--判断字符串以什么字符串开始
starts_with 返回Boolean值
--逃逸字符
< ======== <
> ======== >
& ======== &
" ======== "
\ ======== \\
{ ======== \{
} ======== \}
\n 换行(u000A)
\r Return (u000D)
\t Tab (u0009)
\b Backspace (u0008)
\f Form feed (u000C)
\l <
\g >
\a &
--获取字符串在字符串中的下标索引,索引值从0开始
index_of
例如:"abcabc"?index_of("bc") 输出:1
"abcabc"?index_of("bc",2) 输出:4
--取最后匹配的字符串的索引
last_index_of
例如:"abcabc"?last_index_of("ab") 输出:3
"abcabc"?last_index_of("ab", 2) 输出:0
--根据java语言的转义字符串规则转义字符串
j_string
例如:<#assign beanName = 'The "foo" bean.'>
String BEAN_NAME = "${beanName?j_string}";
输出:String BEAN_NAME = "The \"foo\" bean.";
--根据javascript语言的转义字符串规则转义字符串
js_string
例如:
<#assign user = "Big Joe's \"right hand\"">
<script>
alert("Welcome ${user?js_string}!");
</script>
输出:
<script>
alert("Welcome Big Joe\'s \"right hand\"!");
</script>
--取字符串的长度
length
--将字符串转换成小写
lower_case
例如:"GrEeN MoUsE"?lower_case 输出:"green mouse"
--将字符串转换成大写
upper_case
--左补齐
left_pad 补齐的长度大于等于number
例如:
[${""?left_pad(5)}]
[${"a"?left_pad(5)}]
[${"abcdefg"?left_pad(5)}]
输出:
[ ]
[ a]
[abcdefg]
[abcdefg]
可以指定补齐的字符
[${"a"?left_pad(5, "-")}]
输出:[----a]
--右补齐
right_pad
--判断是否包含某个字符串
contains
例如:<#if "piceous"?contains("ice")>It contains "ice"</#if>
输出:
It contains "ice"
--匹配正则表达式
matches 返回boolean值
例如:"fooo"?matches('fo*') 返回:true
--字符串转换成数字
number
--替换字符串
replace
例如:
${"this is a car acarus"?replace("car", "bulldozer")}
输出:this is a bulldozer abulldozerus
--字符串拆分
split
例如:
<#list "someMOOtestMOOtext"?split("MOO") as x>
- ${x}
</#list>
输出:
- some
- test
- text
--去除前后的空格
trim
例如: (${" green mouse "?trim}) 输出:(green mouse)
--word_list
例如:
<#assign words = " a bcd, . 1-2-3"?word_list>
<#list words as word>[${word}]</#list>
输出:[a][bcd,][.][1-2-3]
==================数字=====================
将数字转换成字符串
string
例如: <#assign answer=42/>
${answer}
${answer?string} <#-- the same as ${answer} -->
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
输出:
42
42
42
$42.00
4,200%
================日期时间=================
将日期时间转换成指定格式的字符串
string
例如:
${openingTime?string.short}
${openingTime?string.medium}
${openingTime?string.long}
${openingTime?string.full}
输出:
12:45 PM
12:45:09 PM
12:45:09 PM CEST
12:45:09 PM CEST
备注:date(年月日), time(时间), datetime(年月日+时间)
==============booleans ==================
将逻辑boolean值转换成字符串
string
例如:foo?string 输出:"true"
foo?string("yes", "no") 输出:"yes"
================序列 sequences=============
--取序列的第一个变量
first 如果序列为空将报错
--取序列的最后一个变量
last 如果序列为空将报错
--序列中是否包含某个变量
seq_contains
例如:<#assign x = ["red", 16, "blue", "cyan"]>
"blue": ${x?seq_contains("blue")?string("yes", "no")}
输出:"blue": yes
--取变量在序列中首次出现的索引值
seq_index_of
例如:
<#assign colors = ["red", "green", "blue"]>
${colors?seq_index_of("blue")}
输出:2
--取变量在序列中末次出现的索引值
seq_last_index_of
--序列顺序翻转
reverse
--返回序列的大小
size
--升序排列序列
sort
例如:<#assign ls = ["whale", "Barbara", "zeppelin", "aardvark", "beetroot"]?sort>
<#list ls as i>${i} </#list>
输出:aardvark Barbara beetroot whale zeppelin
--按照关键字升序排列序列
sort_by
例如:
<#assign ls = [
{"name":"whale", "weight":2000},
{"name":"Barbara", "weight":53},
{"name":"zeppelin", "weight":-200},
{"name":"aardvark", "weight":30},
{"name":"beetroot", "weight":0.3}
]>
Order by name:
<#list ls?sort_by("name") as i>
- ${i.name}: ${i.weight}
</#list>
Order by weight:
<#list ls?sort_by("weight") as i>
- ${i.name}: ${i.weight}
</#list>
--将序列分成多组
chunk
例如:
<#assign seq = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']>
<#list seq?chunk(4) as row>
<#list row as cell>${cell} </#list>
</#list>
<#list seq?chunk(4, '-') as row>
<#list row as cell>${cell} </#list>
</#list>
输出:
a b c d
e f g h
i j
a b c d
e f g h
i j - -
==================== hashes==========
keys--取关键字
例如:
<#assign h = {"name":"mouse", "price":50}>
<#assign keys = h?keys>
<#list keys as key>${key} = ${h[key]}; </#list>
输出:
name = mouse; price = 50;
values--取value值
=====================其他插件方法=======
--表达式运算
eval
例如:"1+2"?eval 输出:3
--判断变量的类型
Built-in Returns true if the value is a ...
is_string string
is_number number
is_boolean boolean
is_date date (all types: date-only, time-only and date-time)
is_method method
is_transform transform
is_macro macro
is_hash hash
is_hash_ex extended hash (i.e. supports ?keys and ?values)
is_sequence sequence
is_collection collection
is_enumerable sequence or collection
is_indexable sequence
is_directive macro or transform
is_node node
##################指令参考################
===============if, else, elseif===========
<#if condition>
...
<#elseif condition2>
...
<#elseif condition3>
...
...
<#else>
...
</#if>
================switch, case, default, break===========
<#switch value>
<#case refValue1>
...
<#break>
<#case refValue2>
...
<#break>
...
<#case refValueN>
...
<#break>
<#default>
...
</#switch>
=================list, break======================
<#list sequence as item>
...
</#list>
<#list seq as x>
${x}
<#if x = "spring"><#break></#if>
</#list>
<#list students[0..5] as s_list></#list>取list的前5条记录
list项的索引 xxx_index 索引值从0开始
判断是否有下一项 xxx_has_next
例如:
<#assign seq = ["winter", "spring", "summer", "autumn"]>
<#list seq as x>
${x_index + 1}. ${x}<#if x_has_next>,</#if>
</#list>
输出:
1. winter,
2. spring,
3. summer,
4. autumn
=====================include=================
<#include filename>
or
<#include filename options>
options:含两项encoding=encoding, parse=parse
encoding 编码字符串 parse 是否解析模板
=====================import=================
<#import path as hash>
===============noparse===================
<#noparse>
...
</#noparse>
不解析某段文字
例如:
<#noparse>
<#list animals as being>
<tr><td>${being.name}<td>${being.price} Euros
</#list>
</#noparse>
输出:
<#list animals as being>
<tr><td>${being.name}<td>${being.price} Euros
</#list>
=======================compress=====================
<#compress>
...
</#compress>
去掉多余的空格和换行
例如:
<#assign x = " moo \n\n ">
(<#compress>
1 2 3 4 5
${moo}
test only
I said, test only
</#compress>)
输出:
(1 2 3 4 5
moo
test only
I said, test only)
=====================定义变量 给变量赋值 assign=========
<#assign name=value>
or
<#assign name1=value1 name2=value2 ... nameN=valueN>
or
<#assign same as above... in namespacehash>
or
<#assign name>
capture this
</#assign>
or
<#assign name in namespacehash>
capture this
</#assign>
==============定义全局变量 赋值 global===========
<#global name=value>
or
<#global name1=value1 name2=value2 ... nameN=valueN>
or
<#global name>
capture this
</#global>
===============setting 设置freemarker的系统变量=================
<#setting name=value>
===================去除空格============
<#t> <#lt> <#rt> <#nt> 成对使用 类似 trim方法
##################freemarker中的保留字###################
true: boolean value ``true''
false: boolean value ``false''
gt: comparison operator ``greater than''
gte: comparison operator ``greater than or equivalent''
lt: comparison operator ``less than''
lte: comparison operator ``less than or equivalent''
as: used by a few directives
in: used by a few directives
using: used by a few directives
========================注释comment=============
旧格式:<#--...-->
新格式:
<#comment> .........</#comment>
=====================循环foreach===============
<#foreach item in sequence>
类似于:<#list sequence as item>.
==================默认值default===================
exp1?default(exp2)
类似于原来的 exp1!exp2
===============判断变量是否存在exists if_exists==============
exists 老版本中 (exp1)?exists
if_exists 新版本中 (exp1)?if_exists
所有内置函数:
chunk, is_date, last, root, j_string, round, contains, is_hash, long, float, ends_with, namespace, matches, time, values, seq_last_index_of, uncap_first, byte, substring, is_transform, web_safe, groups, seq_contains, is_macro, index_of, word_list, int, is_method, eval, parent, xml, number, capitalize, if_exists, rtf, node_type, double, is_directive, url, size, default, floor, ceiling, is_boolean, split, node_name, is_enumerable, seq_index_of, is_sequence, sort, is_node, sort_by, left_pad, cap_first, interpret, children, node_namespace, chop_linebreak, date, short, last_index_of, is_collection, ancestors, length, trim, datetime, is_string, reverse, c, keys, upper_case, js_string, has_content, right_pad, replace, is_hash_ex, new, is_number, lower_case, is_indexable, string, exists, html, first
相关推荐
本篇将深入探讨如何自定义FreeMarker标签,以扩展其功能并适应特定项目需求。 首先,理解FreeMarker的默认标签语法至关重要。FreeMarker使用${...}表达式来插入变量,#{...}用于输出注释,以及、等控制结构进行条件...
而Freemarker则是一种轻量级的、基于模板的Java模板引擎,常用于Web应用中的动态内容生成,比如JSP替代技术。它允许开发者将业务逻辑与页面展示分离,提高代码的可维护性和可读性。 "eclipse的freemarker插件"是指...
`freemarker-2.3.23.jar`是Freemarker库的一个版本,发布于2.3.23,这个版本可能包含了对早期版本的一些改进、新功能或bug修复。 Freemarker的核心概念是模板语言,它是一种声明式的编程方式,允许开发者编写不包含...
FreeMarker的设计理念是将表现层(视图)和业务逻辑层(控制器)分离,从而实现MVC(Model-View-Controller)架构中的“View”部分。 FreeMarker的核心概念是模板文件,这是一种特殊的文本文件,其中包含可替换的...
赠送jar包:freemarker-2.3.31.jar; 赠送原API文档:freemarker-2.3.31-javadoc.jar; 赠送源代码:freemarker-2.3.31-sources.jar; 赠送Maven依赖信息文件:freemarker-2.3.31.pom; 包含翻译后的API文档:...
这个"freemarker-2.3.28.jar"是Freemarker库的一个具体版本,版本号为2.3.28,它是Java的一个可执行的JAR(Java Archive)文件,用于在Eclipse集成开发环境中作为插件使用。 在Freemarker的2.3.28版本中,我们可以...
1. **创建模板**:在Freemarker中,我们需要创建一个`.ftl`(Freemarker Template Language)文件,其中包含静态文本和动态占位符。动态占位符由${}或#{}包裹,用于插入数据模型中的值。例如,`${title}</h1>`会将...
2.3.23是FreeMarker的一个稳定版本,这个版本的官方中文文档提供了全面的指导和说明,帮助开发者更好地理解和使用这个模板语言。 在FreeMarker的核心概念中,它是一个基于数据驱动的模板语言。这意味着,开发者不...
赠送jar包:freemarker-2.3.30.jar; 赠送原API文档:freemarker-2.3.30-javadoc.jar; 赠送源代码:freemarker-2.3.30-sources.jar; 赠送Maven依赖信息文件:freemarker-2.3.30.pom; 包含翻译后的API文档:...
### Velocity与FreeMarker的区别 在IT领域特别是Java开发中,模板引擎是不可或缺的一部分,它们用于将数据模型转换为HTML、PDF、Word文档等格式。在众多模板引擎中,Velocity和FreeMarker是两种非常受欢迎的选择。...
Velocity和Freemarker模板技术比较 模板技术在现代软件开发中扮演着重要角色,而在目前最流行的两种模板技术中, Velocity 和 Freemarker 独占鳌头。在 WebWork2 中,我们可以随意选择使用 Freemarker 或 Velocity ...
Freemarker 简介及标签详解大全 FreeMarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯 Java 编写。FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序。虽然 FreeMarker ...
FreeMarker提供了一种灵活且强大的方式来处理动态内容,尤其适用于Web开发中的视图层。在FreeMarker中实现通用的分页功能是提高Web应用程序性能和用户体验的重要一环。 ### FreeMarker通用分页知识点解析 #### 1. ...
这个示例是关于如何使用Freemarker来生成XML文件,对于初学者来说,理解这个过程有助于掌握Freemarker的基本用法和XML的生成技巧。 在Java中,Freemarker与数据模型结合,通过模板文件生成输出。对于XML生成,首先...
本话题主要探讨的是如何利用可视化div布局来生成FreeMarker模板,并结合Spring MVC 3框架进行应用。下面将详细阐述这些概念及其相关知识点。 1. **FreeMarker模板引擎**:FreeMarker是一个开源的Java模板引擎,它...
本主题将深入探讨如何利用Freemarker模板和wkhtmltox工具来实现这一功能。 **Freemarker模板** 是一个强大的Java模板引擎,用于动态生成文本输出,如HTML、XML或PDF。它支持变量替换、控制结构(如if/else)和复杂...
Freemarker是一个强大的模板引擎,常用于JavaEE应用中的视图层处理,尤其与Struts2等MVC框架配合使用,能实现灵活的动态页面渲染。这个"freemarker Demo"是一个适合初学者的示例项目,旨在帮助新接触Freemarker的...
根据提供的文件信息,我们可以深入探讨FreeMarker的相关知识点及其在网页模板设计中的应用。FreeMarker是一种用Java编写的模板引擎,其主要用途在于帮助开发者高效地生成动态内容,尤其是在Web开发领域有着广泛的...
**SpringBoot集成Freemarker与Shiro框架详解** 在现代Web开发中,SpringBoot因其简洁、高效的特性,已经成为很多开发者的选择。而FreeMarker和Shiro则分别是常用的模板引擎和安全框架,它们能帮助我们构建出功能...