Freemarker专题

变量的定义与显示

1.定义字符串

<#assign str='a'>
<#assign str2 ="b">
<#assign sb =str+str2>${sb}结果为ab
<#assign sb =str+1>${sb}结果为a1

2.定义数字

<#assign x = 1>
<#assign y = 2>
<#assign z = x+y>  ${z}结果为3

3.定义list

<#assign list0 = [0,1,"2"]>

4.定义map

<#assign map0 = {"1":"a","2":"b"}>

5.定义boolean类型

<#assign bl= false>
${bl?c}显示false

变量的运算

1.都为数值类型时 为正常运算
2.其中有字符串时为字符串拼接

基础标签

1.条件判断<#if (bl)>

<#assign a = 2>
<#if (a=1)>
  a=1
  <#elseif (a=2)>
  a=2
  <#else>
  a=other

2.循环标签与中断标签<#list list as obj>

<#list list as obj>
   <#if (obj_index=2)><#break>

3.禁止转换标签<#noparse>

<#noparse>
${a}
//被noparse包围的区域将不会被转换,结果显示${a}

4.导入其他freemarker文本标签<#include>
a. 创建base.ftl如下

<#assign a = 1>
abc

b. 创建test.ftl如下

<#include '../base.ftl'>//中的文本与变量同时被导入进来
${a}  
显示结果为
abc
1

5.导入定义与函数标签<#import as xxx>
a. 创建base.ftl如下

<#assign a = 1>
abc

b. 创建test.ftl如下

<#import '../base.ftl' as obj>//中的文本与变量同时被导入进来
${obj.a}  
显示结果为
1

List的使用

1.list偏移

<#assign list = [1,2,"3"]>
${list[0]+list[1]}

2.list判断存在元素

<#assign list = [1,2,"3"]>
${list?seq_contains(1)?c}显示true
${list?seq_contains("3")?c}显示true

3.list的大小

${list?size}

4.list的遍历

<#list list as obj>
${obj_index}.${obj}  //x_index为list的索引

Map的使用

1.map遍历key

<#assign map = {"1":"a","2":"b","3":"c"}>
<#list map?keys as key>
${key}:${map[key]}

2.map查找value

<#assign key="2">
${map[key]}或${map["2"]}

3.判断map是否存在某个key

${map["2"]?exists?string('存在','不存在')}
${map?keys[1]?exists?string('存在','不存在')}

Freemarker技巧

1.打印$

<#assign dl='$'>
${dl}
${r'$abc'}

2.避免未定义变量(miss)错误

${a!""}
<#assign a = 'a'><#assign b = 'b'>
${(a+b+":")!""}//若a或b其中一个不存在则为""都存在则为ab:
${a?default("0")}

3.格式化数据

#{2.555;M2}//最多保留两位小数  结果为2.56
#{2;M2}//最多保留两位小数  结果为2
#{2.555;m2}//保留到两位小数  结果为2.56
#{2;m2}//保留到两位小数  结果为2.00
${123456?string(',###')}//每3位用逗号分割 结果为123,456
${123456.1?string(',###.##')}//每3位用逗号分割并最多保留两位小数 结果为123,456.1
${123456.1?string(',###.00')}//每3位用逗号分割并保留到2位小数 结果为123,456.10
${datetime?string('yyyy-MM-dd HH:mm')} //格式化日期

4.去掉空格与换行符

<#t> 去掉左右空白和回车换行 
<#lt>去掉左边空白和回车换行 
<#rt>去掉右边空白和回车换行 
<#nt>取消上面的效果 

常用函数

1.exists判断该变量是否存在
2.is_sequence判断变量是否是集合
3.is_hash判断变量是否是map

字符串函数

