freemarker学习小结

在java领域,表现层技术主要有三种:jsp、freemarker、velocity。

从最熟悉的谈起:

jsp是大家最熟悉的技术

优点:
1、功能强大,可以写java代码
2、支持jsp标签(jsp tag)
3、支持表达式语言(el)
4、官方标准,用户群广,丰富的第三方jsp标签库
5、性能良好。jsp编译成class文件执行,有很好的性能表现
缺点:
jsp没有明显缺点,非要挑点骨头那就是,由于可以编写java代码,如使用不当容易破坏mvc结构。

velocity是较早出现的用于代替jsp的模板语言

优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能良好,据说比jsp性能还要好些
3、使用表达式语言,据说jsp的表达式语言就是学velocity的
缺点:
1、不是官方标准
2、用户群体和第三方标签库没有jsp多。
3、对jsp标签支持不够好

freemarker

优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能非常不错
3、对jsp标签支持良好
4、内置大量常用功能,使用非常方便
5、宏定义(类似jsp标签)非常方便
6、使用表达式语言
缺点:
1、不是官方标准
2、用户群体和第三方标签库没有jsp多

选择freemarker的原因:

1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。
2、宏定义比jsp tag方便
3、内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便
4、支持jsp标签
5、可以实现严格的mvc分离。

Freemarker详解:

基本概念:

Freemarker是一款模板引擎,是一种基于模板生成静态文件的通用工具,它是为java程序员提供的一个开发包,或者说是一个类库,它不是面向终端用户,而是为程序员提供了一款可以嵌入他们开发产品的应用程序。它是使用纯java编写的,为了提高页面的访问速度,需要把页面静态化,那么Freemarker就是被用来生成html页面。到目前为止,Freemarker使用越来越广泛,不光光只是它强大的生成技术,而且是它能够与spring进行很好的集成。

基本组成:

·文本:直接输出的部分
·注释:<#--…-->格式部分,不会输出
·插值:${..}或#{..}格式的部分,将使用数据模型中的部分替代输出
·FTL指令:Freemarker指定和HTML标记类似,名字前面加#予以区分,不会输出。

Freemarker生成静态页面的原理:

Freemarker 生成静态页面,首先需要使用自己定义的模板页面,这个模板页面可以是最最普通的html,也可以是嵌套freemarker中的 取值表达式, 标签或者自定义标签等等,然后后台读取这个模板页面,解析其中的标签完成相对应的操作, 然后采用键值对的方式传递参数替换模板中的的取值表达式,做完之后 根据配置的路径生成一个新的html页面, 以达到静态化访问的目的。

Freemarker常用标签:

·list:进行迭代服务器端传递过来的list集合
·if:做if判断
·include:导入文件

Freemarker自定义标签

自定义标签 需要自定义一个类,然后实现TemplateDirectiveModel,重写execute方法,完成获取参数,根据参数do something等等。将自定义标签与解析类绑定在一起需要在paramMap中放入该解析类的实例,存放的key与自定义标签一致即可。。
    注意:在自定义标签中,如果标签内什么也没有,开始标签和结束标签绝对不能再同一行,不然会报错 freemarker.log.JDK14LoggerFactory$JDK14Logger error

使用优势:

·易学易用
·功能强大:比Velocity强大多了,还支持JSP Tag。不过最有意义的是macro功能,可以自定义常用的macro,实现页面常规操作的可复用性。 
·报错信息友好:很多应用服务器的JSP报错信息是无法定位到源代码行的。不过freemarker报错定位很准确,丝毫不差,而且信息丰富,一看就知道怎么回事。

自我认为不好的地方:

·freemarker的变量必须有值,没有被赋值的变量就会抛出异常。
·freemarker的map限定key必须是string,其他数据类型无法操作。 
·freemarker为了编程方便把不可序列化的东西往session里面放
·freemarker支持在页面里面直接操作Session,request等,例如${Session[...]},方便确实很方便,但是一旦需要做群集,就会报错。

应用小实例:

1、首先需要添加提供支持的Freemarker-*.jar
2、在WEB下,新建模板文件:demo.ftl
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<html>
<head>
	<title>${title}</title>
</head>
<body>
	<#include "first.ftl"/>
	<lable>学号:</lable>${student.id}<br>
	<lable>姓名:</lable>${student.name}<br>
	<lable>地址:</lable>${student.address}<br>
	学生列表:
	<table border="1">
	<#list students as s>
		<#if s_index %2==0>
		<tr style="color:red>
		<#else>
		<tr>
		</#if>
			<td>${s.id}</td>
			<td>${s.name}</td>
			<td>${s.address}</td>
		</tr>
	</#list>
	</table>
	<br>
	<#if curdate ??>
	当前日期:${curdate?string("yyyy/MM/dd HH:mm:ss")}
	<#else>
	curdate属性为null
	</#if>
</body>
</html>
内容非常简单,跟平时经常写的html和jsp差不多。只是在标签格式上有所不同。
3、接下来,编写后台代码,我新建了一个测试类:testFreeMarker
	public void testFreeMarker()throws Exception{
		//常见Configuration对象
		Configuration configuration =new Configuration(Configuration.getVersion());
		//告诉config对象模板文件的存放路径		
		configuration.setDirectoryForTemplateLoading(new File("E:\\eclipseworkspace\\taotao\\taotao-portal\\src\\main\\webapp\\WEB-INF\\demo.ftl"));
		//设置config的默认字符集
		configuration.setDefaultEncoding("utf-8");
		System.out.println(configuration);
		//从config对象中获得模板对象
		Template template=configuration.getTemplate("second.ftl");
		//创建模板需要的数据集
		Map root=new HashMap<>();
		root.put("title", "hello freemarker");
		root.put("student", new Student(1,"张三","北京"));
		root.put("curdate",new Date());
		root.put("hello", "first中的hello");
		List<Student>stuList=new ArrayList<>();
		stuList.add(new Student(1,"张三","北京"));
		stuList.add(new Student(2,"张三1","北京1"));
		stuList.add(new Student(3,"张三2","北京3"));
		stuList.add(new Student(4,"张三3","北京2"));
		stuList.add(new Student(5,"张三4","北京5"));
		stuList.add(new Student(6,"张三5","北京4"));
		root.put("students", stuList);
		
		//创建一个write对象,指定生成的文件保存的路径及文件名
		Writer out =new FileWriter(new File("D:\\temp\\html\\demo.html"));
		//调用模板对象的process方法生成静态文件
		template.process(root, out);
		//关闭writer对象
		out.flush();
		out.close();
	}
需要特别注意的是,ftl文件中定义了的变量在后台一定要给出模板需要的数据集,不然会出错的。在实际项目中,我们经常就会把数据集的来源改成从数据库中获取。

学习小结:

小编把Freemarker用在最近正在进行的一个电商项目里面,用于加载商品的详情描述。 这主要是考虑到了展示的商品会经常变化,这种情况下只需要使用一个新的模板,就可以把页面改变,无需对平台代码进行修改了。这个时候就显示出了Freemarker比jsp的方便之处了。其实用哪种技术完全是根据自己的业务需求与功能实现,选择一个更适合的。

你可能感兴趣的:(freemarker学习小结)