FreeMarker功能详解(参考仅供)

  • 格式:doc
  • 大小:107.00 KB
  • 文档页数:8

参考-材料 1 FreeMarker模版语言讲解

1. FreeMarker的简单介绍。

FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。FreeMarker我们的第一印象是用来替代JSP的,但是与JSP 不同的是FreeMarker 模板可以在 Servlet容器之外使用。可以使用它们来生成电子邮件、 配置文件、 XML 映射等。或者直接生成HTML。

虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)

2. FreeMarker 入门。

支持的数据类型:字符串、数字、布尔、日期

容器:JSON、集合(数组)

2.1. View(FreeMarker)渲染的全过程。

参考-材料 2

2.2. 第一个简单的FreeMarker 尝试。

Java代码:

public class FreemarkerDemo {

public static void main(String[] args) throws Exception {

//构建Freemarker 配置对象

Configuration cfg = new Configuration();

//设置模版根目录

cfg.setDirectoryForTemplateLoading(new File("WebRoot/WEB-INF/ftl"));

//输出,以方式输出

Map outMap = new HashMap();

outMap.put("name", "Vinux");

//加载模板(Freemarker)文件

Template template = cfg.getTemplate("demo_1.ftl","UTF-8");

参考-材料 3

//显示生成的数据,//将合并后的数据打印到控制台

Writer out = new OutputStreamWriter(System.out);

template.process(outMap, out);

out.flush();

}

}

FreeMarker代码

2.2.第一个简单的FreeMarker 尝试。

Hello:${name}

2.3. 第二个简单的FreeMarker 尝试,Servlet Web方式展现。

//创建一个Servlet

public class CDNForFreeMarkerServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

public void service(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//获取根目录

String appPath = request.getSession().getServletContext().getRealPath("/");

//构建Freemarker 配置对象

Configuration cfg = new Configuration();

//设置模版根目录

cfg.setDirectoryForTemplateLoading(new File(appPath));

cfg.setDefaultEncoding("UTF-8");

//输出,以方式输出

Map outMap = new HashMap();

outMap.put("name", "Vinux");

//加载模板文件

Template template = cfg.getTemplate("demo1.ftl","UTF-8");

try {

//输出页面

template.process(outMap, response.getWriter());

} catch (TemplateException e) {

e.printStackTrace();

}

}

}

参考-材料 4 FreeMarker代码

2.3.第二个简单的FreeMarker 尝试,Servlet Web方式展现。

2.3.第二个简单的FreeMarker 尝试,Servlet Web方式展现。

你好:${name}

3. FreeMarker 语法介绍。

Freemarker 基本语法是EL表达式,写法和在JSP里写法一致${},自身的语法是以<#tag>...方式,也可以[#tag]方式。以“?”作为自身方法调用,以“.”作为属性调用,下面我们来全面的介绍下。

3.1. FreeMarker注释。

每个View层都是有自己的注释方式,这个地方提到的注释不同于HTML的注释方式。HTML注释方式在页面查看源码是看的到的。而FreeMarker ,JSP等模版语言的注释都是查看页面源码看不见的。其实建议我们在写代码的时候采用各种模版自身的注释方式来写注释,这样可以达到业务安全的效果。

<%--JSP注释--%>

<#--FreeMarker 注释-->

3.2. 自带空字符串(对象)处理。

从JSP等其他View层使用过的童鞋们,在使用FreeMarker的时候,都会遇到一个问题,当一个值或者对象为null的时候,如果这个时候去使用就会抛出异常。这个问题上仁者见仁智者见智,谈不上好与不好。FreeMarker自带空的处理方式。

<#--默认值-->

v:${v?default('这是一个null对象')} <#--null 默认值-->

参考-材料 5 v1:${v1}<#--"null" -->

v2:${v2}<#--"" -->

3.3. If...else 语法

FreeMarker中,如果去比较2个值是否相等,那么它必须值相等,并且类型也一致,支持比较的类型有,number(Integer、int、long、Long、double)等数据类型,String,Date。

FreeMarker condition表达式比较的是类型和值,类型不一样就会报错,而JSP中则不用,这是个区别。

<#-- condition 比较的是类型 & 值 -->

<#if a == 1>

这个值是:1

<#elseif a == 2>

这个值是:2

<#else>

这个值是:不知道

<#-- 类型不一致比较会报错。

(FreeMarker template error: Can't compare values of these types. Allowed

comparisons are between two numbers, two strings, two dates,)-->

<#if a?string == "3">

这个值是:3

3.4. List 语法

FreeMarker中循环(迭代)的写法和JSP用法一致。格式为<#list list as i>,这个i表示从这个集合中,第一个元素到最后一个元素的迭代表示。

我们的域名有${domains?size}个:

<#list domains as it>

${it_index}:${it}

<#assign str>篮球,足球,乒乓球,双色球

<#list str?split(',') as it>

${it_index}:${it}

参考-材料 6 3.5. Include 语法

<#--引入FTL,-->

<#include "index.ftl"/>

<#--引入html-->

<#include "index.html"/>

3.6. Assign 语法

<#--对应到JSTL中的 set是一样的 -->

<#assign str>篮球,足球,乒乓球,双色球

<#list str?split(',') as it>

${it_index}:${it}

<#assign index>${it_index}

<#--变量定义好后,没有局域、全局之分,当前页面都可以使用。-->

最后输出的一个值:${index}

3.7. 类型转换,内置函数使用

定义变量:

<#assign v1>1

<#assign v2>2

<#assign v3=true,v4=" value 1 value ",html="",v5=-1.56/>

<#assign json>{"a":"b"}

-----------

${(v1?number == 1)?string('类型转换成功','类型转换失败')}

${(v2?number?is_number)?string('v2是number类型','v2不是number类型')}

${(v3?is_boolean)?string('v3是Boolean类型','v3不是Boolean类型')}

${v4}

内置函数使用:

-----------

html:以html方式输出。 :${html?html}

cap_first:首个字母大写 :${v4?cap_first}

lower_case:小写 :${v4?lower_case}

upper_case:大写 :${v4?upper_case}

trim:去掉前后空格 :${v4?trim}

size:集合的长度 :${v4?split('1')?size}

int:返回number类型的整数:${-v5?int}