freemarker使用心得

freemarker使用心得

freemarker目前虽然使用的公司不多,但是在某些时候就必须使用,当需要遍历json数据的时候,目前市面上的好多显示组件都达不到要求唯一能用的也就只有freemarker了。在Java里使用的模板引擎有velocity、freemarker,至于velocity由于比较古老加之功能也不及freemarker那么强大使用的人群已经很少了。这次打算系统性的分享我学习freemarker的心得。

一 第一个freemarker程序

freemarker是一种与web容器无关的技术,应用并不局限于页面。使用java开发出来的模板引擎。因此java中使用freemarker应该算得上是一个比较好的选择了

freemarker的运行原理总结起来就是如下四点:

(1)初始化freemarker配置实例

(2)创建数据模型

(3)加载模板文件

(4)显示生成后的数据

如果要使用freemarker要做的就是把freemarker的jar包放到lib或者构建路径下面就OK了,来看下freemarker目前虽然使用的公司不多,但是在某些时候就必须使用,当需要遍历json数据的时候,目前市面上的好多显示组件都达不到要求唯一能用的也就只有freemarker了。在Java里使用的模板引擎有velocity、freemarker,至于velocity由于比较古老加之功能也不及freemarker那么强大使用的人群已经很少了。这次打算系统性的分享我学习freemarker的心得。

一 第一个freemarker程序

freemarker是一种与web容器无关的技术,应用并不局限于页面。使用java开发出来的模板引擎。因此java中使用freemarker应该算得上是一个比较好的选择了

freemarker的运行原理总结起来就是如下四点:

(1)初始化freemarker配置实例

(2)创建数据模型

(3)加载模板文件

(4)显示生成后的数据

如果要使用freemarker要做的就是把freemarker的jar包放到lib或者构建路径下面就OK了,来看下freemarker目前虽然使用的公司不多,但是在某些时候就必须使用,当需要遍历json数据的时候,目前市面上的好多显示组件都达不到要求唯一能用的也就只有freemarker了。在Java里使用的模板引擎有velocity、freemarker,至于velocity由于比较古老加之功能也不及freemarker那么强大使用的人群已经很少了。这次打算系统性的分享我学习freemarker的心得。

一 第一个freemarker程序

freemarker是一种与web容器无关的技术,应用并不局限于页面。使用java开发出来的模板引擎。因此java中使用freemarker应该算得上是一个比较好的选择了

freemarker的运行原理总结起来就是如下四点:

(1)初始化freemarker配置实例

(2)创建数据模型

(3)加载模板文件

(4)显示生成后的数据

如果要使用freemarker要做的就是把freemarker的jar包放到lib或者构建路径下面就OK了,来看下freemarker目前虽然使用的公司不多,但是在某些时候就必须使用,当需要遍历json数据的时候,目前市面上的好多显示组件都达不到要求唯一能用的也就只有freemarker了。在Java里使用的模板引擎有velocity、freemarker,至于velocity由于比较古老加之功能也不及freemarker那么强大使用的人群已经很少了。这次打算系统性的分享我学习freemarker的心得。

一 第一个freemarker程序

freemarker是一种与web容器无关的技术,应用并不局限于页面。使用java开发出来的模板引擎。因此java中使用freemarker应该算得上是一个比较好的选择了

freemarker的运行原理总结起来就是如下四点:

(1)初始化freemarker配置实例

(2)创建数据模型

(3)加载模板文件

(4)显示生成后的数据

如果要使用freemarker要做的就是把freemarker的jar包放到lib或者构建路径下面就OK了,来看下面这段程序

package org.lxh;

import java.io.*;

import java.util.*;

import freemarker.template.Configuration;

import freemarker.template.Template;

public class FirstFreemarker {

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

//创建freemarker配置实例

Configuration config=new Configuration();

config.setDirectoryForTemplateLoading(new File("template"));

//创建数据模型

Map m=new HashMap();

m.put("name", "cry");

//加载模板文件

Template t=config.getTemplate("index.ftl");

//显示生成后的数据

Writer w=new OutputStreamWriter(System.out);

t.process(m, w);

w.close();

}

}

运行效果如下所示:

二 freemarker进阶

如果觉得freemarker的能力就这么点那就错了,freemarker还包含数据类型、条件判断、数据遍历、内建函数等,这些功能对日常开发已经足够,看下面这段程序

package org.lxh;

import java.io.File;

import java.io.OutputStreamWriter;

import java.io.Writer;

import java.util.ArrayList;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Random;

import freemarker.template.Configuration;

import freemarker.template.Template;

public class UseIf {

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

//创建freemarker配置实例

Configuration config=new Configuration();

config.setDirectoryForTemplateLoading(new File("template"));

//创建数据模型

Map m=new HashMap();

m.put("score", new Random().nextInt(100));

UserInfo u1=new UserInfo();

u1.setName("仓木麻衣");

u1.setPassword("123456");

UserInfo u2=new UserInfo();

u2.setName("柯南");

u2.setPassword("654321");

List all=new ArrayList();

all.add(u2);

all.add(u1);

m.put("userList", all);

m.put("time", new Date());

m.put("str", "北京,上海,杭州");

//加载模板文件

Template t=config.getTemplate("useif.ftl");

//显示生成后的数据

Writer w=new OutputStreamWriter(System.out);

t.process(m, w);

w.close();

}

}

