java使用freemarker生成静态html页面,基于中文API(简单版)

java使用freemarker生成静态html页面,基于中文API(简单版)


前言:因为工作需要用到,所以临时才简单的学了下freemarker,发现和 JSP页面一样简单。主要是类似JSP中使用JSTL标签一样。freemarker也有属于它的标签。

freemarker也是有很多要学的,但是我学的只是足够用工作的,没那么深入,所以是比较简单的,如同“hello world”例子。


下面的程序,会基于 中文API 来说的,如果有更好的代码或实现方法,请再评论留言,一起讨论学习。


freemarker中文API地址: http://t.bdtool.net/freemarker/pgui.html


上代码,亲测可用。



FreemarkerUtil.java

package com.testExample.freemarker;


import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.FileTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * freemarker 工具类
 *
 */
public class FreemarkerUtil {
	
	//单例,为什么用单例,详情看  图1
    private static final Configuration cfg;            //模版配置对象
    
    //初始化FreeMarker配置,详情看  图1
    static {
        //创建一个Configuration实例,建议带参,
    	//不带参的构造方法被标明为过期了,这里我用的是  freemarker-2.3.23.jar
    	//可以从  maven repository 官网下载  jar 包 ,不会下载请拉最后
    	cfg = new Configuration(Configuration.VERSION_2_3_23);
    	
    	//设置FreeMarker的模版文件夹位置,只到文件夹,不带文件,
    	//如:C:/freemarker_ftl/xxx.ftl  那么只需要 C:/freemarker_ftl
    	try {
    		
    		//三者选一,另外两个注释
    		one_dir1();//一个文件夹路径
    		one_dir2();//一个文件夹路径
			more_dir();//多个文件夹路径
    		
		} catch (IOException e) {
			e.printStackTrace();
		}
    	
    	// 设置默认编码
    	cfg.setDefaultEncoding("utf-8");
    	
    	//错误控制器,控制异常,详情看图4
    	//RETHROW_HANDLER :错误信息会输出到控制台
    	//HTML_DEBUG_HANDLER : 错误信息会输出到你要生成的html页面,详情看图4_1
    	cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
    	//cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
    }
    
    //所有模板都在一个文件夹路径,详情看 图1 或 图2
	private static void one_dir1() throws IOException {
		cfg.setDirectoryForTemplateLoading(new File("C:/freemarker_ftl"));
	}
	
	//所有模板都在一个文件夹路径,详情看 图2
	private static void one_dir2() throws IOException {
		//ftl模板文件统一放至 com.testExample.freemarker.template 包下面
		cfg.setClassForTemplateLoading(FreemarkerUtil.class,"/com/testExample/freemarker/template/");
	}
	
	// 所有模板分别在多个文件夹路径,详情看 图3
	private static void more_dir() throws IOException {
		//建议,就算不同文件夹,但是模板文件名也不能相同,详情看 图3
		FileTemplateLoader ftl1 = new FileTemplateLoader(new File("C:/freemarker_ftl"));
		FileTemplateLoader ftl2 = new FileTemplateLoader(new File("E:/freemarker_ftl"));
		ClassTemplateLoader ctl = new ClassTemplateLoader(FreemarkerUtil.class, "/com/testExample/freemarker/template/");
		TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2, ctl };
		MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);

		cfg.setTemplateLoader(mtl);
	}


	private void process(String templateName, String targetFileName, Map root) throws Exception {
        Writer out = null;
        try{
            File file = new File(targetFileName);
            if(!file.exists()) {
                file.createNewFile();
                //因为是生成到 Linux 上,需要设置权限,自己写的
                file.setExecutable(true, false);//设置可执行权限,第二个参数默认为true(表示root权限才可以执行该文件,false为所有人都可以)
                file.setReadable(true, false);//设置可读权限,第二个参数默认为true(同上)
                file.setWritable(true);//设置可写权限,第二个参数默认为true(这里可以省略不写)
            }

            //创建模版对象,详情看 图5
            Template t = cfg.getTemplate(templateName);
            
            //设置输出流,详情看 图6
            //out = new OutputStreamWriter(System.out); //-> 输出到控制台
            out = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");//设置编码  UTF-8
            
            //在模版上执行插值操作,并输出到制定的输出流中,详情看 图5
            t.process(root, out);//root 是模板ftl中的变量的值
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != out) {
                try {
                	out.flush();
                	out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
    
    /**
     * 从模板生成静态html页面
     * @param templateName      模板文件名
     * @param targetFileName    目标文件名,即 html 的文件名,包含路径,绝对路径
     * @param root     模板里面变量的值
     */
    public static void generatorHtmlFromTemplate(String templateName, String targetFileName, Map root) {
    	FreemarkerUtil hf = new FreemarkerUtil();
        try {
            hf.process(templateName, targetFileName, root);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
    	Map root = new HashMap<>();
    	root.put("username", "美女");
    	root.put("age", 18);
    	root.put("sex", "男");
    	
    	FreemarkerUtil.generatorHtmlFromTemplate("test.ftl", "E:/abc.html", root);
    }
}


test.ftl

Hello world! 
name : ${username}
age : ${age}
sex : ${sex}


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

 图1 http://t.bdtool.net/freemarker/pgui_quickstart_createconfiguration.html

java使用freemarker生成静态html页面,基于中文API(简单版)_第1张图片

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

 图2 http://t.bdtool.net/freemarker/pgui_config_templateloading.html

java使用freemarker生成静态html页面,基于中文API(简单版)_第2张图片

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

图3 同图2链接

java使用freemarker生成静态html页面,基于中文API(简单版)_第3张图片

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

图4 http://t.bdtool.net/freemarker/pgui_config_errorhandling.html

java使用freemarker生成静态html页面,基于中文API(简单版)_第4张图片

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

图4_1

java使用freemarker生成静态html页面,基于中文API(简单版)_第5张图片


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

图5 http://t.bdtool.net/freemarker/pgui_quickstart_gettemplate.html

java使用freemarker生成静态html页面,基于中文API(简单版)_第6张图片


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

图6 http://t.bdtool.net/freemarker/pgui_quickstart_merge.html
java使用freemarker生成静态html页面,基于中文API(简单版)_第7张图片

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

如果不懂如何从maven上下载jar包,请看我的另一篇博客:

链接:如何从 maven repository 下载 jar 包

你可能感兴趣的:(freemarker)