Freemarker 学习知识点(二)

Freemarker 学习知识点(二)

###前面简单介绍了一下什么是Freemarker,下面介绍一下为什么使用Freemarker而不使用JSP。 #####FreeMarker的优点:

  • FreeMarker不依赖于Servlet,网络或Web环境。你可以在任意地方任意时间来执行模板,出于这些特点你可以轻松的将它整合到任何系统中去。
  • 在模板中没有servlet特定的范围和其它高级技术。FreeMarker一开始就是为MVC设计的,它仅仅专注于展示。
  • 你可以从任意位置加载模板;从类路径下,从数据库中等。
  • 默认情况下,数字和日期格式是本地化敏感的。因为我们对用户输出,你所做的仅仅是书写${x},而不是<fmt:formatNumber value="${x}" />。你也可以很容易就改变这个行为,默认输出没有本地化的数字。
  • 易于自定义特设的宏和函数,这一点非常有效方便。
  • 隐藏错误并假装它不存在。丢失的变量默认会引起错误,也不会默认给任意值。而且null-s也不会默认视为0/false/空字符串。
  • “对象包装”允许你在模板中以自定义,面向表现的方式来展示对象。
  • 宏和函数仅仅是变量(和JSP的自定义标记工作方式来比较),就像其它任意值一样,所以它们可以很容易的作为参数值来传递,放置到数据模型中等。
  • 当第一次访问一个页面时几乎察觉不到的延迟(或在它改变之后),因为没有更高级的编译发生。 #####FreeMarker的缺点:
  • 不是一个标准。很少的工具和IDE来集成它,少数的开发者知道它,很少的工业化的支持。(然而,如果没有使用.tag文件,JSP标签库在FreeMarker模板中工作不需要改变)
  • 因为宏和函数仅仅是变量,不正确的指令,参数名和丢失的必须变量仅仅在运行时会被检测到。
  • 除了一些视觉上的相似性,它的语法不同于HTML/XML语法规则,这会使得新用户感到混乱。
  • 不能和JSF一起使用。

###Freemarket使用方向 上面是Freemarker的优缺点介绍,那么我们可以把它用在哪些地方呢?

  • WEB网页开发,与Servlet、SpringMVC、Struts2等各种技术整合
  • 邮件通知,一般邮件都支持HTML格式,Freemarker作为模板,JAVA代码提供邮件内容
  • 特定格式打印输出

###如何使用Freemarker 先来一段简单的 Java Application,其实这已经够用了,如果没有特珠要求的话。

import freemarker.template.*;
import java.util.*;
import java.io.*;
public class Test {
	public static void main(String[] args) throws Exception {
		/* 在整个应用的生命周期中,这个工作你应该只做一次。 */
		/* 创建和调整配置。 */
		Configuration cfg = new Configuration(Configuration.VERSION_2_3_21);
		cfg.setDirectoryForTemplateLoading(
			  new File("/where/you/store/templates"));
		cfg.setObjectWrapper(new DefaultObjectWrapper());
		/* 在整个应用的生命周期中,这个工作你可以执行多次 */
		/* 获取或创建模板*/
		Template temp = cfg.getTemplate("test.ftl");
		/* 创建数据模型,供Freemarkerf做模板渲染 */
		Map root = new HashMap();
		root.put("user", "Big Joe");
		Map latest = new HashMap();
		root.put("latestProduct", latest);
		latest.put("url", "products/greenmouse.html");
		latest.put("name", "green mouse");
		/* 将模板和数据模型合并 */
		Writer out = new OutputStreamWriter(System.out);
		temp.process(root, out);
		out.flush();
	}
}

以上这段代码,基本上只需要根据自己的需要,修改数据模型内容,就可以用于学习Freemarker的模板语法规则了。

###Freemarker的指令介绍

  • if,else,elseif指令。 前面已介绍过一些,就是if判断,和正常的JAVA语法一样 <#if ......>...<#elseif .....> <#else>......</#if>

  • switch,case,default,break指令 和JAVA语法一样,但是不推荐使用。

<#switch value>
<#case refValue1>
...
<#break>
<#case refValueN>
...
<#break>
<#default>
...
</#switch>
  • list,break 指令 <#list sequence as item>......</#list> 在list循环中,有两个特殊的循环变量可用: item_index:这是一个包含当前项在循环中的步进索引的数值。 item_has_next:来辨别当前项是否是序列的最后一项的布尔值。

