FreeMarker

FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页、电子邮件配置文件源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件


freemarker模板文件(*.ftl)的基本组成部分

1. 文本:直接输出的内容部分

2. 注释:不会输出的内容,格式为<#-- 注释内容-->

3. 取值(插值):代替输出数据模型的部分,格式为${数据模型}或#{数据模型}

        4. ftl指令:Freemarker指令,类似于HTML标记。

                            内建指令:开始标签:<#directivename parameter> 结束标签:     空标签:<#directivename parameter/>

 自定义指令:开始标签:<@directivename parameter> 结束标签:     空标签:<@directivename parameter/>

Freemarker语法及使用方法

1. 取值(插值)指令及适用类型:

(1) ${var}

 适用类型:java中常用的八大基本类型以及我们的String引用类型,但是,freemarker中boolean类型显示时true==yes  false==no

                        示例:

 在后台文件中定义变量

                                        String strVar = "世界你好";

int intVar = 10;

boolean booVar = true;

                                在页面中获取变量:

                                        String获取: ${strVar}

                                        int获取: ${intVar}

                                        boolean获取: ${booVar?string("yes","no")}

                                展示结果:

                                        String获取:世界你好

                                        int获取:10

                                        boolean获取:yes

(2)${var!}

 适用类型:对null 或者不存在的对象进行取值,可以设置默认值,例:${var!'我是默认值'} 即,有值时显示正常值,无值时显示默认值

                        示例:

 在后台文件中定义变量

                                        String strVar = "世界你好";

String str = null;

                                在页面中获取变量:

                                        String获取: ${strVar!"我是空"}

                                        str获取: ${str!}

                                        str获取: ${str!"默认"}

                                展示结果:

                                        String获取:世界你好

                                        str获取:

                                        str获取:默认

                (3)${封装对象.属性}

 适用类型:对封装对象进行取值,例:${User.name}

                        示例:

 在后台文件中封装对象User[ name,  age ]

                                        String name = "姓名";

int age = 18;

                                在页面中获取变量:

                                        name获取: ${User.name}

                                        age获取: ${User.age}

                                展示结果:

                                        name获取:姓名

                                        age获取:18

(4)${date?String('yyyy-MM-dd')}

 适用类型:对日期格式进行取值,在这里我要强调的是,定义Date类型的变量时,java.util.Date无法输出日期,须使用java.sql.Date

                        示例:

 在后台文件中定义变量

java.sql.Date date = new Date().getTime();

java.sql.Date time = new Date().getTime();

java.sql.Date datetime = new Date().getTime();

                                在页面中获取变量:

                                        date获取: ${date?string('yyyy-MM-dd')}

                                        time获取: ${date?string('HH:mm:ss')}

                                        datetime获取: ${date?string('yyyy-MM-dd HH:mm:ss')}

                                展示结果:

                                        name获取:姓名

                                        age获取:18

(5)${var?html}

 适用类型:转义HTML内容

                        示例:

 在后台文件中封装变量Menu[ name, model ]

Menu m = new Menu();

m.setName(" freemarker ");

                                        m.setModel("我只是个菜单");

                                在页面中获取变量:

 非转义获取: ${m.model}

                                        转义获取:${m.model?html}

                                展示结果:

 非转义获取:我只是个菜单

                                        转义获取:我只是个菜单

(6)<#assign num = 100 />

 适用类型:定义变量,支持计算和赋值

                        示例:

                                在页面中定义变量:

<#assign num = 100 />

                                        num获取: ${num)}

                                        计算结果: ${num * 10}

                                展示结果:

                                        num获取:100

                                        计算结果:1000

                (7)对List集合进行取值

                        <#list  list集合as  item>

                               ${item}    --取值


                        示例:

 在后台文件中定义变量

List strList = new ArrayList();

                                        strList.add("第一个值");

                                        strList.add("第二个值");

                                        strList.add("第三个值");

                                在页面中获取变量:

<#list  strList  as  item>

                                               ${item!}
    --取值


                                展示结果:

 第一个值

                                        第二个值

                                       第三个值

                (8)对Map集合进行取值

<#list map?keys as key>

${key}:${map[key]}


                        示例:

 在后台文件中定义变量

Map m = new HashMap();

                                        m.put("name","姓名");

m.put("age",18);

                                        m.put("sex","男");

                                在页面中获取变量:

<#list m?keys as key>

${key}:${m[key]}


                                展示结果:

                                        name:姓名

                                        age:18

                                        sex:男

2. 条件判断指令:

(1) if

 格式:<#if 条件>

                                       输出


                        示例:

                                在页面中定义变量并判断条件:

<#assign age = 18 />

<#if age == 18>

age = 18


                                展示结果:

age = 18

(2) if - else

 格式:<#if 条件>

                                       输出

<#else>

                                       输出


                        示例:

 在页面中定义变量并判断条件:

<#assign age = 20 />

<#if age == 18>

age = 18

<#else>

