`
linvar
  • 浏览: 258992 次
  • 性别: Icon_minigender_1
  • 来自: 未定
社区版块
存档分类
最新评论

freemarker 笔记

    博客分类:
  • java
阅读更多
Freemarker是java的模板引擎,主要用于MVC中的view层,生成html展示数据给客户端.可以完全替代jsp.
freemarker模板中没有业务逻辑,外部java程序通过数据库操作等生成数据传入template中,
template + data-model = output

1.template
变量替换 ${...}

常用FTL tags:
(1).
<#if condition>
<#elseif condition>
<#else>
</#if>
其中condition是boolean值,可以进行返回boolean的表达式
如<#if (user.age > 23)></#if>
  <#if user.name == "mimi"></#if>
如果condition的包含的字符没有双引号引起来,就表示这是个变量${},
不用在condition里使用${}来表示变量
<#if x > 3></#if>这种方式是错误的,因为freemarker会先解释前面那个">",
可以使用<#if (x > 3)></#if>或<#if x &gt; 1><?#if>
(2).
<#list sequence as item>...</#list>
有两个有用的变量在这个<#list>循环里面,
一个是item_index(item要根据list中那个item改变),从0开始计数,记录当前是第几个元素.
另外一个是item_has_next,测试当前的item是不是最后一个元素
在<#list>中可以使用<#break>跳出循环
(3).
<#include>
可以使用它导入共用的的东西,比如footer,head
各种ftl tags可以嵌套使用

2.处理template中不存在的变量,
如果在template中引用的变量并不在module里,当变量的值为null,也当是不存在变量.那么freemarker会报错
可以使用
<#if user??>${user}</#if>如果user存在才显示
<h1>Welcome ${user!"Anonymous"}!</h1>如果不存在使用变量"!"后面的默认值
对于多级对象属性的情况使用()来防止中间的变量为null
<#if (user.name)??>${user.name}</#if>
${(user.name)!"Anonymous"}

3.表达式
可以在${...} <#if>的condition中进行各种表达式计算
比如 +,-,*,/,%
产生boolean值的表达式
>, <, ==, !=, >=, <=, &&, ||, !
当然>,>=比较特殊,因为它包括tags的结束符
所以应该转义 &gt;, &gte;
也可以使用()包裹着

4.build-ins
build-ins是修饰各种变量的有用funtion,比如要使用string变成大写,使用string的upper_case build-in,使用方法是在变量后加?
如 user?upper_case
freemarker提供了各种变量类型的许多build-ins
常用的有
str?html :将str中包含的html特殊字符转义,比如<被转义成为&lt;
str?cap_first : 第一个字符大写
str?lower_case: 字符串转小写
str?upper_case: 字符串转大写
str?trim : 删除字符串两边空格

列表有个size build-in显示列表的长度
sequence?size

可以将浮点数修改为int
-1.9?int 結果是1,只取int部分,不做各种舍取操作

5.在模板里定义变量
比如<#assign user="pp">
他会隐藏module里面的user变量,如果有的话

6.命名空间
默认的各种变量都是定义在main namespace中,虽然我们没有注意到
当我们写各种模板时,我们希望各个模板的变量不要被隐藏,这时这要到命名空间了.
当我们在主模板中引入其他模板时,这时不要使用<#include>了,而使用<#import>
<#import "/lib/my_test.ftl" as my>
这样我们要调用my_test.ftl中的变量时就用my.var调用了

7.空格处理
freemarker默认是不会压缩template中的空格,也就是你写了什么就是什么
这在一些应用可能有用,但在web应用无疑是浪费带宽,所以应该压缩一下freemarker
的output,可以在template中用<#compress>包裹内容.
但是如果每个文件都使用<#compress>会有点麻烦,
也可以configuration那个freemarker的主要配置类对象中设置
config.setWhitespaceTrip(true); (但我测试是无效)

二.java程序员相关freemarker的内容
1.freemarker.template.Configuration
这是freemarker设置的中心地方,他还负责创建新的template,缓存预编译的template. Configuration的生命周期一般是应用级的,所以一般是在应用的开始时创建Configuration.
Configuration config = new Configuration();
//get the template
Template template = config.getTemplate("test.ftl");
//build module
Map root = new HashMap();
root.put("user","bigfan");
//Merge data-model with template
Writer out = new OutputStreamWriter(System.out);
template.process(root, out);
out.flush();

2.freemarker的有效变量
在freemarker内部,有效的变量必须是实现了freemarker.template.TemplateModel接口的java对象,但是我们之前用的String,List等并没有实现这个接口,其实这是因为freemarker使用了一种叫做object wrapping的方式将java标准类转换为相应的实现了这个接口的类.

3.freemarker内部有两大数据类型: Scalar, Container
其中Scalar包括
Boolean, Number, String, Date
基中Container包括
Hashes, sequences, Collections

4.设置Shared variables
这些变量在所有的template中都是有效的.
config.setSharedVariable("company", "Foo Inc.");

5.settings是影响freemarker行为的值
比如locale, number_format
可以有三个层次的settings:
(1).在Configuration中设置的setting,使用setter方法
比如
myCfg.setLocale(java.util.Locale.ITALY);
myCfg.setNumberFormat("0.####");
也可以在.properties文件中定义name-value,再使用myCfg.setSetting()方法
(2).Template层也可以设置setting,但是template是可缓存的,所以必须在template第一次创建时就设置setting,而这比较难控制
(3).Environment层,
template对象可以得到freemarker.core.Environment这个对象,
再使用这个对象的setter进行设置,应该在执行template.process()之前就设置好
(4).还可以在template文件中进行设置,使用directive
<#setting locale="it_IT">
<#setting number_format="0.####"> 

6.Template loaders
freemarker有三种loader:文件方式,classpath,servletContext
void setDirectoryForTemplateLoading(File dir);
void setClassForTemplateLoading(Class cl, String prefix); 
void setServletContextForTemplateLoading(Object servletContext, String path);

7.Template caching
当从configuration中getTemplate()时, configuration会缓存template,所以下次再拿相同的template就不会重新创建template和解释这个template. 如果修改template文件后,freemarker会重新读取和解释这个template,默认时间是5秒钟去判断文件是否修改.有一个"update delay"相关的设置可以修改这个值.
但是如果是使用classpath方式load模板的话,并不会提示说你已经修改了模板文件.因为在classpath的文件的默认是被认为不会被修改的.

8.freemarker会用本地locale格式化数字
比如10000会被输出10,000
这有时对后端程序是有害的.
我们可以使用
cfg.setNumberFormat("0.######");
也可以使用数字的build-in "c" 比如 ${userId?c}
也可以试试在模板文件中使用<#number_format "0.######">

9.freemarker的properties配置文件

可以在classpath中定义freemarker.properties配置文件
配置模板:
template_update_delay = 30 #in seconds
default_encoding = utf-8
locale = utf-8
whitespace_stripping = true
auto_import="/WEB-INF/content/index.ftl" as p, "/WEB-INF/content2/index.ftl" as cms
tag_syntax=auto_detect
url_escaping_charset=UTF-8
datetime_format=yyyy-MM-dd HH:mm:ss
date_format=yyyy-MM-dd
time_format=HH:mm:ss
number_format=0.######;
boolean_format=true,false
分享到:
评论

相关推荐

    freemarker笔记

    这个“freemarker笔记”很可能是一个关于理解和使用FreeMarker模板语言的学习资料,其中可能涵盖了FreeMarker的基本概念、语法、以及在实际开发中的应用。 FreeMarker的核心概念是模板和数据模型。模板是HTML或者...

    FreeMarker笔记1

    下面将详细解释FreeMarker的一些关键语法和特性,以及在实际应用中的使用。 ### 1. 对象输出 在FreeMarker中,可以直接输出对象的值。例如,如果在数据模型中有一个名为`name`的对象,可以使用`${name}`将其值插入...

    freemarker

    freemarker笔记

    Freemarker学习笔记

    Freemarker学习笔记可以帮助初学者了解,快速掌握Freemarker

    Freemarker 语法规则

    通过阅读`freemarker语法.docx`和`freemarker笔记1.txt`,你可以更深入地了解这些规则,并结合实际项目进一步掌握Freemarker的使用。同时,参考提供的博客链接(https://kingpingping.iteye.com/blog/1144477),...

    freemarker资料汇总

    再来看《Freemarker使用总结》和《freemarker笔记》。这些文档通常是个人或团队在实践中积累的经验总结,它们可能包含了一些最佳实践、技巧或者常见问题的解决方案。通过阅读这些笔记,你可以快速掌握Freemarker在...

    Freemarker 学习笔记一 【乱码解决】

    在使用Freemarker的过程中,遇到乱码问题是一个常见的挑战,特别是当处理不同编码格式的数据时。本篇文章将探讨如何解决Freemarker中的乱码问题,并提供相关源码和工具的使用技巧。 首先,乱码通常源于字符编码不...

    freemark笔记、语法、讲解大全

    ### FreeMarker 笔记、语法、讲解大全 #### 一、FreeMarker 概述与基本概念 FreeMarker 是一个用 Java 编写的模板引擎,它基于模板来生成文本输出。这些模板可以用来生成任何格式的文件,如 HTML 页面、XML 文档、...

    freemark笔记

    ### Freemarker 笔记知识点详解 #### 一、Freemarker 概述 Freemarker 是一款用 Java 编写的模板引擎,它基于模板来生成文本输出。模板中可以包含静态数据、简单表达式、控制结构(循环/条件语句)、宏等。它常...

    FreeMarker.pdf

    它将视图逻辑从业务逻辑中分离,使得程序员专注于数据处理,而由FreeMarker负责生成和展示视图。FreeMarker不依赖于特定的Web容器,它可以独立于HTTP或Servlet工作,这也意味着它同样适用于非Web环境。 FreeMarker...

Global site tag (gtag.js) - Google Analytics