freeMarker生成静态页面
项目结构图

footer.ftl
des==>${f.des}<br/>
<a href="http://www.baidu.com"> 百度 </a>
header.ftl
companyName==>${h.companyName}<br/>
address==>${h.address}<br/>
notice.ftl
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"> <body>
<#include "header.ftl" parse=true encoding="utf-8">
<hr/> 亲爱的${data.recipient}: 您好! 请查看如下通知:
${data.content} 感谢您的阅读! - ${data.publisher}
- ${data.dateTime} <hr/>
<a href="#">用户列表</a><br/>
<table border="1">
<tr>
<td>用户名</td>
<td>年龄</td>
<td>生日</td>
<td>id</td>
<td>操作</td>
</tr>
<#list users as user>
<tr>
<td>${user.name}</td>
<td>${user.age}</td>
<td>
${user.birthday?string("yyyy-MM-dd HH:mm:ss")}
</td>
<td>${user.id}</td>
<td><a href="#">删除</a></td>
</tr>
</#list> </table>
<hr/> <hr/>
<#include "footer.ftl" parse=true encoding="utf-8"> </body>
</html>
Footer.java
package com.shm.entity;
public class Footer {
private String des;
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
}
Header.java
package com.shm.entity;
public class Header { private String companyName; private String address; public String getCompanyName() {
return companyName;
} public void setCompanyName(String companyName) {
this.companyName = companyName;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} }
Notice.java
package com.shm.entity;
public class Notice {
private String recipient;
private String content;
private String publisher;
private String dateTime;
public String getRecipient() {
return recipient;
}
public void setRecipient(String recipient) {
this.recipient = recipient;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public String getDateTime() {
return dateTime;
}
public void setDateTime(String dateTime) {
this.dateTime = dateTime;
}
}
User.java
package com.shm.entity;
import java.util.Date;
public class User {
private Integer id;
private String name ;
private int age;
private Date birthday;
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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public User(Integer id,String name, int age, Date birthday) {
super();
this.name = name;
this.age = age;
this.birthday = birthday;
this.id = id;
}
public User() {
super();
}
}
DirectoryFilter.java
package com.shm.util; import java.io.File;
import java.io.FilenameFilter;
public class DirectoryFilter implements FilenameFilter { String myString;
public DirectoryFilter(String myString)
{
this.myString = myString;
} public boolean accept(File dir,String name)
{ //FilenameFilter.accept(File dir, String name)
// 测试指定文件是否应该包含在某一文件列表中。
String f= new File(name).getName();
if(f.contains(myString) || f.equals(myString)){
return true;
}
return false;
} }
FreeMarkerUtil工具类
package com.shm.util; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.shm.entity.Footer;
import com.shm.entity.Header;
import com.shm.entity.Notice;
import com.shm.entity.User; import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapperBuilder;
import freemarker.template.Template;
import freemarker.template.Version;
import service.FooterService;
import service.HeaderService;
import service.UserService; public class FreeMarkerUtil { public static final String CHARSET_UTF8 = "UTF-8"; public static Version version = Configuration.VERSION_2_3_25; //FreeMarker版本号
public static Configuration config; // 模板对象
public static Template template; public static DefaultObjectWrapperBuilder defaultObjectWrapperBuilder; // 创建 Configuration 对象
static {
config = new Configuration(version);
config.setDefaultEncoding(CHARSET_UTF8);// 设置默认编码 (至关重要 - 解决中文乱码问题)
defaultObjectWrapperBuilder = new DefaultObjectWrapperBuilder(version); //用于创建defaultObjectWrapper
config.setObjectWrapper(defaultObjectWrapperBuilder.build()); // 设置对象包装器
} /**
* 拼接内容数据
* @param dataMap
* @return
*/
public static Map<String, Object> processBody(Map<String, Object> dataMap){
Header h = HeaderService.getHeader();
dataMap.put("h", h);
Footer f = FooterService.gerFooter();
dataMap.put("f", f);
List<User> users = UserService.getUsers();
dataMap.put("users", users);
return dataMap;
} /**
* 根据template和dataMap生成文档内容
* @param templatePath 模板路径
* @param templateName 模板文件名称
* @param templateName 生成的文件存放路径
* @param templateName 生成的文件名称
* @param templateName 是否强制覆盖已存在的文件
* @param dataMap 需要填充的数据
* @return
*/
public static String buildContent(final String templatePath, final String templateName, final String filePath, final String fileName, final boolean forceCovered, final Map<String, Object> dataMap) {
Writer out = null;
try {
//判断是否强制覆盖,如果是不覆盖则要检查该目录下是否已存在该文件
if(!forceCovered){
File path = new File(filePath);
//判断是否已经存在该html文件
String[] indexfileList = path.list(new DirectoryFilter(fileName));
if(indexfileList == null || indexfileList.length == 0) { } else {
return filePath + "目录下已存在" + indexfileList[0];
}
} // 设置要解析的模板所在的目录,并加载模板文件
config.setDirectoryForTemplateLoading(new File(templatePath)); // 从模板目录下获取指定 ftl 模板文件
Template template = config.getTemplate(templateName, CHARSET_UTF8); //生成引入的ftl中header与footer的数据
processBody((Map<String, Object>) dataMap); /*// 字符串 字符输出流
final StringWriter stringWriter = new StringWriter();
final BufferedWriter bufferedWriter = new BufferedWriter(stringWriter);
// 把 数据源写到模板中
template.process(dataMap, bufferedWriter); // 刷新
bufferedWriter.flush();
// 关闭输出流
bufferedWriter.close(); // 获取输出的文本 (调用其 toString方法获得String)
System.out.print(stringWriter.toString());*/ // 合并数据模型与模板
//html生成之后存放的路径
out = new OutputStreamWriter(new FileOutputStream(filePath + "/" + fileName), CHARSET_UTF8);
template.process(dataMap, out); } catch (Exception e) {
e.printStackTrace();
return "生成文件发生异常";
} finally {
if(out != null){
try {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return "生成文件成功";
} //测试
public static void main(String[] args) {
Notice notice = new Notice();
notice.setRecipient("张三");
notice.setPublisher("系统管理员");
notice.setContent("这是通知内容,请记住。\n不要问我是谁!");
SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
notice.setDateTime(df.format(new Date())); Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("data", notice); String result = FreeMarkerUtil.buildContent("E:/templates", "notice.ftl", "E:/templates", "notice.html", false, dataMap);
System.out.println(result);
}
}
FooterService.java
package service;
import com.shm.entity.Footer;
public class FooterService {
private static Footer f = new Footer();
static{
f.setDes("上海-哈哈!!!");
}
public static void update(String des){
f.setDes(des);
}
public static Footer gerFooter(){
return f;
}
}
HeaderService.java
package service;
import com.shm.entity.Header;
public class HeaderService {
private static Header h = new Header();
static{
h.setAddress("上海CBD");
h.setCompanyName("上海!!!");
}
public static void update(String address,String companyName){
h.setAddress(address);
h.setCompanyName(companyName);
}
public static Header getHeader(){
return h;
}
}
UserService.java
package service; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import com.shm.entity.User; public class UserService { private static List<User> users = new ArrayList<User>(); static{
for(int i=0;i<10;i++){
User u = new User(i,"ajun"+i,i+10,new Date());
users.add(u);
}
} public static List<User> getUsers(){
return users;
} public static void delete(int index){
for(int i=0 ;i<users.size();i++){
User u = users.get(i);
if(u.getId()==index){
users.remove(u);
//users.remove(index);
}
}
}
}
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.shm</groupId>
<artifactId>freeMarkerTest</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>freeMarkerTest Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.25-incubating</version>
</dependency> </dependencies>
<build>
<finalName>freeMarkerTest</finalName>
</build>
</project>
freeMarker生成静态页面的更多相关文章
- 使用freemarker生成静态页面
一 说明 需要在spring mvc项目中加入下列包: <dependency> <groupId>org.freemarker</groupId> <art ...
- java使用freemarker生成静态html页面
1. 模板文件static.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- Freemarker生成静态代码实例
1.static.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http ...
- SpringBoot 利用freemaker生成静态页面
1. <!-- freemarker模板 --> <dependency> <groupId>org.springframework.boot</groupI ...
- 浅谈php生成静态页面
一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...
- .NET生成静态页面并分页
因为公司的产品用asp开发, 前一段时间用asp写了一个生成静态页面并分页的程序,但缘于对.net的热爱,写了这个.net下的生成静态页面并分页的程序. 主要的原理就是替换模板里的特殊字符. 1.静态 ...
- .net 生成 静态页面
.net 生成 静态页面 <!--Main.Aspx--> <%@ page language="C#" %> <%@ import namespac ...
- C#根据网址生成静态页面
HoverTree开源项目中HoverTreeWeb.HVTPanel的Index.aspx文件 是后台管理的首页. 包含生成留言板首页,以及显示用户名,退出等功能. 根据网址生成页面的方法: boo ...
- 用 Smarty 生成静态页面入门介绍
why Smarty? 随着公司首页(以下简称首页)流量越来越大,最近开始考虑使用后台语言生成静态页面的技术. 我们知道,一个简单页面一般是一个 .html(或者 .htm ..shtml)后缀的文件 ...
随机推荐
- paper 119:[转]图像处理中不适定问题-图像建模与反问题处理
图像处理中不适定问题 作者:肖亮博士 发布时间:09-10-25 图像处理中不适定问题(ill posed problem)或称为反问题(inverse Problem)的研究从20世纪末成为国际上的 ...
- Oracle EBS 初始化用户密码(转)
---修改密码,并且将限制用户下次登录的时候(第一次登录),强制要换一个新的口令: ---此过程可以完全模拟我们在标准用户的Form里面初始化用户的密码的动作! ---最后要说明的是,这个处理过程是通 ...
- 动态SQL字符长度超过8000
动态SQL字符长度超过8000,我记得SQL SERVER 2008中用SP_EXECUTESQL打破了这个限制. 平常用动态SQL,可能都会用EXEC(),但是有限制,就是8000字符串长度.自从S ...
- iphone 群发短信 闪退 彻底解决
用iphone5群发短信,经常闪退,一般人多的时候,最容易出现 试了很多办法,ifile改sms.db等权限等 没有根本解决 一次操作中,发现群发时,每个号码都会显示菊花,貌似在检测什么 突然意识到, ...
- Solr5 DataImport 处理1对多关系
“问题” 和“派发处理” 是2个对象. 每个问题可以被派发N次, 最后结束问题. 实际查询中数据量可能很大,同时即可以从问题查派发部门, 也可以从派发情况查询问题(如本部门处理的问题) 使用的技巧就是 ...
- C语言 03 项目团队文件合并
团体项目中 链接把项目中所有相关联的.O目标文件.C语言函数库合并在一起,生成可执行文件. 编写声明文件,用 .h文件封装起来,在其他代码中用include"xxx.h"引用声明 ...
- PhpStorm创建Drupal模块项目开发教程(2)
通常支持Drupal HOOK的文件为.module.首先我们需要在这里对它进行声明,以便索引,并且在代码完成中使用Ctrl+Space(空格)完成HOOK实现. Drupal HOOK调用,通常情况 ...
- eclipse连hadoop2.x运行wordcount 转载
转载地址:http://my.oschina.net/cjun/blog/475576 一.新建java工程,并且导入hadoop相关jar包 此处可以直接创建mapreduce项目就可以,不用下面折 ...
- git github简单知识
Git 常用命令 git init here -- 创建本地仓库(repository),将会在文件夹下创建一个 .git 文件夹,.git 文件夹里存储了所有的版本信息.标记等内容 git remo ...
- EditText光标位置
1.xml中设置 gravity="top" 加入edittext框的高度不止一行时,该属性可是光标定位在第一行,不设置的话光标是默认在框的中间 2.etEdit.setSele ...