自我学习freemarker的过程,记录下来。以供复习,如果不正之处,欢迎各位批评指正。
学习一门技术,我觉得首先清楚两点,它是什么,为什么要用它,怎么用它。
我们先了解一下freemarker是什么?以及为什么要用freemarker?
freemarker是一款模板引擎。基于模板和数据源来生成输出文本(比如html、配置文件、电子邮件、源代码)的通用工具。它是一个java类库。 初学的话,我觉得理解到这就可以了。
①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的博客 - 博客 https://blog.csdn.net/weixin_42652696/article/details/83536765 )
⑤可以提高并发量
⑥静态页面对SEO更友好
⑦不占用JVM的PermGen space。因为不会被编译成类,所以不会占用web服务器永生带的空间,避免OutOfMemoryError:PermGen space(内存溢出)的错误
关于5、6、7这三点,由于时间原因,没有深入去了解,以后有时间研究的时候会补上理解。各位见谅哈。
下面这张图应该能阐述明白freemarker的原理
简单说来就是你可以自己copy一个模板,或者是自己定一个模板,然后在相应的方法中,传递参数,参数之一就是这个模板文件,还要有一个键值对的集合参数,map中的key值要与模板中定义的变量相对应。map的value就会替换到模板中的变量的位置。
上面那段话,我自己是能明白,但是我不知道我表述的各位能不能明白,如果不明白的话,结合下面的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文件的内容如下:
可以把这个文件复制到桌面,进行访问。
如图:
至此,我初学阶段的理解就都在这了。
个人理解有限,如有不正,欢迎各位大佬批评指正。