选择freemarker的原因:
1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。
2、宏定义比jsp tag方便
3、内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便
4、支持jsp标签
5、可以实现严格的mvc分离
、概述
FreeMarker 是一个使用纯 Java 开发的模版引擎,一个基于模板生成文本输出的通用工具,FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序,虽然 FreeMarker 具有一些编程的能力,但通常由 Java 程序准备要显示的数据,由FreeMarker 生成页面,通过模板显示准备的数据(如下图)
FreeMarker 不是一个 Web 应用框架,而适合作为 Web 应用框架一个组件。FreeMarker 与容器无关,因为它并不知道 HTTP 或 Servlet;FreeMarker 同样可以应用于非Web应用程序环境,FreeMarker 更适合作为 Model2 框架(如 Struts)的视图组件,你也可以在模板中使用 JSP标记库。另外,FreeMarker是免费的。
一、Freemarker的准备条件
freemarker.2.3.16.jar
maven坐标
<dependency>
<!--在spring中使用Freemarker这个必不可少,否则报错-->
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.16.</version>
</dependency>
二、Freemarker生成静态页面的原理
Freemarker 生成静态页面,首先需要使用自己定义的模板页面,这个模板页面可以是最最普通的html,也可以是嵌套freemarker中的 取值表达式, 标签或者自定义标签等等,然后后台读取这个模板页面,解析其中的标签完成相对应的操作, 然后采用键值对的方式传递参数替换模板中的的取值表达式,做完之后 根据配置的路径生成一个新的html页面, 以达到静态化访问的目的。
三、FreeMarker模板文件主要由如下4个部分组成:
1、文本,直接输出的部分
2、注释,即<#–…–>格式不会输出
3、插值(Interpolation):即${..}或者#{..}格式的部分,将使用数据模型中的部分替代输出
4、FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。
代码 示例:
springmvc Controller代码
@Controller
public class FreemarkerController {
@RequestMapping("/index")
public String Add(Model model,HttpServletRequest request, HttpServletResponse response) {
//java往ftl模板中插入数据
model.addAttribute("url", "http://freemarker.org/");
model.addAttribute("name", "xiaming");
model.addAttribute("message", "Welcome to use Freemarker");
List<User> users = new ArrayList<User>();
User u = new User();
u.setId(10080);
u.setName("zhangsan");
u.setAge(118);
users.add(u);
model.addAttribute("users", users);
return "index";
}
}
模板文件 index.ftl
<!DOCTYPE html>
<html>
<head>
<title>freemarker-web测试</title>
</head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>Welcome to here!</h1>
<!-- ftl模板中取数据 -->
<a href="${url}">${name!},${message!}</a><br/>
<!-- name值为null,取name值会报错,可写成 name!"这是null值" / name!"" / name! -->
<div>
<#list users as u>
编号:${u.id}/名字:${u.name}/年龄:${u.age}
</#list>
</div>
</body>
</html>