freemarker的使用心得

时间:2022-09-18 17:02:14

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<String,String> m=new HashMap<String,String>();
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的能力就这么点那就错了,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<String,Object> m=new HashMap<String,Object>();
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<UserInfo> all=new ArrayList<UserInfo>();
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>
高材生
</#if>
--------------空值推断、默认值---------------
${name!"没有定义"}
--------------推断值是否存在------------
<#if name?? >
name存在
<#else>
name不存在
</#if>
-------------使用list遍历数据--------------
<#list userList as user>
<#if user_has_next> 最后一组:${user.name}-${user.password}<#else>${user.name}-${user.password}</#if>
</#list>
-------------其它内建函数-----------------
(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>

对于list的遍历有两个隐含变量用的比較多各自是_index  _has_next  ,具体的使用能够百度一下,真的非常easy

三 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<String,Object> m=new HashMap<String,Object>();
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>
<h3>${result}</h3>
</#macro>
<@m1 5 6/>
----------------------宏指令(嵌入式)-----------------
<#macro m2>
<h3><#nested></h3>
</#macro>
<@m2>hello world</@m2>

执行效果例如以下:

freemarker的使用心得

四  其它指令

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

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

<#macro copyright date>
<p>Copyright (C) ${date}.</p>
</#macro>

当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导入到project中

(2)在web.xml文件里配置freemark同一时候启动JSPSupportServlet.代码例如以下

<servlet>
        <servlet-name>freemarker</servlet-name>
        <servlet-class>
            freemarker.ext.servlet.FreemarkerServlet
        </servlet-class>
        <!--以下的配置freemarke的ftl文件的位置 -->
        <init-param>
            <param-name>TemplatePath</param-name>
            <param-value>/</param-value>
        </init-param>
        <!-- 是否和server(tommcat)一起启动。-->
        <load-on-startup>1</load-on-startup>
    </servlet>     <servlet-mapping>
        <servlet-name>freemarker</servlet-name>
        <url-pattern>*.ftl</url-pattern>
    </servlet-mapping> <servlet>
  <!-- define a JspSupportServlet Object -->
  <servlet-name>JspSupportServlet</servlet-name>
  <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
  <!-- setting JspSupportServlet auto start -->
  <load-on-startup>1</load-on-startup>
 </servlet>

(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的文件,内容例如以下:

<?

xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglib_1_1.dtd"> <taglib> <tlibversion>2.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>FreeMarker JSP Support</shortname> <tag>
<name>template</name>
<tagclass>freemarker.ext.jsp.FreemarkerTag</tagclass>
<bodycontent>tagdependent</bodycontent>
<info>Allows evaluation of FreeMarker templates inside JSP</info>
<attribute>
<name>caching</name>
<required>false</required>
</attribute>
</tag>
</taglib>

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

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

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

(2)嵌入freemarker

 <fm:template>
freemarker语句
</fm:template>

综合前面的情况不管怎么用是不是都非常easy呢

六  扩充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')/>

freemarker的使用心得的更多相关文章

  1. FreeMarker的基础语法使用 &amp&semi;&amp&semi; 心得和技巧

    FreeMarker语言 FreeMarker语言概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写. FreeMarker被设计用来生成HTML Web ...

  2. Android 数据库ORM框架GreenDao学习心得及使用总结&lt&semi;一&gt&semi;

    转: http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读 ...

  3. 【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结

    转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁 ...

  4. Spring mvc整合freemarker详解

    1.什么是FreeMarker FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式 ...

  5. Freemarker入门小案例(生成静态网页的其中一种方式)

    其实生成静态网页的方式有好多种,我昨天看了一下,Freemarker是其中一种,但是Freemarker现在我们都用得比较少了,现在用得ActiveMQ用来发送信息到静态页面,不过想了一下这个小东西, ...

  6. jeecg使用心得

    接触到jeecg框架是在去年,接触到了jeecg开源框架,此框架为企业级急速开发框架,不了解的可以百度下这类框架的,对于目前状态来说,此框架确实也满足了所需,此刻就开始接触jeecg框架,去年六七月份 ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. NoSql数据库使用半年后在设计上面的一些心得

    NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 这个疑惑非常大,为此我看了很多分析文章, ...

  9. spring源码分析之freemarker整合

    FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一款程 ...

随机推荐

  1. Centos压缩与打包

    这个虽然是基础知识,但是有些东西就是这样,久了没用,就会忘记,而且之前有一个坏习惯就是不喜欢做笔记,以后学习了行东西一定要记录在博客,这样以后自己也能时不时的查看一下. 言归正传,在计算机的世界中,数 ...

  2. jsp中利用response&period;senddirect&lpar;str&rpar;重定向,传递参数新思路

    用Servlet进行请求重定向,参数传递好办,直接用request.setAttribute(str1,str2); 但是如果不用Servlet 而是直接用jsp进行转发呢? 我们首先要知道   请求 ...

  3. 在Linux运行期间升级Linux系统(Uboot&plus;kernel&plus;Rootfs)

    版本:v1.2   Crifan Li 摘要 本文主要介绍了如何在嵌入式Linux系统运行的时候,进行升级整个Linux系统,包括uboot,kernel和rootfs.以及简介Linux中的已有的通 ...

  4. android中利用实现二级联动的效果

    按照惯例,首先上一张效果图. 本篇文章实现的效果就是如图中所圈的那样,实现类似于HTML中的二级联动的效果. 对于第一个选项我们读取的是本地xml文件来填充数据的, 对于第二个选项我们读取的是通过* ...

  5. Java实战之01Struts2-04拦截器、上传下载、OGNL表达式

    十二.Struts2中的拦截器 1.拦截器的重要性 Struts2中的很多功能都是由拦截器完成的.比如:servletConfig,staticParam,params,modelDriven等等. ...

  6. 下载文件 ,调用系统的方法&lpar;UIDocumentInteractionController&rpar; 查看

  7. swift button一些简单设置

    1,按钮的创建(1)按钮有下面四种类型: UIButtonType.ContactAdd:前面带“+”图标按钮,默认文字颜色为蓝色,有触摸时的高亮效果 UIButtonType.DetailDiscl ...

  8. Spring Security入门(3-4)Spring Security 异常处理、异常传递和异常获取

  9. &lbrack;BZOJ4011&rsqb;&lbrack;HNOI2015&rsqb; 落忆枫音&lpar;学习笔记&rpar; - 拓扑&plus;DP

    其实就是贴一下防止自己忘了,毕竟看了题解才做出来 Orz PoPoQQQ 原文链接 Description 背景太长了 给定一个DAG,和一对点(x, y), 在DAG中由x到y连一条有向边,求生成树 ...

  10. PHP基础(命名错误)错误导致的500

    记得去年七月份参与一个项目发生的一个低级错误 因为不小心在命名一个方法时使用了一list做为名称,因此在后面无明业火被点燃. 发现一个500,无论如何调整总是500,数据库,文件,url都正确,但就是 ...