Freemarker模板引擎技术

Freemarker模板引擎

1:技术概述

1.1模板引擎技术

Freemarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,具有以下特点:

1Freemarker 适合被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。

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

3Freemarker 不是一个Web应用框架,而适合作为Web应用框架一个组件。

4Freemarker 与容器无关,因为它并不知道HTTPServlet

5Freemarker 更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库。

6Freemarker 是免费的 。

下载地址:

https://sourceforge.net/projects/freemarker-ide/files/freemarker-ide/

 下载freemarker-ide-0.9.14.zip (909.6 kB)

 

2:为什么要使用freemarker

在互联网软件内容网站中 一般首页的访问量大,为了提供首页的访问效率,一般 首页的内容以及其中的新闻等信息都可以实现html静态化 浏览器访问时 设置浏览器的缓存策略和生成静态页面的周期一致 可以使访问效率大大提升 同时配合cdn处理图片 js css等资源 可以在首页访问时 理论完全脱离数据库  降低应用压力

2Freemarker安装

freemarkerjar加入项目,下载freemarker的插件,找到它的plugins目录,将该目录下的文件拷贝到eclipseplugins目录下,重启eclipse,新建个ftl文件,该文件中的内容显示为不同的颜色,可以视为插件安装成功。

例:

 Freemarker模板引擎技术

 

3:基本语法

1FreeMarker标记

FreeMarker标记的设计非常精炼,只有三种:

1) $ : ${expression} FreeMarker会在输出时用实际值进行替代

       例如:${stockNum?default(‘’)}

2) # :标准的FTL标记。大部分FreeMarker指令都以#开始,可以明显地与html标记区分,

<#if user = "BigJoe">our beloved leader</#if>

同时,FTL文件的注释包含在<#---->(而不是<!---->)之间  

3) @作为用户定义指令使用宏变量时,使用@替代FTL标记中的#。后面将详细介绍宏

2:标准的FTL标记指令

 

1) if, else, elseif语法

<#if 条件1>内容或逻辑

<#elseif 条件2>内容或逻辑

<#elseif 条件3>内容或逻辑

<#else>内容或逻辑

 </#if>

2) switch, case, default, break

3) list, break语法(循环)

<#list 集合或数组 as 临时变量>

    <#if item="spring"><#break></#if>...

</#list>

关键字:临时变量_index:list当前值的下标

临时变量_has_next:判断list是否还有值

4) include语法(包含)

<#include “filename”>

or<#include “filename” options>

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

需要注意的是,没有结束标签。

5) Importinclude

如果在两个模板中都分别存在变量名相同的变量,include会包含进来,当同时使用这两个变量时,后一个变量会覆盖前一个变量的值,为了防止,可以使用import进行导入,

Import的使用方式:

<#import  “模板路径” as 别名>

通过别名可以获取模板中的变量值,可以防止变量覆盖

6) assign生成变量,并且给变量赋值

常见的语法形式:

<#assign name=value>

Or

<#assign name1=value1 name2=value2 ...nameN=valueN>

Or

<#assign name> capture this</#assign>

Or

<#assign name in namespacehash>

    capture this

</#assign>

需要注意的是,如果<#assign></#assign>之间没有内容,则jvm会报错,所以,当它们之间没有内容时,去掉</#assign>

7) macro, nested, return

macro,宏指令(特有的),可以理解为java中的方法

定义如下:mymacro是宏的别名,p1 p2是参数,中间是逻辑

调用<@宏名 参数1 参数2>

例:Freemarker模板引擎技术

<#macro mymacro p1 p2>

输出的结果是 ${p1+p2}

</#macro> 

<@mymacro p1=10 p2=200/>

Nested:代替调用宏指令时标签对之间包裹的内容,使用如下

 

4:在javase中的使用:

例:

public static void main(String[] args) throws IOException, TemplateException {

Configuration cfg = new Configuration();

//配置ftl查找目录

cfg.setDirectoryForTemplateLoading(

        new File("template"));

//设置数据的抓取模式

cfg.setObjectWrapper(new DefaultObjectWrapper());

//构建数据

Map root = new HashMap();

root.put("user", "Big Joe");

Map latest = new HashMap();

latest.put("url", "products/greenmouse.html");

latest.put("name", "green mouse");  

root.put("latestProduct", latest);

root.put("sex", "1");

//添加个数组

String[] str=new String[]{"1","2","3","4"};

root.put("array", str);

//添加个对象

List list=new ArrayList<>();

User user=new User();

user.setId("1");

user.setName("zs");

list.add(user);

User user1=new User();

user1.setId("1");

user1.setName("zs");

list.add(user1);

root.put("list", list);

//实例化模板对象

Template temp = cfg.getTemplate("helloFreeMark.ftl");

//生成html,输出到目标

FileOutputStream fos=new FileOutputStream("E:\\框架\\freemarker框架\\html\\freemark.html");

Writer out = new OutputStreamWriter(fos);

//Writer out = new OutputStreamWriter(System.out);

temp.process(root, out);

out.flush();  

}

在ftl文件中的应用,例:

<html>

<head>

  <title>Welcome!</title>

</head>

<body>

  <h1>Welcome ${user}!</h1>

  <p>Our latest product:

  <a href="${latestProduct.url}">${latestProduct.name}</a>!

  <#--FTL中的if else指令的用法 --> 

  性别为

  <#if sex="1">

   <#else>

  </#if>

  <#--FTL中的循环 -->

  用户信息为

  <#list list as tem>

   ${tem.id}-----${tem.name}

  </#list>

 <#list array as arrTmp>

    <#if arrTmp_index%2==0>

   <font color=green>${arrTmp}__${arrTmp_index}</font>

<#else>

<font color=red>${arrTmp}__${arrTmp_index}</font>

    </#if>

  </#list>

</body>

</html>  

5:在javaee中的举例:

javase差不多,只是需要在web.xml中配置一些格式:

例:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

  <display-name>freemarker_web</display-name>

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.jsp</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.jsp</welcome-file>

  </welcome-file-list>

  

<servlet>

  <servlet-name>freemarker</servlet-name>

  <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>

    

  <!-- 模板的查找路径 -->

  <init-param>

    <param-name>TemplatePath</param-name>

    <param-value>/</param-value>

  </init-param>

  <!--是否需要缓存-->

  <init-param>

    <param-name>NoCache</param-name>

    <param-value>true</param-value>

  </init-param>

  <!--最终显示是html格式-->

  <init-param>

    <param-name>ContentType</param-name>

    <param-value>text/html;charset=UTF-8</param-value>

  </init-param>

    

  <!-- FreeMarker settings: -->

  <init-param>

    <param-name>template_update_delay</param-name>

    <param-value>0</param-value> <!-- 0 is for development only! Use higher value otherwise. -->

  </init-param>

  <!--编码格式-->

  <init-param>

    <param-name>default_encoding</param-name>

    <param-value>UTF-8</param-value>

  </init-param>

  <!--数字格式-->

  <init-param>

    <param-name>number_format</param-name>

    <param-value>0.##</param-value>

  </init-param>

<!--SERVLET 容器启动时实例化-->

  <load-on-startup>1</load-on-startup>

</servlet>

 

<servlet-mapping>

  <servlet-name>freemarker</servlet-name>

  <url-pattern>*.ftl</url-pattern>

</servlet-mapping>

</web-app>