博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
freemarker的使用心得
阅读量:6699 次
发布时间:2019-06-25

本文共 6656 字,大约阅读时间需要 22 分钟。

freemarker的使用心得

时间 2014-11-02 14:08:46
原文 
主题

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(); } }

模板文件的内容如下:

----------------------宏指令的使用 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的文件,内容如下:

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')/>

转载于:https://www.cnblogs.com/shaoke123/p/4775805.html

你可能感兴趣的文章
Nginx的Web管理界面收集
查看>>
Java操作MongoDB
查看>>
分布式系统开发工具包 —— 基于Kryo的Java对象序列化
查看>>
CentOS7安装OpenFire
查看>>
nagios监控服务器的搭建
查看>>
CentOS四种方法自建yum仓库
查看>>
从P560小型机B181201B故障代码识别手把手详解
查看>>
Sql server优化50法
查看>>
使用Server 2008新GPO做驱动器映射
查看>>
Java网络编程从入门到精通(5):使用InetAddress类的getHostName方法获得域名
查看>>
Lync Server外部访问系列PART5:模拟公网DNS
查看>>
运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(一)
查看>>
老是不中,算了算“双色球”和“3D”,全买到底要多少¥¥。。(C 代码)
查看>>
总结面试时没有回答上的内存对齐问题
查看>>
Node.js 使用jQuery取得Nodejs http服务端返回的JSON对象示例
查看>>
百度地图 Android SDK - 个性化地图
查看>>
SharePoint 2013 Nintex Workflow 工作流帮助(六)
查看>>
【原】iOS:手把手教你发布代码到CocoaPods(Trunk方式)
查看>>
使用Cross-Page Postback(跨页面提交)在页面间传递数据
查看>>
To install 64-bit ODBC drivers
查看>>