freemarker

来源:互联网 发布:网上挣钱的软件 编辑:程序博客网 时间:2024/06/08 16:01

什么是FreeMakrer

模板引擎技术
FreeMakrer是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,具有以下特点:
(1)FreeMakrer适合被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。
(2)虽然FreeMakrer具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMakrer生成页面,通过模板显示准备的数据 。
(3)FreeMakrer不是一个Web应用框架,而适合作为Web应用框架一个组件。
(4)FreeMakrer与容器无关,因为它并不知道HTTP或Servlet。
(5)Freemarker 更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库。
(6)Freemarker 是免费的 。
数据模型+模板=输出

FreeMakrer的下载

<font color=#847oFF>jar 包:可在www.freemarker.org下载 ,或者取maven.aliyun.com下载</font>插件:可在www.freemarker.org下载或者百度插件放入eclipse中plugins目录下即可

FreeMakrer的基本语法

1、FreeMarker标记
***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, elseif2) switch, case, default, break3) list, break4) include5) Import6) assign7) macro, nested, return if, else, elseif

例子

public class TestFreeMarker {        public static void main(String[] args) throws IOException, TemplateException {            Configuration cfg = new Configuration();            //配置ftl查找目录            cfg.setDirectoryForTemplateLoading(            new File("template"));            //设置数据的抓取模式            cfg.setObjectWrapper(new DefaultObjectWrapper());            Map latest = new HashMap();            //构建数据            latest.put("url", "products/greenmouse.html");            latest.put("name", "green mouse");              // 创建一个hashMap            Map root = new HashMap();            // 存入值            root.put("user", "Big Joe");            root.put("latestProduct", latest);            root.put("sex", "1");            //数组list break 循环            String[] str=new String[]{"1","2","3","4","5"};            root.put("arr",str);            List list=new ArrayList();            User user=new User();            user.setId("1");            user.setName("张三");            list.add(user);            User user1=new User();            user1.setId("2");            user1.setName("李四");            list.add(user1);            root.put("userList", list);            //找到模板对象 实例模板对象             Template temp = cfg.getTemplate("hello.ftl");            //文件输出流            FileOutputStream fos=new FileOutputStream("E:\\html\\hello.html");            //输出到目标生成html            Writer out = new OutputStreamWriter(fos);            temp.process(root, out);            out.flush();          }}
public class User {    private String id;    private String name;    public User(){    }    public User(String id, String name) {        super();        this.id = id;        this.name = name;    }    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

freeemarker模板语法
freemarker的模板 ftl为后缀 语法类似于jsp的标签
添加 hellworld.ftl

<!-- 定义模板-->    <html><head>  <title>Welcome!</title></head><body>  <h1>Welcome ${user}!</h1>  <p>Our latest product:  <a href="${latestProduct.url}">${latestProduct.name}</a>!<br/><#--  if标记 键=  --> 我的性别是:  <br/>  <#if sex = '1'><br/>  <#else><br/>  </#if>  <#--   list循环标记   数据或集合   as 临时变量   临时变量_index   获取当前的索引从0开始     break 标记用于退出循环  --> 输出数组结果: <br/>  <#list arr as tmp>    <#if tmp_index=2>        <#break>    </#if>    <#if (tmp_index+1)%2==0>        <font color=green size=10>${tmp}--->${tmp_index+1}</font> <br/>        <#else>         <font color=red size=10>${tmp}--->${tmp_index+1}</font> <br/>    </#if>  </#list>  输出list结果: <br/>  <#list userList as userTmp>    ${userTmp.id}---->${userTmp.name} <br/>  </#list>   <br/></body></html>  

freemarker内置的处理函数(http://freemarker.org/docs/ref_builtins.html)
函数调用 语法为 (){‘ aaa ’?trim}

以下是字符串串函数的用法:

<#--FTL内置的处理函数--><#assign str='   hello my name is zhang    '><#assign str1='HELLO WORLD'><#--获取长度-->${str?length}<#--取空格-->--${str?trim}--<#--转小写-->${str1?lower_case}<#--转大写-->${str?upper_case}<#--获得序列中元素的数目-->${userList?size}<#--取得数字的整数部分-->${1.6?int}${userList?size}<#--精度为3位-->${1.656464513546313574652?float}<#--判断变量是否存在--><#if  aaa?exists>${aaa}</#if>

定义变量:
<#assign age=12>
javaee环境下 使用freemarkerservlet寻找ftl文件并输出

添加一个servlet 映射路径 /t web.xml添加:

<servlet>      <description></description>      <display-name>TestServlet</display-name>      <servlet-name>TestServlet</servlet-name>      <servlet-class>webtest.TestServlet</servlet-class>    </servlet>    <servlet-mapping>      <servlet-name>TestServlet</servlet-name>      <url-pattern>/TestServlet</url-pattern>    </servlet-mapping> 

配置freemarkerservlet 在web.xml添加

 <servlet>  <servlet-name>freemarker</servlet-name>  <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>  <!--模板的查找路径 从上下文根路径查找模板ftl文件 -->  <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>  <!--定时刷新模板-->  <init-param>    <param-name>template_update_delay</param-name>    <param-value>0</param-value>   </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>