以一个示例来解释更方便,其实在这个例子中,break 是多余的: <#list seq as x> ${x_index} -- ${x}<#if x_has_next>,<#else><#break></#if> </#list>

  • assign 赋值变量指令 <#assign name1=value1 name2=value2 ... nameN=valueN> 或者 <#assign ...... in 命令空间> 或者 <#assign .........>值的内容,可以使用指令但不能插值</#assign> 变量有命名空间的概念,也有全局变量、局部变量、列表变量等概念。 例如: <#assign name1="Hello ${user}" name2="Red" seasons = ["winter", "spring", "summer", "autumn"]>,这样的赋值是可以的。 <#assign name1>Hello ${user}</#assign> 这样是会出错的
<#macro myMacro>foo</#macro>
<#assign x>
<#list 1..3 as n>
${n} <@myMacro />
</#list>
</#assign>
Number of words: ${x?word_list?size}
${x}
这段代码也是可以的,输出内容则是:
Number of words: 6
1 foo
2 foo
3 foo
  • include指令 <#include "path/filename">

  • import 指令<#import path as hash> 这里将include和import指令区别说一下,include是将一个模板文件引入,而该文件中的所有变量和宏都处于主命名空间下了 而import 可以为该模板中的变量分配一个新的命名空间。

  • global 指令 这个指令和assign相似,但是被创建的变量在所有的命名空间中都可见,但又不会存在于任何一个命名空间之中。精确地说,正如你会创建(或替换)一个数据模型变量。因此,这个变量是全局的。

  • local 指令 它和assign指令类似,但是它创建或替换局部变量。这仅仅在宏和方法的内部定义才会有作用。

  • setting 指令 <#setting name=value> 它是用来设置Freemarker的行为的,一共有以下设置

locale:输出的本地化(语言)。它可以影响数字,日期等显示格式。 number_format:当没有指定确定的格式化形式时,用来转化数字到字符串形式的数字格式化设置。可以是下列中的一个预定义值number(默认的),computer,currency,或percent。此外,以Java小数数字格式化语法书写的任意的格式化形式也可以被指定。 date_format,time_format,datetime_format:,当没有指定确定的格式时,用来转换日期到字符串的日期/时间格式形式。 time_zone:时区的名称来显示并格式化时间。默认情况下,使用系统的时区。也可以是Java时区API中的任何值。比如:"GMT","GMT+2","GMT-1:30","CET","PST","America/Los_Angeles"。

例如: [#setting locale="zh_CN"] [#setting date_format="yyyy-MM-dd"] [#assign test1 = "1990-12-11"?date] ${test1?string("dd/MM/yyyy")} 输出为:11/12/1990 它能正确的将String转换为Date,从Date转换为String。

  • stop,flush 退出指令和强制输出指令,一般不会使用,不介绍了
  • ftl指令 ftl 指令与setting有点像,但最重要的一点是,可以修改<#...>变成你自己设置的字符。 如,在首行写上一句[#ftl],那么在接下来的所有指令都是以 [# 指令 ]来执行,而<# 被当作普通文字。

ftl 可以有以下几个参数设置: encoding:设置模板文件编码 strip_whitespace:这将开启/关闭空白剥离。合法的值是布尔值常量true和flase。 strict_syntax:这会开启/关闭“严格的语法”。

  • t,lt,rt 指令 t(整体削减):忽略本行中首和尾的所有空白。 lt(左侧削减):忽略本行中首部所有的空白。 rt(右侧削减):忽略本行中尾部所有的空白。 行首空格包括TAB和空白,以及UNICODE空白,不包括UNICODE的换行符 行尾空格包括TAB、空白和UNICODE空白、换行符,但不包括UNICODE的换行符

-nt 不要削减 -attemp 和 recover 指令 <#attempt> attempt正常执行 <#recover> 仅当attemp执行发生错误时,才执行,不会导致Freemarker中止,但是仍会有错误日志产生。 </#attempt>

  • noparse指令 <#noparse> ...的此中间的任何内容都被当作文本处理 </#noparse>

  • compress指令 <#compress> ...压缩,移除多余的空行 </#compress>

  • escape,noescape指令 这个文字比较难以描述,来看看 <#escape identifier as expression> ... <#noescape>...</#noescape> ... </#escape> 例如: <#escape x as x?html> First name: ${firstName} Last name: ${lastName} Maiden name: ${maidenName} noescape=<#noescape>${maidenName}</#noescape> </#escape>

事实上它等同于: First name: ${firstName?html} Last name: ${lastName?html} Maiden name: ${maidenName?html} noescape=${maidenName}

  • visit,recurse,fallback 指令 visit和recurse指令是用来递归处理树的。在实践中,这通常被用来处理XML。 应该不会使用这么高级的功能吧,基本上JAVA里可以处理完后再给FREEMARKER处理

转载于:https://my.oschina.net/33876402/blog/830037

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值