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));
    

      

  • 相关阅读:
    swift高速入门,三分钟上手
    针对Azure微软与世纪互联的合作方式
    Major compaction时的scan操作
    利用ENVI FX从RGB提取建筑物轮廓
    自己动手写处理器之第二阶段(1)——可编程逻辑器件与PLD电路设计流程
    CSS Sprites(基本写法,怎样使用)
    00104_网络通信协议
    雷林鹏分享:XML 语法规则
    雷林鹏分享:XML 验证
    雷林鹏分享:XML 属性
  • 原文地址:https://www.cnblogs.com/Mr-Kenson/p/9041887.html
Copyright © 2011-2022 走看看