FreeMarker生成静态HTML页面的工具类FreeMarkerUtil

一.FreeMarkerUtil工具类:

import com.huaxia.entity.News;

import com.huaxia.entity.User;

import freemarker.template.Configuration;

import freemarker.template.Template;

import freemarker.template.TemplateException;

import javax.servlet.http.HttpServletRequest;

import java.io.*;

import java.util.HashMap;

import java.util.Locale;

import java.util.Map;

/**

* 创建人: leon

* 创建时间: 2014年11月28日 上午10:07:51

* 类描述:Freemarker的工具类

*/

public class FreemarkerUtil {

/**

* 通过指定的名字获取相应的模板

* @param fileName

* @return

*/

public Template getTemplate(HttpServletRequest request,String fileName) {

try {

Configuration cfg = new Configuration();

cfg.setOutputEncoding("UTF-8");

cfg.setDefaultEncoding("UTF-8");// 编码设置1

cfg.setEncoding(Locale.CHINA, "UTF-8");

//设定读取ftl模板文件的目录

//cfg.setClassForTemplateLoading(this.getClass(), "/template");//读取src目录下

cfg.setServletContextForTemplateLoading(request.getSession().getServletContext(), "/template");//读取webroot目录下

//在模板文件目录中找到名称为name的文件,并加载为模板

Template template = cfg.getTemplate(fileName);

template.setEncoding("UTF-8");// 编码设置2

return template;

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

/**

* 通过指定的文件目录和文件名生成相应的文件

* @param fileDir

* @param fileName

*/

public Boolean printToFile(Template template,String fileDir,String fileName,Map root) {

boolean done = false;

Writer writer = null;

try {

//判断多级目录是否存在,不存在则一级级创建

String[] paths = fileDir.split("\\\\");//注意:此处“\\”是错误的,必须要“\\\\”才能分割字符串

String dir = paths[0];

for (int i = 1; i < paths.length; i++) {

dir = dir + File.separator + paths[i];

File file=new File(dir.toString());

if (!file.exists()) {

file.mkdir();

}

}

//创建输出流

File file = new File(fileDir +File.separator+ fileName);

//设置生成的文件编码为UTF-8

//服务器不支持UTF-8格式HTML时候使用ANSI格式HTML文件,即系统默认编码

writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8")); // 编码设置3

//writer = new FileWriter(fileDir +File.separator+ fileName);

//输出模板和数据模型都对应的文件

template.process(root, writer);

done = true;

} catch (IOException e) {

e.printStackTrace();

} catch (TemplateException e) {

e.printStackTrace();

} finally {

try {

if(writer!=null){

writer.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return done;

}

/**

* 通过传入的请求和新闻信息重新生成html文件

* @param news //新闻实体类

* @param request //请求

* @param user //用户

* @return

*/

public boolean genenateHtml(News news,HttpServletRequest request,User user) {

String fileName = news.getFileName();

Map root = new HashMap();

root.put("id", news.getId());

root.put("title", news.getTitle());

root.put("create_date", news.getCreateDate());

root.put("creator", news.getCreator());

root.put("content", ClobUtil.ClobToString(news.getContent()));

root.put("fileName", news.getUploadFile()==null?"":news.getUploadFile());

FreemarkerUtil freemarkerUtil = new FreemarkerUtil();

Template template = null;

template = freemarkerUtil.getTemplate(request, "news.ftl");//新闻发布系统的freemarker模板

String htmlDir = news.getDir();

boolean done = printToFile(template, htmlDir, fileName, root);

return done;

}

}

二.发布新闻信息的Servlet:

if ("publishNews".equals(action)) { //发布新闻:通过传入的新闻id获取新闻信息生成新闻模板

String idsStr = request.getParameter("newsIds");

INewsDao newsDao = new NewsDaoImpl();

boolean done = newsDao.publishNews(idsStr,request,user);

String str =null;

if(done){

str="{success:true}";

}else{

str="{success:false}";

}

response.setContentType("text/html;charset=UTF-8");

out=response.getWriter();

out.print(str);

out.close();

return;

}

三.发布新闻信息的Dao方法:

/**

* 发布新闻信息的Dao方法

* @param idsStr //新闻ID

* @param request

* @param user

*/

public boolean publishNews(String idsStr, HttpServletRequest request, User user) {

Session s = null;

boolean done = false;

FreemarkerUtil freemarkerUtil = new FreemarkerUtil();

List ids = new ArrayList();

String[] newIds = idsStr.split(",");

for (int i = 0; i < newIds.length; i++) {

ids.add(Integer.valueOf(newIds[i]));

}

try {

s = HibernateUtil.getSession();

s.beginTransaction();

StringBuffer sb = new StringBuffer("select * from news where id in(");

for (int i = 0; i < ids.size(); i++) {

sb.append(ids.get(i));

if (i != ids.size() -1) {

sb.append(",");

}

}

sb.append(")");

SQLQuery query = s.createSQLQuery(sb.toString());

List list = query.addEntity(News.class).list();

for (int i = 0; i < list.size(); i++) {

News news = list.get(i);

done = freemarkerUtil.genenateHtml(news, request, user);

if (!done) {

return done;

}

}

s.getTransaction().commit();

done = true;

} catch (Throwable e) {

logger.error(e.toString());

HibernateUtil.endSession(s);

} finally {

HibernateUtil.endSession(s);

}

return done;

}

相关链接:

Freemarker模板应用

Freemarker生成html页面

Freemarker 设置编码

生成html页面的ftl文件,FreeMarker生成静态HTML页面的工具类FreeMarkerUtil相关推荐

  1. python创建网页_生成HTML页面的Python模块 PyH

    PyH 是一个用来生成HTML页面的Python模块,使用面向对象的方式,HTML的标签都会对应一个Python的对象,输出的HTML文档排版良好,易于阅读. 示例代码: from pyh impor ...

  2. python pyh模块下载_PyH首页、文档和下载 - 生成HTML页面的Python模块 - OSCHINA - 中文开源技术交流社区...

    PyH 是一个用来生成HTML页面的Python模块,使用面向对象的方式,HTML的标签都会对应一个Python的对象,输出的HTML文档排版良好,易于阅读. 示例代码: from pyh impor ...

  3. 华为手表开发:WATCH 3 Pro(2)生成密钥和证书请求文件,生成签名和配置签名

    华为手表开发:WATCH 3 Pro(2)生成密钥和证书请求文件,生成签名和配置签名 初 环境与设备 生成密钥 生成签名 初 希望能写一些简单的教程和案例分享给需要的人 鸿蒙可穿戴开发 环境与设备 系 ...

  4. [vue-cli]vue-cli默认是单页面的,那要弄成多页面该怎么办呢

    [vue-cli]vue-cli默认是单页面的,那要弄成多页面该怎么办呢 创建多个app? app =new Vue({}) app2 = new Vue({}) 个人简介 我是歌谣,欢迎和大家一起交 ...

  5. PHP文件上传,下载,Sql工具类!

    PHP文件上传,下载,Sql工具类! 对文件大小,文件类型 同名覆盖 中文转码的操作,可直接使用 前台 upload.html <!DOCTYPE html> <html> & ...

  6. springboot上传下载文件(4)--上传下载工具类(已封装)

    因为在做毕设,发现之前的搭建ftp文件服务器,通过ftp协议无法操作虚拟机临时文件,又因为ftp文件服务器搭建的比较麻烦:而 hadoop的HDFS虽然可以实现,但我这里用不到那么复杂的:所以我封装了 ...

  7. java解析mdb文件_Access MDB文件解析查询,Access数据库解析工具类MdbUtils

    Access MDB文件解析查询,Access数据库解析工具类MdbUtils ================================ ©Copyright 蕃薯耀 2018年9月18日 h ...

  8. 记录使用freemarker生成word的模板ftl文件以及word的遍历数据

    2019独角兽企业重金招聘Python工程师标准>>> 生成ftl文件有2种.有循环数据或者无循环数据 没有循环数据的比较简单,在woed模板里,将需要数据库填充的数据写入每个表格, ...

  9. java生成word样式变形的解决方案(freemarker生成word的样式不对)

    word的样式不对,被挤走了,怎么调dtl文件 文章目录 前言 一.现在的样式问题 1.现象1_(样式被挤掉) 2.现象2_(多了一个空白页,也是被挤下去的) 3.生成的word是代码 4.样式不对, ...

最新文章

  1. python 杂记(二)
  2. 在workflow中,无法为实例 ID“...”传递接口类型“...”上的事件“...” 问题的解决方法。...
  3. Linux服务-SSH服务部署
  4. python连接oracle超时设置,Python连接Oracle设置过程记录
  5. 对于数据库表排他更新的理解
  6. AS 中 Plugin for Gradle 和 Gradle 之间的版本对应关系
  7. 前端学习(392):京东制作页面1京东项目项目介绍
  8. SpringCloud微服务:Ribbon和Feign组件,实现服务调用的负载均衡
  9. ie 无法运行php,PHP会话无法在IE中运行
  10. postgresql开启历史查询记录日志
  11. 用什么软件可以检测苹果耳机芯片_苹果耳机AirPods入耳检测的原理!怎么样判断苹果耳机的真假?...
  12. Ps cc 2014 安装与错误修改
  13. Python基础语法详解
  14. 【转载】MiniUtilityFramework(九):CText和TEXT
  15. 智能柜怎么与Android通信,快递智能柜Android系统该何去何从
  16. 金融安全资讯精选 2017年第二期:金融网络安全和反欺诈方法论_金融新兴技术成熟度几何?...
  17. matlab中二维散点图,MATLAB实例:二维散点图
  18. GEE(7):GEE插件Open Earth Engine extension提高效率
  19. 天池比赛——新闻文本分类比赛(零基础入门NLP)
  20. java实现简单的文件下载

热门文章

  1. 解决HierarchyViewer不能连接真机的问题
  2. linux下SVN配置笔记(转)
  3. 竞争性前导码数量( numberOfRA-Preambles)
  4. 32.C#--方法中使用out参数做登录判断
  5. 3.25 for循环
  6. Struts2配置文件【代码库】
  7. Java多线程生产者消费者调度实现
  8. 2017202110104-高级软件工程2017第8次作业—个人总结
  9. mysql典型sql示例(DML)
  10. UI设计:掌握这6点,轻松0到1