freemarker简介及入门demo

自我学习freemarker的过程,记录下来。以供复习,如果不正之处,欢迎各位批评指正。


学习一门技术,我觉得首先清楚两点,它是什么,为什么要用它,怎么用它。

我们先了解一下freemarker是什么?以及为什么要用freemarker?

1.freemarker是什么?

freemarker是一款模板引擎。基于模板和数据源来生成输出文本(比如html、配置文件、电子邮件、源代码)的通用工具。它是一个java类库。
初学的话,我觉得理解到这就可以了。

2.为什么要用freemarker?

①freemarker实现了将业务逻辑和变现层分离。在Jsp开发中,页面会有大量的业务逻辑,不利于阅读和维护,使用freemarker可以避免这个问题

②有利于团队分工合作,前端设计师可以关注页面的设计而无需面对页面的业务逻辑,同时修改页面代码也不需要程序员重新编译代码

③提高开发效率,freemarker不需要每次修改后重新编译,因为是直接生成一个页面返回的;而Jsp再修改之后,是需要重新编译的。在开发调试中可以有效节省时间。

写到第三点的时候,有点犯迷糊了。突然不知道修改了jsp之后,tomcat是否需要重启了。在网上查的时候,发现一个答案解答的很好,一并写在这里:

举例来说,你现在需要给你家里的电视搭一块布,你需要把电视的总电源都关掉,搭好之后再打开么?这块布就类似jsp,jsp就只是一个展示的东西,一个界面而已。但是当你想给电视机里面换一个零件,你难道不断电就直接换么?电视机里面的零件就相当于class,因为class是需要tomcat提前加载好的。所以当你修改了class的时候,需要重启tomcat再加载一次。

④有利于提高访问速度。对于不会频繁发生变化的页面,建议使用freemarker生成的静态页面,而不是每次都要动态生成的JSP页面。

扫描二维码关注公众号,回复: 3961523 查看本文章

解释:因为使用freemarker生成的都是静态页面,不需要其他处理,可以直接访问。

而jsp页面就需要相应的处理:当一个jsp页面第一次被访问的时候, JSP Engine(JSP引擎)首先将jsp页面转译为Servlet,生成的文件保存在tomcat/work/Catalina/localhost下;

然后JSPC(jspc编译器)对转译生成的servlet进行编译  生成.class字节码文件,文件和servlet在同一个文件夹下(tomcat/work/Catalina/localhost)。

由服务器访问.class字节码文件并将对应内容响应给用户。

(jsp的运行原理   需要更详细的阐述的可以访问我另一篇博客:                                        )

⑤可以提高并发量

⑥静态页面对SEO更友好

⑦不占用JVM的PermGen space。因为不会被变异成类,所以不会占用web服务器永生带的空间,避免OutOfMemoryError:PermGen space的错误

关于5、6、7这三点,由于时间原因,没有深入去了解,以后有时间研究的时候会补上理解。各位见谅哈。

3.基本原理:

下面这张图应该能阐述明白freemarker的原理

简单说来就是你可以自己copy一个模板,或者是自己定一个模板,然后在相应的方法中,传递参数,参数之一就是这个模板文件,还要有一个键值对的集合参数,map中的key值要与模板中定义的变量相对应。map的value就会替换到模板中的变量的位置。

上面那段话,我自己是能明白,但是我不知道我表述的各位能不能明白,如果不明白的话,结合下面的demo,相信你一定会明白了。(语言表达能力一般,各位大佬勿喷哈~~)

demo:

创建maven项目,打包方式jar。

在pom.xml中导入依赖:

        <!-- freemarker依赖 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
        </dependency>

项目的结构如图:

FreeMarkerTest类代码如下:

通过该类的代码先了解一下freemarker的基本使用步骤

/**
 * freemarker使用步骤:
 * 1.创建Configuration实例,负责管理freemarker的模板加载路径
 * 2.通过configuration创建Template实例,并指定使用的模板文件
 * 3.使用Map对象填充模板
 * 4.使用Template实例的process方法完成合并
 */
package com.fd.freemarker;

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

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

public class FreeMarkerTest {
    public static void main(String[] args) throws IOException, TemplateException {
        //定义模板的加载路径
        String path = FreeMarkerTest.class.getResource("/ftl").getPath();
        
        File file = new File(path);
        
        //创建Configuration实例,负责管理设置freemarker的模板加载路径
        Configuration configuration = new Configuration();
        configuration.setDirectoryForTemplateLoading(file);
        //设置默认字符编码
        configuration.setDefaultEncoding("utf-8");
        
        //通过configuration创建Template实例
        Template template = configuration.getTemplate("user.ftl");
        
        //使用Map对象填充模板
        Map<String,String> map = new HashMap<String,String>();
        map.put("name","freemarker");
        map.put("message","hello,how are you?");
        
        //调用template对象的process方法 实现合并
        StringWriter stringWriter = new StringWriter();
        template.process(map, stringWriter);
        
        //输出
        System.out.println(stringWriter.toString());
    }
}

user.ftl内容如下:

运行FreeMarkerTest  结果如下:

看到这里,应该能明白freemarker的基本使用步骤了吧。

接下来的FreeMarkerTest2类就是简单的应用,用来生成输出文本

代码如下:

/**
 * freemarker使用步骤:
 * 1.创建Configuration实例,负责管理freemarker的模板加载路径
 * 2.通过configuration创建Template实例,并指定使用的模板文件
 * 3.使用Map对象填充模板
 * 4.使用Template实例的process方法完成合并
 * 
 * 该类测试内容:根据模板和数据源生成html到指定的位置
 */
package com.fd.freemarker;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

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

public class FreeMarkerTest2 {
    public static void main(String[] args) throws IOException, TemplateException {
        //定义模板的加载路径
        String path = FreeMarkerTest2.class.getResource("/ftl").getPath();
        
        File file = new File(path);
        
        //创建Configuration实例,负责管理设置freemarker的模板加载路径
        Configuration configuration = new Configuration();
        configuration.setDirectoryForTemplateLoading(file);
        //设置默认字符编码
        configuration.setDefaultEncoding("utf-8");
        
        //通过configuration创建Template实例
        Template template = configuration.getTemplate("user2.ftl");
        
        //使用Map对象填充模板
        Map<String,String> map = new HashMap<String,String>();
        map.put("name","freemarker");
        map.put("message","hello,how are you?");
        
        //指定生成html文件的位置
        Writer writer = null;
        File file2 = new File("src/main/resources/html"+"\\"+"user.html");
        writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file2)));
        
        //调用模板方法,完成合并
        template.process(map, writer);
        
        
    }
}


 

user2.ftl内容如下:

运行FreeMarkerTest2   会在设定的路径下生成一个html文件

目录结构如下:

html文件的内容如下:

可以把这个文件复制到桌面,进行访问。

如图:

至此,我初学阶段的理解就都在这了。

个人理解有限,如有不正,欢迎各位大佬批评指正。

猜你喜欢

转载自blog.csdn.net/weixin_42652696/article/details/83506176
今日推荐