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

来源:互联网 发布:方正数据库 编辑:程序博客网 时间:2024/05/20 21:47

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 或 图2private static void one_dir1() throws IOException {cfg.setDirectoryForTemplateLoading(new File("C:/freemarker_ftl"));}//所有模板都在一个文件夹路径,详情看 图2private static void one_dir2() throws IOException {//ftl模板文件统一放至 com.testExample.freemarker.template 包下面cfg.setClassForTemplateLoading(FreemarkerUtil.class,"/com/testExample/freemarker/template/");}// 所有模板分别在多个文件夹路径,详情看 图3private static void more_dir() throws IOException {//建议,就算不同文件夹,但是模板文件名也不能相同,详情看 图3FileTemplateLoader 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<String, Object> 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<String, Object> 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<String, Object> 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! <br/>name : ${username}<br/>age : ${age}<br/>sex : ${sex}


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

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


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

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


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

图3 同图2链接


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

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


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

图4_1



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

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



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

图6 http://t.bdtool.net/freemarker/pgui_quickstart_merge.html

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

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

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