Freemarker 教程

来源:互联网 发布:linux系统宕机日志 编辑:程序博客网 时间:2024/06/16 01:12

首先啰嗦一下:FreeMarker是一款模板引擎即一种基于模板和要改变的数据, 并用来生成输出文本(网页、HTML等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。说白了,他可以代替jsp用来实现我们的view展示层的一项技术。

这里我说一下采用freemarker生成静态页面!

下面开始我们的代码编写之路:

模拟真实开发场景,因为windows系统和Linux系统的文件夹组成不一样,而且在Linux环境下我们采用nginx进行反向代理和负载均衡,所以,生成出来的HTML文件的存放我们需要配置资源文件 freemarker.windows.properties和freemarker.linux.properties

freemarker.windows.properties

CHARCODE = UTF-8

#模板路径
TEMPLATE_FILE_PATH = /

#模板名称
TEMPLATE_FILE_NAME = template.ftl

#生成的文件后缀名
CREATE_SUFFIX_NAME = .html

#生成的文件存放路径(Windows下)

CREATE_FILE_PATH = E\:\\apache-tomcat-7.0.62\\webapps\\

freemarker.linux.properties

CHARCODE = UTF-8

#模板路径
TEMPLATE_FILE_PATH = /

#模板名称
TEMPLATE_FILE_NAME = template.ftl

#生成的文件后缀名
CREATE_SUFFIX_NAME = .html

#生成的文件存放路径(Linux下)

CREATE_FILE_PATH = 你Linux下存放的静态资源的地址

创建一个工具类,来获取我们本地的系统到底是Windows还是Linux

ConfigUtil

package com.freemarker;

import java.io.IOException;
import java.util.Properties;

public class ConfigUtil {

    private static Properties DEC_PRO = null;
    
    private static String DEC_OS_CONFIG=null;
    
    private static void Dec_Choose_OS_Config(){
        try {
            DEC_PRO=new Properties();//
            
            DEC_PRO = System.getProperties();//

            DEC_OS_CONFIG = DEC_PRO.getProperty("os.name");//
            
            System.out.println("DEC_OS_CONFIG:"+DEC_OS_CONFIG);// Unix ,linux, win
        
            //
            if(DEC_OS_CONFIG.indexOf("Win")>-1){
                System.out.println("windows");
                DEC_PRO.load(ConfigUtil.class.getResourceAsStream("freemarker.windows.properties"));
            }else{
                System.out.println("linux");
                DEC_PRO.load(ConfigUtil.class.getResourceAsStream("freemarker.linux.properties"));
            }
            
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
    public static String Dec_Get_Os(){
        if(DEC_OS_CONFIG==null)
            Dec_Choose_OS_Config();
        return DEC_OS_CONFIG;
    }

    public static String Dec_Get_Resource_By_Key(String key){
        if (DEC_PRO == null)
            Dec_Choose_OS_Config();
        return DEC_PRO.getProperty(key);

    }

   public static void main(String[] args) {
        ConfigUtil.Dec_Choose_OS_Config();
 
        System.out.println(ConfigUtil.Dec_Get_Resource_By_Key("CHARCODE"));
    }
}

下面编写一下freemarker的工具类

FreemarkerUtil

package com.freemarker;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Locale;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;


public class FreemarkerUtil {
    

    Template template = null;

    //关于传入参数类型,可以根据自己业务需要,小伙伴们这是可以考虑重载
    public void createTemplateHtml(Map<String, Object> map) throws IOException, TemplateException {
        //创建freemarker实例
        Configuration freeMarkerCfg = new Configuration();
        //获取模板路径
        freeMarkerCfg.setClassForTemplateLoading(this.getClass(),ConfigUtil.Dec_Get_Resource_By_Key("TEMPLATE_FILE_PATH"));
        //设置编码格式
        freeMarkerCfg.setEncoding(Locale.CHINA,"UTF-8");
        //对象包装器作为插件放入 Configuration 中
        freeMarkerCfg.setObjectWrapper(new DefaultObjectWrapper());
        //获取模板名称
        template = freeMarkerCfg.getTemplate(ConfigUtil.Dec_Get_Resource_By_Key("TEMPLATE_FILE_NAME"));
        //通过系统判断自动为我们区分是Linux环境还是Windows环境,这里☞正式环境和测试环境
        String reqFileName = ConfigUtil
        .Dec_Get_Resource_By_Key("CREATE_FILE_PATH")
        + "这里放一个id" + ConfigUtil
                .Dec_Get_Resource_By_Key("CREATE_SUFFIX_NAME");
        
        OutputStreamWriter writer = new OutputStreamWriter(
                new FileOutputStream(reqFileName),
                "UTF-8");

        template.process(map, writer);

        writer.flush();

    }
}

我有俩实体,用来做测试的,就不网上贴了

TestFreemarker

package com.freemarker.test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.freemarker.FreemarkerUtil;

import freemarker.template.TemplateException;

public class TestFreemarker {

    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<String, Object>();
        FreemarkerUtil freemarker = new FreemarkerUtil();
        /**
         * 比如说我的数据都是从数据库拿出来的
         * 有集合有对象,什么都有,那我就用map咯
         */
        List<User> list = new ArrayList<User>();
        for (int i = 1; i < 5; i++) {
            list.add(new User(i, "第"+i+"笨蛋", "女"));
        }
        map.put("list", list);
        map.put("address", new Address("天安门", "中国"));
        try {
            freemarker.createTemplateHtml(map);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TemplateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

最后还差一个ftl模板

template.ftl

<html lang="zh-CN">
<head>
    <title>第一个freemarker实例</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<!-- freemarker表达式可以参考 http://blog.csdn.net/pengpengpeng85/article/details/52070602 -->
<#setting number_format="0.00">
<body>
    <!-- 这里来个list的遍历 -->
    <#list list as user>
        ${user.id}=========${user.name}=========${user.sex}<br/>
    </#list>
    <p>**************************************突然来了一群星星</p>
    <!-- 这里来个对象取值 -->
    ${address.addressName}------------------>${address.country}
</body>
</html>

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

至此freemarker生成静态页面已经完成,具体小伙伴儿们可以根据公司自己的业务来决定怎么使用

上传一下我的目录

原创粉丝点击