freemarker与jsp,velocity并称java三大主要表现层技术.与jsp相比freemarker有以下优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能非常不错
3、对jsp标签支持良好
4、内置大量常用功能,使用非常方便
5、宏定义(类似jsp标签)非常方便
6、使用表达式语言
原生态java项目下使用freemarker示例:
1.导入freemarker.jar包
2.servlet代码:
package com.ga.myAge.test;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class freemarkerServlet extends HttpServlet {
// 负责管理FreeMarker模板的Configuration实例
private Configuration cfg = null;
public void init() throws ServletException {
// 创建一个FreeMarker实例
cfg = new Configuration();
// 指定FreeMarker模板文件的位置
cfg.setServletContextForTemplateLoading(getServletContext(), "/WEB-INF/templates");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 建立数据模型
Map<String,Object> map = new HashMap<String,Object>();
map.put("message", "hello world");
map.put("name", "张飞");
// 获取模板文件
Template t = cfg.getTemplate("test.ftl");
// 使用模板文件的Charset作为本页面的charset
// 使用text/html MIME-type
response.setContentType("text/html; charset=" + t.getEncoding());
Writer out = response.getWriter();
// 合并数据模型和模板,并将结果输出到out中
try {
t.process(map, out); // 往模板里写数据
} catch (TemplateException e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
3.模板文件
<html>
<head>
<title>freemarker测试</title>
</head>
<body>
<h1>${message},${name}</h1>
</body>
</html>
4.请求该servlet显示页面
但是大多数情况下我们使用框架进行项目开发,下面是ssm框架下的例子:
工具类:
package com.gda.goldenAge.test.utils;
import java.io.Writer;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig;
import freemarker.template.Template;
public class FreemarkerUtils {
public static void tofreeMark(FreeMarkerConfig freeMarkerConfig,String fileName, Map<String,Object> map,HttpServletResponse response){
try {
// 获取模板文件
Template t = freeMarkerConfig.getConfiguration().getTemplate(fileName);
// 使用模板文件的Charset作为本页面的charset
// 使用text/html MIME-type
response.setContentType("text/html; charset=" + t.getEncoding());
Writer out = response.getWriter();
t.process(map, out); // 往模板里写数据
} catch (Exception e) {
e.printStackTrace();
}
}
}
controller层实现:
package com.gda.goldenAge.test.controller;
import java.io.IOException;
import java.io.Writer;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig;
import com.base.web.BaseAction;
import com.gda.goldenAge.test.entity.Student;
import com.gda.goldenAge.test.utils.Constant;
import com.gda.goldenAge.test.utils.FreeMarkerUtil;
import com.gda.goldenAge.test.utils.FreemarkerUtils;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
@Controller
@RequestMapping("/freeMarker")
public class FreemarkerTestController extends BaseAction {
private final static Logger log= Logger.getLogger(FreemarkerTestController.class);
@Autowired
private FreeMarkerConfig freeMarkerConfig;//获取FreemarkerConfig的实例
@RequestMapping("/test5")
public void test5(HttpServletRequest request,HttpServletResponse response){
//当前日期
Date date = new Date();
//一个学生对象
Student stu = new Student("张飞", 15, "男", "打灰机", "500");
Map<String, Object> map = new HashMap<String,Object>();
map.put("message", "Hello");
map.put("user", "李小白先生");
map.put("num", 22);
map.put("date", date);
map.put("booleanValue", true);
map.put("xiaoshu", 2.5689);
map.put("stu", stu);
String fileName = "freemarkTest.ftl";
FreemarkerUtils.tofreeMark(freeMarkerConfig, fileName, map, response);
}
}
测试用的实体类
package com.gda.goldenAge.test.entity;
public class Student {
private String name;
private int age;
private String gender;
private String hobby;
private String strength;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public String getStrength() {
return strength;
}
public void setStrength(String strength) {
this.strength = strength;
}
public Student(String name, int age, String gender, String hobby,
String strength) {
super();
this.name = name;
this.age = age;
this.gender = gender;
this.hobby = hobby;
this.strength = strength;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
}
模板文件
<html>
<head>
<title>freemarker测试</title>
</head>
<body>
<#setting locale=zh-cn>
<#--文本部分-->
<h1>这是一个freemarker的测试混搭</h1>
<#--插值-->
<h1>${message},${user}</h1>
<#-- 数字格式化插值 -->
<h1>#{num}</h1>
<#-- 使用FTL指令 -->
<#-- 一组数字 -->
<hr/>
<h4>一组数字</h4>
${num}<br>
${num?string} <#-- the same as ${answer} --> <br>
${num?string.number} <br>
${num?string.currency} <br>
${num?string.percent} <br>
<#-- 一组日期 -->
<hr/>
<h4>一组日期</h4>
${date?date}<br>
${date?time}<br>
${date?datetime}<br>
${date?string("yyyy-MM-dd HH:mm:ss zzzz")} <br>
${date?string("EEE, MMM d, ''yy")} <br>
${date?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")} <br>
<hr/>
<h4>布尔值</h4>
${booleanValue?string("yes", "no")}
<hr/>
<h4>小数</h4>
#{xiaoshu; M2} <br>
#{xiaoshu; M2} <br>
#{xiaoshu; m2} <br>
#{xiaoshu; m2} <br>
#{xiaoshu; m1M2}<br>
#{xiaoshu; m1M2} <br>
<hr/>
<h4>对象</h4>
${stu}<br>
${stu?string}<br>
${stu.name+stu.age}<br>
${stu.name?string}<br>
${stu.age*2}<br>
<hr/>
<h4>集合</h4>
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>
${x} <br>
</#list>
<br>
<#list [2 + 2, [1, 2, 3, 4], "whatnot"] as y>
${y}
</#list>
<br>
<#list 5..2 as z>
${z}
</#list>
<hr/>
<h4>map集合</h4>
<hr/>
<h4>简单指令</h4>
<#setting locale="en">
<hr/>
<h4>HTML组件</h4>
<input type="button" id="bt1" style="height:50px";
value="I`m a button" onclick="alert('你是一个button')" />
</body>
</html>
输出效果
当然还需要freemarker.jar包和配置文件的支持啊