${"abc"?length}  //字符串长度
${" abc "?trim}  //去掉左右空格
${"1"?number+2}  //转换数字类型  结果为3
${" abc "?substring(1,3)}  //字符串截取
${"abcabd"?replace('a','c')} //替换所有字符
${"abcabd"?split('b')[0]} //分割字符串
${" abc "?index_of('a')}  //第一个字符串索引
${" abc "?last_index_of('a')}  //最后一个字符串索引
${"abc"?cap_first}  //首字母大写
${"abc"?uncap_first}  //首字母小写
${"abc"?upper_case}  //全部字母大写
${"abc"?lower_case}  //全部字母小写
${"abcabd"?starts_with('b')?c}  //判断是否以某字符串开头
${"abcabd"?ends_with('b')?c}//判断是否以某字符串结尾
${"abc"?contains('b')?c} //判断是否包含字符
${"123"?matches('\\d+')?c}  //判断是否匹配正则表达式
${"<>&"?html} //html转码
<#setting url_escaping_charset='UTF-8'>
${"localhost/a.html?name=李渊"?url}或者
${"localhost/a.html?name=李渊"?url('UTF-8')}//url编码

Freemarker高级用法

1.自定义指令<#macro method param0 param1="?" param2="?">

<#macro hello name="lg">hello ${name}
<@hello name='world'/>//结果显示 hello world 

2.java中自定义指令
a. 创建类并实现TemplateDirectiveModel接口
b. 使用env输出数据

public class TestDirective implements TemplateDirectiveModel {
    
    public void execute(Environment env, Map params, TemplateModel[] loopVars,
            TemplateDirectiveBody body) throws TemplateException, IOException {
        env.getOut().write("-----------------------");
        SimpleScalar ss = (SimpleScalar) params.get("name");
        String name = ss.getAsString();
        if(name!=null){
            env.getOut().write(name);
        }
    }
}

c. 在ftl文件中引入java方法,并使用

<#assign test= "net.lgpage.ant.test.UpperDirective2"?new()> //引入方法
<@test name='lg'>//输出结果-----------------------lg
  1. 自定义函数 <#function avg param0 param1><#return '?'/>
<#function test a>
    <#return 'hello ${a}'>

${test('world')}//输出hello world
  1. java中自定义函数
    a. 实现TemplateMethodModelEx接口
public class TestMethodModel implements TemplateMethodModelEx{
    @Override
    public Object exec(List list) throws TemplateModelException {
        return list.toString();
    }
}

b. 引入方法并使用

<#assign md= "net.lgpage.ant.test.TestMethodModel"?new()> 
${md('1',' 2')}

Freemarker任意获取java返回值

定义一个需要被调用方法的类(自创类似Spring中的controller的东西)

@PathRedirect("test")
public class FreemarkerAction {
    
    public String hello(){
        return "hello";
    }
    @PathRedirect("/xixi")
    public String hehe(){
        return "hello";
    }
    @PathRedirect("/abc/{id}")
    public String hehe(String id,String name,Admin admin){
        if(admin == null)return "hello:"+id;
            System.out.println("终于成功了"+id+",还传了名字"+name+",还给了个对象"+admin.getEmail());
        return "hello:"+id;
    }
}

定义InvokeMethod类

public class InvokeMethod implements TemplateMethodModelEx {
    @Override
    public Object exec(List list) throws TemplateModelException {
        String str = FreeMarkerModelUtil.parse(list.get(0), String.class);
        /*
         * 从ftl文件获取参数
         */
        Object objs[] = new Object[list.size() - 1];
        for (int i = 1; i < list.size(); i++) {
            objs[i - 1] = FreeMarkerModelUtil.parse(list.get(i));
        }
        /*
         * 方法转发核心类(请根据需要自行书写)
         */
        MethodDispatcher d = new MethodDispatcher();
        d.methodManager.putMethod(FreemarkerAction.class);//初始化该类需要被调用的方法
        Object obj = null;
        try {
            obj = d.invoke(str, objs);
            return obj;
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;
    }
}

引入已经定义好的invokeMethod类

<#assign invoke= "net.lgpage.freemarker.method.InvokeMethod"?new()> 
${invoke('test/abc/2','lg')}   //该行代码效果会去调用FreemarkerAction类中hehe(String id,String name,Admin admin)方法,最终结果显示hello:2

你可能感兴趣的:(Freemarker专题)