• FreeMarkerD1


    评论页面content:
    [@cms_content_page]
    [#if tag_pagination.list?size = 0]
    暂无评论
    [#else]
    [#list tag_pagination.list as c]
    用户:${(c.commentUser.username)!匿名网友} 时间:${c.createtime}
    内容:${c.textHtml!}
    [/#list]
    [/#if]
    [/@cms_content_page]

    标签使用:
    1. 先引入模版标签[@+标签名]
    2. 如果有list的使用标签[#list 标签名 as c](不包含判断是否为空集合)
    3. 输出${c.commentUser.username} 由于Spring的依赖注入模版标签直接调用了entity(也就是pojo)的get方法,能调用对象和属性

    [@process_time/]——页面加载所用时间
    [@cms_comment_list]
    [@cms_channel_list]
    [@cms_lucene_page]
    [@cms_tag_list]

    指令类型:预定义指令和用户自定义指令
    <#directivename parameter>${parameter.name}</directivename> 预定义
    <@user></@user> 用户自定义
    此外,自定义指令可以使用macor(指令)来定义greet(宏)
    <#macor greet person> <#-- 这里可以定义多个变量 -->
    Hello 你好!${person}
    </#macor>

    为了表明字符串是原生字符串,在开始的引号或单引号之前放置字母r

    内嵌函数:${user.upper_case} 转成大写,前提是user为字符串
    双重内嵌函数:${user.upper_case.html}先会把user答谢转换然后在进行html内建函数转换

    方法调用:repeat(args ..) 前提是程序员事先定义好的方法。
    不存在的值: FreeMarker里没有null值这个概念(在2.3.7之后的版本可处理null值了)
    默认值: ${mouse!"NO MOUSE"} 假如没有定义mouse这个变量那么输出将会是NO MOUSE


    检测不存在的值:一般在if条件句中常用,例如:
    <#if username??>
    username found
    <#else>
    username not found
    <#if>
    此时如果想定义一个username那么可以这样:<#assign username="maomao"> 在执行上面的语句就会输出username found

    ${a == 2}不会输出true或false,这是错误的。 换个角度可以使用内建函数${a?string("true","false")}

    嵌套内容输出例子:
    <#macro greet count>
    <#local y="test">
    <#list 1..count as x>
    ${y} ${count}/${x}:<#nested>
    </#list>
    </#local>
    </#macro>

    <@repeat count=3>${y!"?"} ${x!"?"} ${count!"?"} </@repeat>

    循环语句:(新的表示法)
    <#macro do_thrice>
    <#nested 1>
    <#nested 2>
    <#nested 3>
    </#macro>

    <@do_thrice ; x> <#-- 这里的;号相当于集合遍历中的as -->
    ${x} Anything.
    </@do_thirce>
    输出:
    1 Anything.
    2 Anything.
    3 Anything.

    <#macro repeat count>
    <#list 1..count as x>
    <#nested x, x/2, x==count>
    </#list>
    </#macro>
    <@repeat count=4 ; c, halfc, last>
    ${c}. ${halfc}<#if last> Last!</#if>
    </@repeat>

    分析:
    1. macro是自定义指令、repeat代表宏、count标识一个变量
    2. list是一集合,从1到count值进行遍历
    3. nested指令输出时指定到对应的${c}. ${halfc}<#if last> Last!</#if> 其中的变量一一对应
    4. <@repeat count=4 ; c, halfc, last> 这里涉及到了一个宏内部使用循环,;号之后的变量与nested中的参数一一对应
    结果应该是:
    1. 0.5
    2. 1
    3. 1.5
    4. 2 Last!
    注:repeat宏指定的参数应该是小于等于nested中参数的个数


    Java应用FreeMarker模版。
    1. 创建并指定模版路径。如下: Configuration是存储FreeMarker模版的中央区域,主要负责模版的创建和缓存
    Configuration cfg = new Configuration();
    // Specify the data source where the template files come from.
    // Here I set a file directory for it:
    //指定加载模版的目录
    cfg.setDirectoryForTemplateLoading(
    new File("/where/you/store/templates"));
    // Specify how templates will see the data-model. This is an advanced topic...
    // but just use this:
    cfg.setObjectWrapper(new DefaultObjectWrapper());
    注意:应该使用单实例配置
    2. 创建数据模型,如下:
    // Create the root hash
    Map root = new HashMap();
    // Put string "user" into the root
    root.put("user", "Big Joe");
    // Create the hash for "latestProduct"
    Map latest = new HashMap();
    // and put it into the root
    root.put("latestProduct", latest);
    // put "url" and "name" into latest
    latest.put("url", "products/greenmouse.html");
    latest.put("name", "green mouse");
    相当于生成一个树形结构
    3. 创建模版
    从Configuration实例中获取Template
    Template temp = cfg.getTemplate("test.ftl");
    调用这个方法会创建一个test.ftl的Template实例,并去读取编译它,虽然Template实例以解析后的形式存储模版,而不是以源文件的形式存
    储。 以后在此获取test.ftl时就不会再创建Template实例了
    4. 将模版和数据模型合并
    Writer out = new OutputStreamWriter(System.out);
    temp.process(root, out);
    out.flush();

  • 相关阅读:
    我修改/收藏的CSDN知识.(asp.net JavaScript)
    哪里摔倒就在哪里躺下
    显示存储过程的名称、创建时间、修改时间
    Flash Builder 初试(二)绑定和双向绑定
    C#支持中文的格式化字符长度方法
    Flash Builder 初试(一)信息提示窗口
    Flash Builder 初试(三) 使用摄像头
    Null Object 模式
    开放封闭原则(OCP)
    面向对象设计5大准则
  • 原文地址:https://www.cnblogs.com/xmaomao/p/2985112.html
Copyright © 2020-2023  润新知