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)后缀的文件 ...
随机推荐
- 关于跨域GET、POST请求的小结//////////////////////zzzzzzz
JQuery:$.ajax/$.getJSON支持jsonp格式的跨域,但是只支持GET方式,暂不支持POST: so,跨域POST是个值得研究的问题啊!万能的JQuery无法跨域POST:鉴于基本国 ...
- PeopleSoft Rich Text Boxes上定制Tool Bars
在使用PT8.50或在8.51时,你可能遇到过Rich-text编辑框.该插件使你能够格式化文本,添加颜色.链接.图片等等.下面是效果图: 如果页面中只有这么一个字段,该文本框就会有足够的空间来容 ...
- Oracle EBS FND User Info API (转) EBS用户账号密码职责相关
. 与用户信息相关API PKG. --和用户处理有关的API FND_USER_PKG; --和用户密码处理有关的API FND_WEB_SEC; --和用户职责处理有关的API FND_USER_ ...
- Python函数信息
Python函数func的信息可以通过func.func_*和func.func_code来获取 一.先看看它们的应用吧: 1.获取原函数名称: 1 >>> def yes():pa ...
- 关于JSON
JSON:一种数据交换格式,不是一种编程语言.(JSON 语法是 JavaScript 对象表示法语法的子集.) 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaSc ...
- 用js写的极简的导航菜单,带下拉列表
太简单了,不多说,但是自己还是写了一会,因为总会出现这样那样小的错误,毕境最近在复习和学习一些前台,欢迎看到的各位能给点改进意见或者其它的,Thank you! 首先是发图,只用CSS写了结构,几乎没 ...
- AC6102 开发板千兆以太网UDP传输实验2
AC6102 开发板千兆以太网UDP传输实验 在芯航线AC6102开发板上,设计了一路GMII接口的千兆以太网电路,通过该以太网电路,用户可以将FPGA采集或运算得到的数据传递给其他设备如PC或服务器 ...
- Ubuntu14.04_64位使用过程
1. vmware10 下安装 ubuntu(ps:安装过程中还是将磁盘整的更大一些的好,我最开始20G,不够用啊不够用[典型安装就行]) 2. 右上角的圆圈设置--选择system setting- ...
- delphi强制WebBrowser控件使用指定版本显示网页
function TFrmmain.WriteAppNameToReg:Boolean; var reg:TRegistry; sPath,sAppName:String; Sver:string; ...
- EF事务嵌套
EF中采用的是数据上下文DbContext,当针对数据库的所有操作共用一个数据上下文的时候,会使用同一个连接对象,因此连接打开一次,最后Save的时候关闭连接,避免了频繁的创建连接对象打开关闭,这在一 ...