看下模板文件的内容:

--------------if语句的使用----------------

<#if score gte 60>

及格

<#elseif score gte 80&&score lte 90>

良好

<#else>

高材生

--------------空值判断、默认值---------------

${name!"未定义"}

--------------判断值是否存在------------

<#if name??>

name存在

<#else>

name不存在

-------------使用list遍历数据--------------

<#list userList as user>

<#if user_has_next> 最后一组:${user.name}-${user.password}<#else>${user.name}-${user.password}

-------------其他内建函数-----------------

(1)日期格式化

${time?string("yyyy-MM-dd")}

(2)截取字符串

${str?substring(0,2)}

(2)indexof的使用

${str?last_index_of(",")}

(2)split的使用

<#list "12,13,14,15"?split(",") as item>

${item}

对于list的遍历有两个隐含变量用的比较多分别是_index _has_next ,详细的使用可以百度一下,真的很简单

三 freemarker宏指令

宏指令可以简单理解成在freemarker可以自己定义的公共方法,具体用途主要用于分页,来看下面的这个最简单的例子

package org.lxh;

import java.io.File;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.io.Writer;

import java.util.HashMap;

import java.util.Map;

import freemarker.template.Configuration;

import freemarker.template.Template;

public class UseMacro {

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

//创建freemarker配置实例

Configuration config=new Configuration();

config.setDirectoryForTemplateLoading(new File("template"));

//创建数据模型

Map m=new HashMap();

m.put("type", "other");

m.put("num1", 2);

m.put("num2", 3);

//加载模板文件

Template t=config.getTemplate("macro.ftl");

//显示生成后的数据

Writer w=new OutputStreamWriter(System.out);

t.process(m, w);

w.close();

}

}

模板文件的内容如下:

[plain] view plain copy 在CODE上查看代码片派生到我的代码片

----------------------宏指令的使用 m1可以看成是方法的名称,num1、num2为入参----------------------

<#macro m1 num1 num2>

<#assign result=num1+num2>

${result}

<@m1 5 6/>

----------------------宏指令(嵌入式)-----------------

<#macro m2>

<#nested>

<@m2>hello world

运行效果如下:

四 其他指令

包含指令:<#include "test.txt" />

import指令:<#import "b.ftl" as bb />

<#macro copyright date>

Copyright (C) ${date}.

当ftl文件比较多的时候,而且这些ftl有引用关系,这个时候import就可以大展拳脚了,如<@bb.copyright date="2010-2011" /> 五 struts2中使用freemarker

struts2是不能直接使用freemarker的,如果一定要用可以:

(1)解压struts2-core-X.X.X.jar文件,把在META-INF文件夹下面的struts-tags.tld文件复制到WEB-INF文件夹下。 将freemark的jar导入到工程中

(2)在web.xml文件中配置freemark同时启动JSPSupportServlet.代码如下

freemarker

freemarker.ext.servlet.FreemarkerServlet

TemplatePath

/

1

freemarker

*.ftl

JspSupportServlet

org.apache.struts2.views.JspSupportServlet

1

(3).在FreeMarker模板中使用assign指令导入标签库,这样在freemarker中就可以使用struts2的标签了

<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /> 注:这里我把struts-tags.tld放在WEB-INF下面

(4)在FreeMarker模板中使用struts标签

<@s;property value=""/>

注:struts使用freemarker要在result的节点加上type="freemarker"

对于这种做法有些时候不好用,freemarker也提供了在jsp页面使用freemarker的方法,同样的还是需要把freemarker的tld文件放在WEB-INF下面,这个文件如果找不到可以建一个叫fmtag.tld的文件,内容如下:

PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

"http://java.sun.com/j2ee/dtds/web-jsptaglib_1_1.dtd">

2.0

1.1

FreeMarker JSP Support

template

freemarker.ext.jsp.FreemarkerTag

tagdependent

Allows evaluation of FreeMarker templates inside JSP

caching

false

接下来看看在jsp中怎么使用freemarker

(1)jsp页面引入freemarker标签库

<%@ taglib prefix="fm" uri="/WEB-INF/fmtag.tld" %>

(2)嵌入freemarker

freemarker语句

综合前面的情况无论怎么用是不是都很简单呢

六 扩充freemarker内建函数

freemarker虽然提供很多内建函数,但仍然有需要自定义的时候,freemarker也运行用户写自定义函数,如下所示:

public class MyFmTag implements TemplateMethodModel {

public Object exec(List param) throws TemplateModelException {

Object result=null;

if("save".equals(param.get(0).toString())){

//调用保存方法

}

return result;

}

//保存方法................

}

使用的时候就像下面这样就ok了

<#assign check= "org.lxh.util.MyFmTag"?new()/> <#assign result=check('save','xxx')/>

文章转自:http://blog.csdn.net/walkcode/article/details/40707997?utm_source=tuicool&utm_medium=referral

🎎 相关推荐

中国古代乐器《筚篥》
🎯 365bet娱乐app

中国古代乐器《筚篥》

📅 07-02 👀 9371
如何关闭139端口及445端口等危险端口
🎯 365bet娱乐app

如何关闭139端口及445端口等危险端口

📅 06-30 👀 8847
新买的铸铁锅该怎么开锅?做好这些步骤就能把锅养好