自我学习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页面。
解释:因为使用freemarker生成的都是静态页面,不需要其他处理,可以直接访问。
而jsp页面就需要相应的处理:当一个jsp页面第一次被访问的时候, JSP Engine(JSP引擎)首先将jsp页面转译为Servlet,生成的文件保存在tomcat/work/Catalina/localhost下;
然后JSPC(jspc编译器)对转译生成的servlet进行编译 生成.class字节码文件,文件和servlet在同一个文件夹下(tomcat/work/Catalina/localhost)。
由服务器访问.class字节码文件并将对应内容响应给用户。
(jsp的运行原理 需要更详细的阐述的可以访问我另一篇博客: JSP文件的运行过程 - weixin_42652696的博客 - CSDN博客 )
⑤可以提高并发量
⑥静态页面对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文件的内容如下:
可以把这个文件复制到桌面,进行访问。
如图:
至此,我初学阶段的理解就都在这了。
个人理解有限,如有不正,欢迎各位大佬批评指正。