zoukankan      html  css  js  c++  java
  • Freemarker 的基础使用 (一)

    以下内容来自:http://www.oschina.net/p/freemarker

    FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。

    FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。

    虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据,简单来讲就是模板加数据模型,然后输出页面(如下图)

    这里写图片描述

    FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件

    FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境

    FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库

    FreeMarker是免费的

    在此处, 我们使用maven来管理项目

       pom.xml

    <dependency>
    	<groupId>org.freemarker</groupId>
    	<artifactId>freemarker</artifactId>
    	<version>2.3.28</version>
    </dependency>
    <dependency>
    	<groupId>Junit</groupId>
    	<artifactId>junit</artifactId>
    	<version>4.12</version>
    </dependency>
    

     然后我们创建一个freemarkerUtil 文件, 主要是用来寻找模板,代码如下

    package com.kenson.util;
    
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Map;
    
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;
    
    public class FreemarkerUtil {
        // 我们要传入的就是ftl 的文件名  比如 01.ftl
        public Template getTemplate(String name){
            try {
            Configuration config = new Configuration(Configuration.VERSION_2_3_28);//这个版本号要和包版本一致
            // 通过类路径来找ftl 模板文件  找到 存放ftl 文件的地址
            config.setClassForTemplateLoading(this.getClass(), "/ftl");
            Template temp = config.getTemplate(name);
            System.out.println("temp:"+temp);
            return temp;
            } catch (Exception e) {
                //捕捉到异常就返回空
                e.printStackTrace();
                return null;
            }
        }
        // 输出到一个文件中
        public void print  (String name , Map<String, Object>root){
            //通过Template可以将模板文件输出到相应的文件流 
            try {
                Template template = this.getTemplate(name);
                System.out.println("template:"+template);
                // 创建一个流, 将输出的方式放到流里面
                template.process(root ,new PrintWriter(System.out));
            } catch (TemplateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        
        
        
        // print HTML file 输出为html 页面  --- 很常用的一种
        public void fprint(String name, Map<String,Object> root, String outFile){
            FileWriter out  = null;
            
            //通过一个文件输出流可以将内容写到相应文件中了, 但是需要用的路径是绝对路径
            try {
                out  = new FileWriter(new File("D:/java_workpace/freemarker_01/src/main/pages/"+outFile));
                
                Template temp = this .getTemplate(name);
                temp.process(root,out);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (TemplateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                if(out != null){
                    try {
                        out.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }

     然后我们就要做 ftl 模板文件, 如果这个模板文件是用来生成html页面的, 那么我们可以这样操作, 先写一个html页面, 然后将其中需要动态输出的内容替换成${ ***  }的形式

    然后我们将文件的后缀名改为ftl, 最后的效果如下

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    ${user.id}---------${user.name}-------${user.age}
        <#if  user.age lt 12>
                ${user.name}: 还是一个小孩
        <#elseif user.age == 18>
                ${user.name}:刚刚成年
        <#else >
                ${user.name}:已经成年    
        </#if>
    </body>
    </html>

    写好了之后, 我们就可以用junit 进行测试了(不详细解释junit的用法了), 直接上代码

        @Test
                public void test01(){
                    // 创建数据模型
                    Map<String ,Object> root = new HashMap<String,Object>();
                    // 为数据模型添加值
                    root.put("username","张三");
                    // 将数据模型中的值和模板文件进行整合 输出控制台
                    frr.print("01.ftl", root);
                    // 这里是将数据输出到一个文件, 文件的后缀名为html
                    frr.fprint("01.ftl", root, "01.html");
                    
                }
    @Test
                public void test02(){
                    User user = new User(12,"张三",135);
                    
                    Map<String,Object> root = new HashMap<String, Object>();
                    root.put("user", user);
                    // freemarker 输出对象
                    frr.fprint("03.ftl", root,"03.html");
                }

     运行之后就能在下面设置的地址中找到运行出来的html文件(如果输出的是html文件),然后点开浏览器运行,你就会发现,里面已经有了动态生成的数据了

      out  = new FileWriter(new File("D:/java_workpace/freemarker_01/src/main/pages/"+outFile));
    

      

  • 相关阅读:
    OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
  • 原文地址:https://www.cnblogs.com/Mr-Kenson/p/9041887.html
Copyright © 2011-2022 走看看