项目结构图

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生成静态页面的更多相关文章

  1. 使用freemarker生成静态页面

    一 说明 需要在spring mvc项目中加入下列包: <dependency> <groupId>org.freemarker</groupId> <art ...

  2. java使用freemarker生成静态html页面

    1. 模板文件static.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...

  3. Freemarker生成静态代码实例

    1.static.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http ...

  4. SpringBoot 利用freemaker生成静态页面

    1. <!-- freemarker模板 --> <dependency> <groupId>org.springframework.boot</groupI ...

  5. 浅谈php生成静态页面

    一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...

  6. .NET生成静态页面并分页

    因为公司的产品用asp开发, 前一段时间用asp写了一个生成静态页面并分页的程序,但缘于对.net的热爱,写了这个.net下的生成静态页面并分页的程序. 主要的原理就是替换模板里的特殊字符. 1.静态 ...

  7. .net 生成 静态页面

    .net 生成 静态页面 <!--Main.Aspx--> <%@ page language="C#" %> <%@ import namespac ...

  8. C#根据网址生成静态页面

    HoverTree开源项目中HoverTreeWeb.HVTPanel的Index.aspx文件 是后台管理的首页. 包含生成留言板首页,以及显示用户名,退出等功能. 根据网址生成页面的方法: boo ...

  9. 用 Smarty 生成静态页面入门介绍

    why Smarty? 随着公司首页(以下简称首页)流量越来越大,最近开始考虑使用后台语言生成静态页面的技术. 我们知道,一个简单页面一般是一个 .html(或者 .htm ..shtml)后缀的文件 ...

随机推荐

  1. paper 119:[转]图像处理中不适定问题-图像建模与反问题处理

    图像处理中不适定问题 作者:肖亮博士 发布时间:09-10-25 图像处理中不适定问题(ill posed problem)或称为反问题(inverse Problem)的研究从20世纪末成为国际上的 ...

  2. Oracle EBS 初始化用户密码(转)

    ---修改密码,并且将限制用户下次登录的时候(第一次登录),强制要换一个新的口令: ---此过程可以完全模拟我们在标准用户的Form里面初始化用户的密码的动作! ---最后要说明的是,这个处理过程是通 ...

  3. 动态SQL字符长度超过8000

    动态SQL字符长度超过8000,我记得SQL SERVER 2008中用SP_EXECUTESQL打破了这个限制. 平常用动态SQL,可能都会用EXEC(),但是有限制,就是8000字符串长度.自从S ...

  4. iphone 群发短信 闪退 彻底解决

    用iphone5群发短信,经常闪退,一般人多的时候,最容易出现 试了很多办法,ifile改sms.db等权限等 没有根本解决 一次操作中,发现群发时,每个号码都会显示菊花,貌似在检测什么 突然意识到, ...

  5. Solr5 DataImport 处理1对多关系

    “问题” 和“派发处理” 是2个对象. 每个问题可以被派发N次, 最后结束问题. 实际查询中数据量可能很大,同时即可以从问题查派发部门, 也可以从派发情况查询问题(如本部门处理的问题) 使用的技巧就是 ...

  6. C语言 03 项目团队文件合并

    团体项目中 链接把项目中所有相关联的.O目标文件.C语言函数库合并在一起,生成可执行文件. 编写声明文件,用 .h文件封装起来,在其他代码中用include"xxx.h"引用声明 ...

  7. PhpStorm创建Drupal模块项目开发教程(2)

    通常支持Drupal HOOK的文件为.module.首先我们需要在这里对它进行声明,以便索引,并且在代码完成中使用Ctrl+Space(空格)完成HOOK实现. Drupal HOOK调用,通常情况 ...

  8. eclipse连hadoop2.x运行wordcount 转载

    转载地址:http://my.oschina.net/cjun/blog/475576 一.新建java工程,并且导入hadoop相关jar包 此处可以直接创建mapreduce项目就可以,不用下面折 ...

  9. git github简单知识

    Git 常用命令 git init here -- 创建本地仓库(repository),将会在文件夹下创建一个 .git 文件夹,.git 文件夹里存储了所有的版本信息.标记等内容 git remo ...

  10. EditText光标位置

    1.xml中设置 gravity="top"  加入edittext框的高度不止一行时,该属性可是光标定位在第一行,不设置的话光标是默认在框的中间 2.etEdit.setSele ...