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分离

你可能感兴趣的:(FreeMarker)