文档章节

Freemarker 学习知识点(二)

不能讲的秘密
 不能讲的秘密
发布于 2017/01/24 15:57
字数 2114
阅读 17
收藏 0

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处理

© 著作权归作者所有

不能讲的秘密
粉丝 1
博文 21
码字总数 11075
作品 0
杭州
私信 提问
FreeMarker在eclipse中的入门例子

刚接触FreeMarker时,只是简单的了解FreeMarker的一些概念及工作原理,至于如何使用FreeMarker还不是非常清楚。随着学习的深入,才渐渐对FreeMarker有了更深入的理解。本文将从基础应用着手,...

oecp
2011/05/16
650
0
FreeMarker在eclipse中的入门例子

今天海浪为大家分享一个FreeMarker在eclipse中的入门例子。 一、在eclipse中创建FreeMarker模板 在FreeMarker中模板的概念就是:包含一些由${…}包围的特殊代码的文件。这些特殊代码是FreeM...

oecp
2011/04/26
922
0
重写了JFinal的demo,加入了实际项目应用的封装

刚刚结束一个网站的开发(http://www.cnkuke.com)把项目中常用的freemarker宏和一些封装类分享给大家,希望能帮助初次使用JFinal做项目的同学少走弯路。 封装如下: 一、freemarker封装 分页...

axhack
2013/08/01
2.7K
15
freemaker开发学习《一》

 FreeMarker是一个非常优秀的模板引擎,这个模板引擎可用于任何场景,FreeMarker负责将数据模型中的数据合并到模板中,从而生成标准输出.FreeMarker可以提供昜好的团队协作,对于界面开发人...

xiaml
2014/04/25
297
0
求教!对freemaker的一些不解之处、、、

本人初学freemarker,了解freemarker的基本语法,但也只知道freemarker是用来生成静态页面的模板技术。最近做了一个小例子学习了一下freemarker,效果是看到了,但还是有很多不明白的地方: ...

liujiduo
2013/06/16
730
3

没有更多内容

加载失败,请刷新页面

加载更多

总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
32分钟前
3
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
35分钟前
3
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0
JAVA 利用时间戳来判断TOKEN是否过期

import java.time.Instant;import java.time.LocalDateTime;import java.time.ZoneId;import java.time.ZoneOffset;import java.time.format.DateTimeFormatter;/** * @descri......

huangkejie
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部