zoukankan      html  css  js  c++  java
  • 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了,来看以下这段程序

    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还包括数据类型、条件推断、数据遍历、内建函数等。这些功能对日常开发已经足够。看以下这段程序

    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>

    执行效果例如以下:



    四  其它指令

    包括指令:<#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目录下。   freemarkjar导入到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')/>



  • 相关阅读:
    搭建个人Spring-Initializr服务器
    “不蒜子”统计总访问人数脚本
    基于Hazelcast及Kafka实现的分布式锁与集群负载均衡
    虚拟机部署hadoop集群
    程序员、黑客及开发者之间的区别
    今日校园自动登录教程
    逆向DES算法
    来自穷逼对HttpCanary的蹂躏
    今日校园提交签到和查寝-Java实现
    JS 判断数据类型方法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5247229.html
Copyright © 2011-2022 走看看