`
打牌靠心水
  • 浏览: 1571 次
  • 性别: Icon_minigender_1
  • 来自: 广西
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Freemark 开发指南初稿

阅读更多
 

Freemark 开发指南初稿<o:p></o:p>

                                  整理:蒋江伟

A概念

最常用的3个概念

sequence  序列,对应java里的list、数组等非键值对的集合<o:p></o:p>

hash      键值对的集合<o:p></o:p>

namespace 对一个ftl文件的引用,利用这个名字可以访问到该ftl文件的资源<o:p></o:p>

<o:p> </o:p>

B指令<o:p></o:p>

if, else, elseif<o:p></o:p>

语法

<#if condition><o:p></o:p>
  ...<o:p></o:p>
<#elseif condition2><o:p></o:p>
  ...<o:p></o:p>
<#elseif condition3><o:p></o:p>
  ...<o:p></o:p>
...<o:p></o:p>
<#else><o:p></o:p>
  ...<o:p></o:p>

</#if><o:p></o:p>

用例<o:p></o:p>

<#if x = 1><o:p></o:p>
  x is 1<o:p></o:p>

</#if><o:p></o:p>

<o:p> </o:p>

<#if x = 1><o:p></o:p>
  x is 1<o:p></o:p>
<#else><o:p></o:p>
  x is not 1<o:p></o:p>

</#if><o:p></o:p>

<o:p> </o:p>

switch, case, default, break<o:p></o:p>

语法

<#switch value><o:p></o:p>
  <#case refValue1><o:p></o:p>
    ...<o:p></o:p>
    <#break><o:p></o:p>
  <#case refValue2><o:p></o:p>
    ...<o:p></o:p>
    <#break><o:p></o:p>
  ...<o:p></o:p>
  <#case refValueN><o:p></o:p>
    ...<o:p></o:p>
    <#break><o:p></o:p>
  <#default><o:p></o:p>
    ...<o:p></o:p>
</#switch><o:p></o:p>

<o:p> </o:p>

用例

字符串

<#switch being.size><o:p></o:p>
  <#case "small"><o:p></o:p>
     This will be processed if it is small<o:p></o:p>
     <#break><o:p></o:p>
  <#case "medium"><o:p></o:p>
     This will be processed if it is medium<o:p></o:p>
     <#break><o:p></o:p>
  <#case "large"><o:p></o:p>
     This will be processed if it is large<o:p></o:p>
     <#break><o:p></o:p>
  <#default><o:p></o:p>
     This will be processed if it is neither<o:p></o:p>

</#switch><o:p></o:p>

数字<o:p></o:p>

<#switch x><o:p></o:p>
  <#case x = 1><o:p></o:p>
    1<o:p></o:p>
  <#case x = 2><o:p></o:p>
    2<o:p></o:p>
  <#default><o:p></o:p>
    d<o:p></o:p>
</#switch><o:p></o:p>
<o:p> </o:p>

如果x=1 输出 1 2, x=2输出 2, x=3 输出d<o:p></o:p>

<o:p> </o:p>

list, break<o:p></o:p>

语法

<#list sequence as item><o:p></o:p>
...<o:p></o:p>
<#if item = "spring"><#break></#if><o:p></o:p>
...<o:p></o:p>
</#list><o:p></o:p>
关键字<o:p></o:p>
item_index:list当前值的下标<o:p></o:p>
item_has_next:判断list是否还有值<o:p></o:p>
<o:p> </o:p>

用例<o:p></o:p>

<#assign seq = ["winter", "spring", "summer", "autumn"]><o:p></o:p>
<#list seq as x><o:p></o:p>
  ${x_index + 1}. ${x}<#if x_has_next>,</#if><o:p></o:p>
</#list><o:p></o:p>
<o:p> </o:p>
输出<o:p></o:p>
  1. winter,<o:p></o:p>
  2. spring,<o:p></o:p>
  3. summer,<o:p></o:p>
  4. autumn   <o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>

include<o:p></o:p>

语法

<#include filename><o:p></o:p>
or<o:p></o:p>
<#include filename options><o:p></o:p>
options包含两个属性<o:p></o:p>
encoding=”GBK” 编码格式<o:p></o:p>
parse=true 是否作为ftl语法解析,默认是truefalse就是以文本方式引入.注意在ftl文件里布尔值都是直接赋值的如parse=true,而不是parse=”true”<o:p></o:p>

用例<o:p></o:p>

/common/copyright.ftl包含内容<o:p></o:p>

Copyright 2001-2002 ${me}<br><o:p></o:p>
All rights reserved.  <o:p></o:p>

模板文件<o:p></o:p>

<#assign me = "Juila Smith"><o:p></o:p>
<h1>Some test</h1><o:p></o:p>
<p>Yeah.<o:p></o:p>
<hr><o:p></o:p>

<#include "/common/copyright.ftl" encoding=”GBK”> <o:p></o:p>

输出结果<o:p></o:p>

<h1>Some test</h1><o:p></o:p>
<p>Yeah.<o:p></o:p>
<hr><o:p></o:p>
Copyright 2001-2002 Juila Smith<o:p></o:p>
All rights reserved.  <o:p></o:p>

<o:p> </o:p>

Import<o:p></o:p>

语法

<#import path as hash><o:p></o:p>
类似于java里的import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件<o:p></o:p>
<o:p> </o:p>

用例<o:p></o:p>

<o:p> </o:p>

假设mylib.ftl里定义了宏copyright那么我们在其他模板页面里可以这样使用<o:p></o:p>

<#import "/libs/mylib.ftl" as my><o:p></o:p>
<o:p> </o:p>

<@my.copyright date="1999-2002"/><o:p></o:p>

<o:p> </o:p>

"my"freemarker里被称作namespace<o:p></o:p>

<o:p> </o:p>

compress<o:p></o:p>

语法

<#compress><o:p></o:p>
  ...<o:p></o:p>

</#compress><o:p></o:p>

用来压缩空白空间和空白的行<o:p></o:p>

用例<o:p></o:p>

<#assign x = "    moo  \n\n   "><o:p></o:p>
(<#compress><o:p></o:p>
  1 2  3   4    5<o:p></o:p>
  ${moo}<o:p></o:p>
  test only<o:p></o:p>
<o:p> </o:p>
  I said, test only<o:p></o:p>
<o:p> </o:p>
</#compress>)  <o:p></o:p>

输出<o:p></o:p>

(1 2 3 4 5<o:p></o:p>
moo<o:p></o:p>
test only<o:p></o:p>

I said, test only) <o:p></o:p>

escape, noescape<o:p></o:p>

语法

<#escape identifier as expression><o:p></o:p>
  ...<o:p></o:p>
  <#noescape>...</#noescape><o:p></o:p>
  ...<o:p></o:p>
</#escape><o:p></o:p>

用例<o:p></o:p>

主要使用在相似的字符串变量输出,比如某一个模块的所有字符串输出都必须是html安全的,这个时候就可以使用该表达式<o:p></o:p>
<#escape x as x?html><o:p></o:p>
  First name: ${firstName}<o:p></o:p>
  <#noescape>Last name: ${lastName}</#noescape><o:p></o:p>
  Maiden name: ${maidenName}<o:p></o:p>
</#escape><o:p></o:p>
相同表达式  <o:p></o:p>
  First name: ${firstName?html}<o:p></o:p>
  Last name: ${lastName }<o:p></o:p>
  Maiden name: ${maidenName?html}<o:p></o:p>

assign<o:p></o:p>

语法

<#assign name=value><o:p></o:p>
or<o:p></o:p>
<#assign name1=value1 name2=value2 ... nameN=valueN><o:p></o:p>
or<o:p></o:p>
<#assign same as above... in namespacehash><o:p></o:p>
or<o:p></o:p>
<#assign name><o:p></o:p>
  capture this<o:p></o:p>
</#assign><o:p></o:p>
or<o:p></o:p>
<#assign name in namespacehash><o:p></o:p>
  capture this<o:p></o:p>
</#assign><o:p></o:p>

用例<o:p></o:p>

生成变量,并且给变量赋值<o:p></o:p>
seasons赋予序列值<o:p></o:p>
<#assign seasons = ["winter", "spring", "summer", "autumn"]><o:p></o:p>
<o:p> </o:p>
给变量test1<o:p></o:p>
<#assign test = test + 1><o:p></o:p>
<o:p> </o:p>
my namespage 赋予一个变量bgColor,下面可以通过my.bgColor来访问这个变量<o:p></o:p>
<#import "/mylib.ftl" as my><o:p></o:p>
<#assign bgColor="red" in my><o:p></o:p>
<o:p> </o:p>
将一段输出的文本作为变量保存在x<o:p></o:p>
下面的阴影部分输出的文本将被赋值给x<o:p></o:p>
<#assign x><o:p></o:p>
  <#list 1..3 as n><o:p></o:p>
    ${n} <@myMacro /><o:p></o:p>
  </#list><o:p></o:p>
</#assign><o:p></o:p>
Number of words: ${x?word_list?size}<o:p></o:p>
${x}<o:p></o:p>
<o:p> </o:p>
<#assign x>Hello ${user}!</#assign>     error<o:p></o:p>
<#assign x=” Hello ${user}!”>         true<o:p></o:p>
<o:p> </o:p>
同时也支持中文赋值,如:<o:p></o:p>
<#assign 语法><o:p></o:p>
  java<o:p></o:p>
</#assign><o:p></o:p>
${语法}<o:p></o:p>
打印输出:<o:p></o:p>
java<o:p></o:p>

global<o:p></o:p>

语法

<#global name=value><o:p></o:p>
or<o:p></o:p>
<#global name1=value1 name2=value2 ... nameN=valueN><o:p></o:p>
or<o:p></o:p>
<#global name><o:p></o:p>
  capture this<o:p></o:p>
</#global><o:p></o:p>

<o:p> </o:p>

全局赋值语法,利用这个语法给变量赋值,那么这个变量在所有的namespace[A1] 中是可见的,如果这个变量被当前的assign语法覆盖 如<#global x=2> <#assign x=1> 在当前页面里x=2将被隐藏,或者通过${.global.x}来访问<o:p></o:p>

<o:p> </o:p>

setting<o:p></o:p>

语法

<#setting name=value><o:p></o:p>

用来设置整个系统的一个环境<o:p></o:p>

locale<o:p></o:p>

number_format<o:p></o:p>

boolean_format<o:p></o:p>

date_format, time_format, datetime_format<o:p></o:p>

time_zone<o:p></o:p>

classic_compatible<o:p></o:p>

用例<o:p></o:p>

假如当前是匈牙利的设置,然后修改成美国<o:p></o:p>

${1.2}<o:p></o:p>
<#setting locale="en_US"><o:p></o:p>
${1.2}  <o:p></o:p>

输出<o:p></o:p>

1,2<o:p></o:p>
1.2<o:p></o:p>

因为匈牙利是采用“,”作为十进制的分隔符,美国是用“.<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

macro, nested, return<o:p></o:p>

语法

<o:p> </o:p>

<#macro name param1 param2 ... paramN><o:p></o:p>
  ...<o:p></o:p>
  <#nested loopvar1, loopvar2, ..., loopvarN><o:p></o:p>
  ...<o:p></o:p>
  <#return><o:p></o:p>
  ...<o:p></o:p>
</#macro><o:p></o:p>

用例

<#macro test foo bar="Bar"[A2]  baaz=-1><o:p></o:p>
  Test text, and the params: ${foo}, ${bar}, ${baaz}<o:p></o:p>
</#macro><o:p></o:p>
<@test foo="a" bar="b" baaz=5*5-2/><o:p></o:p>
<@test foo="a" bar="b"/><o:p></o:p>
<@test foo="a" baaz=5*5-2/><o:p></o:p>

<@test foo="a"/> <o:p></o:p>

输出<o:p></o:p>

  Test text, and the params: a, b, 23<o:p></o:p>
  Test text, and the params: a, b, -1<o:p></o:p>
  Test text, and the params: a, Bar, 23<o:p></o:p>

  Test text, and the params: a, Bar, -1<o:p></o:p>

定义循环输出的宏<o:p></o:p>

<#macro list title items><o:p></o:p>
  <p>${title?cap_first}:<o:p></o:p>
  <ul><o:p></o:p>
    <#list items as x><o:p></o:p>
      <li>${x?cap_first}<o:p></o:p>
    </#list><o:p></o:p>
  </ul><o:p></o:p>
</#macro><o:p></o:p>

<@list items=["mouse", "elephant", "python"] title="Animals"/><o:p></o:p>

输出结果<o:p></o:p>
<p>Animals:<o:p></o:p>
  <ul><o:p></o:p>
      <li>Mouse<o:p></o:p>
      <li>Elephant<o:p></o:p>
      <li>Python<o:p></o:p>

  </ul><o:p></o:p>

包含body的宏<o:p></o:p>

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

</@repeat> <o:p></o:p>

输出<o:p></o:p>

<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">1. 0.5</st1:chsdate><o:p></o:p>
  2. 1<o:p></o:p>
  <st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">3. 1.5</st1:chsdate><o:p></o:p>

  4. 2 Last!<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

t, lt, rt<o:p></o:p>

语法

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

<o:p> </o:p>

C一些常用方法或注意事项<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

表达式转换类<o:p></o:p>

${expression}计算expression并输出<o:p></o:p>

#{ expression }数字计算#{ expression ;format}安格式输出数字formatMm<o:p></o:p>

M表示小数点后最多的位数,m表示小数点后最少的位数如#{121.2322;m<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="2" unitname="m2">2M2</st1:chmetcnv>}输出121.23<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

数字循环<o:p></o:p>

1..5 表示从15,原型number..number<o:p></o:p>

对浮点取整数<o:p></o:p>

${123.23?int} 输出123

给变量默认值<o:p></o:p>

${var?default(“hello world<br>”)?html}如果var is null那么将会被hello world<br>替代<o:p></o:p>

<o:p> </o:p>

判断对象是不是null<o:p></o:p>

    <#if mouse?exists><o:p></o:p>
      Mouse found<o:p></o:p>
<#else><o:p></o:p>
也可以直接${mouse?if_exists})输出布尔形<o:p></o:p>

常用格式化日期<o:p></o:p>

 openingTime必须是Date,详细查看freemarker文档 Reference->build-in referece->build-in for date<o:p></o:p>
<o:p> </o:p>
${openingTime?date}<o:p></o:p>
分享到:
评论

相关推荐

    freemark开发指南详解

    以下是对FreeMarker开发指南中涉及的一些关键知识点的详细解释: 1. **基础概念**: - **Scalars**:存储单一值的数据类型,如字符串、数字、日期和布尔值。 - **Hashes**:存储键值对的容器,用于组织和检索数据...

    freemark开发指南(入门)

    FREEMARK资料,开发入门指南 是开发人员了解FREEMARK的一本入门资料

    Freemark 开发指南

    在本开发指南中,我们将深入探讨Freemarker的三个核心概念:sequence、hash和namespace,以及如何使用指令、列表操作、包含和导入等功能。 1. **序列(Sequence)** 序列在Freemarker中对应于Java中的List或数组,...

    freemarker示例程序

    至于压缩包内的文件,"Freemark开发指南初稿.doc"可能是一份关于如何使用Freemarker的详细教程或者开发指南,涵盖了Freemarker的基础知识和高级特性,以及可能的示例代码。"work.doc"可能是工作文档或示例程序的设计...

    freemark开发指南

    本指南将帮助初学者理解并掌握Freemarker的基本概念、指令和高级方法。 1. **基本概念** - **Sequence**:序列,类似于Java中的List或数组,用于存储一组有序的元素。 - **Hash**:键值对集合,类似于Java中的Map...

    freemarker操作手册-完整freemarker教程

    Freemarker是一个强大的模板引擎,常用于Web应用中的视图层开发,特别是在Java环境中,它作为MVC设计模式的一部分,负责生成动态HTML或其他格式的文本。本教程将深入讲解Freemarker的核心概念、语法和实际应用,帮助...

    Freemark指南

    ### Freemark指南知识点详解 #### 一、概览 **Freemark**是一种强大的模板引擎,主要用于将数据模型与表示层分离。它通过一种简洁而强大的语法来实现动态内容的渲染,使得开发者能够更加灵活地控制页面布局和内容...

    freemark资料及eclipse的freemark插件

    标题中的"freemark资料及eclipse的freemark插件"表明我们将讨论关于FreeMarker的学习资源以及如何在Eclipse中使用FreeMarker插件进行开发。 FreeMarker的核心概念包括模板、数据模型和配置。模板是HTML或者其他文本...

    Freemark标签

    主要介绍了freemark标签的相关基础知识,基本上了解Freemark标签的应用

    FreeMark Jar包 包括 中文 官方文档

    这个压缩包包含的是FreeMark的中文官方文档,对于理解和使用FreeMark非常有帮助。 "FreeMarker_2.3.23_Manual_zh_CN.chm" 是FreeMark的2.3.23版本的中文帮助文档,通常以CHM(Microsoft Compiled HTML Help)格式...

    freemark插件

    freemark插件支持智能提示,代码高亮显示,可方便你的开发。 步骤: 1.把压缩包解压到plugins文件下; 2.进入configuration\org.eclipse.equinox.simpleconfigurator文件夹,在bundles.info文件后面添加hudson....

    实现FreeMark读取模板生成HTML

    在Web开发中,它可以帮助我们从后端数据分离视图层,实现MVC模式。FreeMarker的工作原理是,通过读取预先定义好的模板文件,结合传入的数据模型,生成最终的输出文本。 在“实现FreeMark读取模板生成HTML”的过程中...

    Freemark模板使用

    本教程适用于初学者,旨在快速引导你掌握Freemark的基本使用方法。我们将通过几个关键步骤来理解并实践如何在Java环境中配置和使用Freemark。 首先,你需要在项目中引入Freemark的库文件。在这个例子中,我们导入了...

    freemark 生成静态页面

    总的来说,FreeMarker是Java Web开发中一个非常实用的工具,通过将业务数据和页面展示分离,提高了代码的可维护性和灵活性。通过深入学习和使用FreeMarker,开发者可以更高效地构建动态网页,提高开发效率。

    freemark

    freemark资料

    freemark制定excel下载模板示例

    当下载的excel格式内容比较复杂时,用程序生成excel文件就显得力不从心。这时采用excel模板化,更加便捷高效。本资源基于springboot+freemark模板做的示例。只需要了解下freemark基本语法即可。

Global site tag (gtag.js) - Google Analytics