freemarker生产报文和静态化页面的方法,最近碰到很多数据时通过MQ报文的方式传输的。想到可以通过freemarker生产静态文件的方式来生成报文:
首先创建一个模板文件,用来生成后续的静态文件:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<title>freemarker static page generate</title>
</head>
<body>
<h1>${user.userName}</h1>
<h2>${user.userPassword}</h2>
</body>
</html>
然后创建生成静态文件的类
package cn.gov.zjport.mt.freemarker;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import cn.gov.zjport.mt.monitor.bean.User;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
/**
*
* @author zjport-wll 生产html静态页面
*/
public class FreeMarkerFactory {
private static FreeMarkerFactory instance;
public static synchronized FreeMarkerFactory getDefaultInstance() {
if (instance == null) {
instance = new FreeMarkerFactory();
}
return instance;
}
/**
* 私有的构造方法
*/
private FreeMarkerFactory() {}
/**
*
* @param templatePath
* 模板文件的路径
* @param templateName
* 模板文件
* @param htmlPath
* 生产的html文件
* @param data
* 注入的数据
*/
public void fillDataToTemplate(String templatePath, String templateName,
String htmlPath, Map<String, Object> data) {
try {
Configuration config = new Configuration();
// 设置模板文件的路径
config.setDirectoryForTemplateLoading(findFile(templatePath));
// 设置包装器类型
config.setObjectWrapper(new DefaultObjectWrapper());
// 得到模板文件,编码和文件中的编码要一致
Template template = config.getTemplate(templateName, "UTF-8");
// 得到静态文件的输出流
FileOutputStream out = new FileOutputStream(findFile(htmlPath));
Writer writer = new OutputStreamWriter(out);
template.process(data, writer);
out.flush();
out.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 得到项目的根路径
*/
private String getProjectRoot() {
return System.getProperty("user.dir");
}
/**
* 得到文件的绝对路径
*
* @param path
* @return
*/
public String getFilePath(String path) {
return getProjectRoot() + path;
}
/**
*
* @param path
* @return
* @throws Exception
*/
private File findFile(String path) throws Exception {
File file = new File(getFilePath(path));
if (!file.exists()) {
throw new Exception("文件路径:" + path + " 不存在!");
}
return file;
}
public static void main(String[] args) {
User u = new User() ;
u.setUserName("test_name") ;
u.setUserPassword("hahah") ;
Map<String,Object> data = new HashMap<String,Object>() ;
data.put("user", u) ;
FreeMarkerFactory factory = FreeMarkerFactory.getDefaultInstance() ;
factory.fillDataToTemplate("/template/", "user.ftl", "/template/user.html", data) ;
}
}
用到的bean文件:
package cn.gov.zjport.mt.monitor.bean;
public class User {
private String userName ;
private String userPassword ;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
}
执行后生成的html文件(也可以是自定义的用语消息传递的报文)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<title>freemarker static page generate</title>
</head>
<body>
<h1>test_name</h1>
<h2>hahah</h2>
</body>
</html>