为了账号安全,请及时绑定邮箱和手机立即绑定

Java模板引擎之Freemarker

祁聪 全栈工程师
难度中级
时长 1小时57分
学习人数
综合评分9.70
53人评价 查看评价
9.8 内容实用
9.6 简洁易懂
9.7 逻辑清晰
  • FreeMarker,模板引擎,是一款视图层的组件,用于解析服务器端数据并展示在视图层

    查看全部
  • 视图层组件,不是框架
    查看全部
  • #macro(宏指令)语法:

    <#macro macro_name param1[=defaultValue1] param2[=defaultValue2] [paramExt...] > //可变参数以Map形式传入

    template_code //封装的模板代码片段

    [<#nested loopVar1, loopVar2/>] //嵌套模板, 定义的多个参数以逗号分隔

    </#macro>

    调用:

    <@macro_name param1=${param1} param2=${param2}[;loopVar1, loopVar2]> //插入nested的参数

    [${loopVar1}, ${loopVar2}]

    ${paramExt['key']} //可变参数取值

    </@macro_name>

    用于封装模板片段


    #function语法:

    <#function function_name param1 param2>

    <#return param1 + param2>

    </function>

    调用:

    ${function_name(param1, param2)}

    函数只是实现功能

    查看全部
  • list?chunk(n) //设定分成n块

    ?eval执行前面的代码

    查看全部
  • 字符串内建函数

    ?cap_first //首字母大写

    ?start_with

    ?ends_with

    ?split

    ?contains

    ?trim

    ?date //转换为date类型

    ?datetime

    ?time


    处理数字的内建函数

    x?string("0.##")

    ?round

    ?floor

    ?ceiling


    处理listd的内建函数

    ?first

    ?last

    ?seq_contains

    ?seq_index_of

    ?reverse

    ?sort_by

    ?chunk 分块处理


    其他内建函数

    is函数:

    ?is_string

    ?is_number

    ?is_method

    (),has_content函数 //将一个对象视为整体

    eval //求值

    查看全部
  • 自定义指令

    语法:

    1. 指令以@开头

    2. 传入的多个参数以空格分隔

    3. 参数与返回值之间以分号间隔

    4. 多个返回值以逗号分隔


    代码实现:

    1. 创建自定义指令接口TemplateDirectiveModel实现类

    2. 实现接口的execute()方法

    env: 环境变量

    params: 指令参数key=value对

    loopVars: 循环变量

    body: 指令内容

    除了params,其他都能为null

    public void execute(Environment env, Map params, TemplateMode[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOExecption {

    TemplateScalarModel param1 = (TemplateScalarModel) params.get("param1"); //获取指令参数值

    TemplateScalarModel param2 = (TemplateScalarModel) params.get("param2");

    loopVars[0] = TemplateBooleanModel.TRUE; //设定指令返回值

    loopVars[1] = new SimpleSequence(list);

    body.render(env.getOut()); //返回指令执行结果

    }

    3. 在Spring中配置freemarkerVariables

    <property name="freemarkerVariables">

    <map>

    <entry key="directiveName" value-ref="directiveBeanId" />

    </map>

    </property>

    查看全部
    0 采集 收起 来源:自定义指令

    2019-06-16

  • list常用指令

    list?sort //对list排序

    list?reverse //反转降序

    list?size //获取list个数

    #list list?sort as item

    ${item_index} //获取元素在集合中的索引值

    查看全部
  • 自定义函数

    1. 实现TemplateMethodModelEx接口

    2. 实现其中exec()方法

    //args是自定义函数的所有参数的lis集合

    public Object exec(List args) throws TemplateModelException {

        //获取的参数需要转化为SimpleSequence对象, freemarker的数据模型对象

       SimpleSequence arg0 = (SimpleSequence) args.get(0);

       List<BigDecimal> list = arg0.toList(); //将第一个参数转为它原本的类型, 在freemarkeer 2.3.22之后该方法被标记为过时的(@Deprecated)

       //实现的代码

       return object;

     }

    3. 将该实现类对象传递给html页面,参数名就是freemarker自定义函数的函数名

     modelAndView.addObject("函数名", templateMethodModelEx);

    4. 在html中直接通过函数名()调用自定义函数


    注: 不使用simpleSequence.toList()方法转换simpleSequence封装的list的方式(网上尚未查询到相关资料,该方式是基于simpleSequence.toList()的源码和官方api编写的)

    1. SimpleSquence simpleSequence = (SimpleSequence) args.get(0);

    2. 根据页面传递过来的list类型重新创建新的list

     List<Integer> list = new ArrayList<>();

    3. 获取DefaultObjectWrapperBuilder对象

     DefaultObjectWrapperBuilder builder = new DefaultObjectWrapperBuilder(Cinfiguration.getVersion()); //Cinfiguration.getVersion()自动获取当前freemarker的版本

    4. 创建DefaultObjectWrapper对象

     DefaultObjectWrapper objectWrapper = builder.build();

    5. 遍历simpleSequence(遍历的每个元素都是TemplateModel对象), 使用DefaultObjectWrapper的unwrap()或tryUnwrapTo()方法将TemplateModel转化为Java类型,向list添加转化后的对象

    for (int i=0; i < simpleSequence.size(); i++) {

    list.add(objectWrapper.unwrap(simpleSequence.get(i), Integer.class));

    }

    6. 根据需求处理list并将处理后的list返回页面


    查看全部
    1 采集 收起 来源:自定义函数

    2019-06-15

  • String基本操作指令

    substring(startIndex, endIndex) //截取字符串

    length //长度

    upper_case //大写

    lower_case //小写

    index_of('str') //首次出现位置

    last_index_of('str') //最后出现位置

    replace(‘old’, 'new') //替换子字符串

    查看全部
  • 补充表达式指令

    "+": 字符串连接,集合连接

    "[index]": 下标取值


    自定义函数

    实现TemplateMethodModeEx接口


    自定义指令

    实现TemplateDirectiveModel

    查看全部
  • <#switch var>

    <#case value1>

    ...

    <#break>

    <#case value2>

    ...

    <#break>

    </#switch>

    查看全部
    1 采集 收起 来源:switch语法

    2019-06-10

  • freemarker条件语句

    1. if...else...

    <#if 条件>

    ...

    <#else>

    ...

    </#if>

    2. if...elseif...else...

    <#if 条件>

    ...

    <#elseif 条件2>

    ...

    <#else>

    ...

    </#if>

    3. <#if var??> | <#if var?exists>

     判断var是否存在(不为null)

    查看全部
    1 采集 收起 来源:if语法

    2019-06-10

  • 对Map取值

    map?keys //获取所有的key组成的set

    <#list map?keys as key> //遍历key

    ${map[key]} 获取key对应的value

    查看全部
    1 采集 收起 来源:集合Map的遍历

    2019-06-10

  • object.var! //对最近的变量进行判断是否为null

    (object.var)! //对整体进行判断是否为null

    查看全部
  • <#assign varName="value"> //定义变量赋值

    查看全部

举报

0/150
提交
取消
课程须知
会写简单java的代码
老师告诉你能学到什么?
在实战中学习Freemarker基本技术,并了解高级技术。只要你会写简单java的代码,经过简单、轻松的学习之后,保证你会喜欢上它,并掌握它。欢迎同学加群深入讨论学习 慕课网Java讨论群② 297446076

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!