age != 18


                                展示结果:

age != 18

(3) if - elseif - else

 格式:<#if 条件1>

                                       输出

<#elseif 条件2>

                                       输出

<#else>

                                       输出


                        示例:

 在页面中定义变量并判断条件:

<#assign age = 20 />

<#if age > 18>

                                                青年

<#elseif age == 18>

 成年

<#else>

 少年


                                展示结果:

 成年

                (4) switch  --常与case break default一起使用 参数可为字符串

 格式:<#switch var>

<#case 条件1>

                                         输出

<#break>

<#case 条件2>

                                         输出

<#break>

<#default>

                                         输出


                        示例:

                                在页面中定义变量并判断:

                                       <#switch var="星期一">

                                       <#case "星期一">

                                              油焖大虾

<#break>

                                       <#case "星期二">

                                              炸酱面

<#break>

<#default>

                                              肯德基


                                展示结果:

 油焖大虾

3. 自定义函数、自定义指令:

(1) 自定义函数

 实现TemplateMthodModelEx

(2) 自定义指令

 实现TemplateDirectiveModel

                        示例:

                                <@自定义指令名称入参(key-value格式) ; 出参(list格式)>

 运行条件



                                PS:不同的返回值用逗号( , )间隔开


        4.常用内建函数、macro(宏指令)、function(函数指令):

(1) 常用内建函数

 处理字符串:

                             substring                                         截取字符串,包头不包尾(下标)

                             cap_first                                         第一个字母大写

                             end_with                                          以什么字母结尾

                             contains                                           是否包含目标字符串

                             date  datetime  time                      转换成日期格式

                             starts_with                                     以什么字母开头

                             index_of                                         返回某个指定的字符串值在字符串中首次出现的位置(下标)

                             last_index_of                                 获取指定字符出现的最后位置(下标)

                             split                                                 分隔

                             trim                                                 去两端空格

 处理数字:

string

                             x?string("0.##")                         变成小数点后几位

                             round                                             四舍五入

                             floor                                              去掉小数点

                             ceiling                                            近1 变成整数

 处理list:

                              first:                                             取List值第一个值

                              last:                                               取List值最后一个值

                              seq_contains:                               是否包含指定字符

                              seq_index_of:                              指定字符所在位置

                              size:                                               集合大小

                               reverse:                                         集合倒序排列

                              sort:                                               对集合进行排序

                              sort_by:                                        根据某一个属性排序

                              chunk:                                           分块处理

 其他:

                              is_string:                                     是否为字符类型

                              is_number:                                   是否为整数类型

                              is_method:                                  是否为方法

                              ():                                                 判断整个变量

                              has_content:                               判断对象是否为空或不存在

                              eval:                                          求值

                (2) macro(宏指令)

 调用:<@macro_name param />

                        语法:<#macro 变量名 参数>

<#nested/>


                (3) function(函数指令)

 调用:${function_name(param)}

                        语法:<#function 变量名 参数>

<#return>


配置解析器以及表单例子后端交互

need-to-insert-img

need-to-insert-img

freemarker ,jsp各自特点

jsp是大家最熟悉的技术优点:1、功能强大,可以写java代码2、支持jsp标签(jsp tag3、支持表达式语言(el4、官方标准,用户群广,丰富的第三方jsp标签库5、性能良好。jsp编译成class文件执行,有很好的性能表现缺点:jsp没有明显缺点,非要挑点骨头那就是,由于可以编写java代码,如使用不当容易破坏mvc结构。freemarker优点:1、不能编写java代码,可以实现严格的mvc分离2、性能非常不错3、对jsp标签支持良好4、内置大量常用功能,使用非常方便5、宏定义(类似jsp标签)非常方便6、使用表达式语言缺点:1、不是官方标准2、用户群体和第三方标签库没有jsp选择freemarker的原因:1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tageljsp好。2、宏定义比jsp tag方便3、内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便4、支持jsp标签5、可以实现严格的mvc分离

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 壹. 第一次见你,是个阴天,有风,你走在我前面,瘦瘦小小的一只,扎着马尾,可能是手太小而头发太多,光洁的后颈窝处有...
    晓乌阅读 455评论 0 1
  • 夜深书中寻如颜,月下清风同未眠。朦胧灯火无尽处,唯见青藤爬窗头。
    山涧泛舟人阅读 186评论 0 0
  • 明素清辉,无言辞去琼林苑。 白衣娟倩,疑是瑶光散。 飞落闲庭,花满荒凉院。欲复返。 西风未现。都付空空念。 ①琼林...
    浣花阁主阅读 402评论 0 3
  • ——时间管理100讲之35 一,变被动为主动。 听讲,阅读,视听都是被动学...
    听见花开3阅读 700评论 0 0
  • 如果你所在的行业发展特别好,公司也还行,但是你的上司对下属很不信任。你感觉自己就像个傻瓜,但一时半会又不能辞职,面...
    Hecyzy阅读 451评论 0 0