将给定数据源生成静态HTML页面持久化到项目之外的硬盘

一、java代码

设置好数据源map

Map<String,String> map=new HashMap<>();map.put("knowledgeName",tBasKnowledgebase.getKnowledgeName());map.put("htmlContent",tBasKnowledgebase.getHtmlContent());map.put("publishDate",new java.text.SimpleDateFormat("yyyy-MM-dd").format(tBasKnowledgebase.getPublishDate()));CreateHtmlUtils.MakeHtml(rpath,map,htmlPath,tBasKnowledgebase.getKnowledgeId());

工具类方法

/*** @Title: MakeHtml* @Description: 创建html* @param    filePath 设定模板文件* @param    map 需要显示图片的路径* @param    disrPath  生成html的存放路径* @param    fileName  生成html名字* @return void    返回类型* @throws*/public static void MakeHtml(String filePath, Map<String,String> map, String disrPath, String fileName ){try {System.out.print(filePath);String templateContent = "";// 读取模板文件,模板文件,是工程中的一个html页面,里面有一些需要替换的字段FileInputStream fileinputstream = new FileInputStream(filePath);int lenght = fileinputstream.available();byte bytes[] = new byte[lenght];fileinputstream.read(bytes);fileinputstream.close();templateContent = new String(bytes, "utf-8");System.out.print(templateContent);// 替换掉模板中的一些字段,填充数据渲染页面for (Map.Entry<String,String> entry : map.entrySet()) {String key=entry.getKey();String value=entry.getValue();templateContent = templateContent.replaceAll("###"+key+"###", value);System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());}System.out.print(templateContent);String fileame = fileName + ".html";// 生成的html文件保存路径,html文件全路径,选择服务器上工程目录下以外的路径,持久化存储到硬盘,这样发布新版本原来的静态文件不会丢失fileame = disrPath+"/" + fileame;// 根据文件全路径创建file对象File file=new File(fileame);if(!file.getParentFile().exists()){file.getParentFile().mkdirs();}if(!file.exists()){file.createNewFile();}FileOutputStream fileOutputStream=new FileOutputStream(file);OutputStreamWriter oStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8");// 将替换完数据的模板页面形成的文件流持久化到硬盘
            oStreamWriter.append(templateContent);oStreamWriter.close();} catch (Exception e) {System.out.print(e.toString());}}

工程中的模板HTML文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8" /><title>###knowledgeName###</title><style>body{ text-align:center;border: 0;margin: 0;}.div{ margin:20px auto;max-width: 1000px}.title{font-size: 20px;font-weight: bold;margin-bottom: 20px;}.date{border-bottom: 1px solid #9a9a9a;padding: 0 16px 16px;font-size: 15px;}.content{text-align: left;padding-top: 10px;line-height: 30px;}.toolsBox {height: 36px;border: 1px solid #d8d8d8;background: #fafbfb;font-size: 14px;color: #666;line-height: 36px;text-align: center;margin-top: 70px;}.toolsBox a, .toolsBox i {color: #666;cursor: pointer;font-style: normal;text-decoration: none;}.toolsBox i.on {color: #ff8400;}</style>
</head>
<body>
<div class="div"><div class="title">###knowledgeName###</div><div class="date">###publishDate###</div><div class="content">###htmlContent###</div><div class="toolsBox">字体:【 <i>大</i>  <i @cile class="on">中</i>  <i>小</i> 】<a href="javascript:window.print();">【打印 】</a><a href="javascript:window.close();">【关闭】</a></div>
</div>
<script src="/js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">(function () {// 字号设置
        function setFontSize(oElement,size){var size = size || 14;$(oElement).css({'fontSize': size+"px"});}$('.toolsBox i').eq(0).click(function() {setFontSize('.content p','16');$(this).siblings('i').removeClass('on');$(this).addClass('on');});$('.toolsBox i').eq(1).click(function() {setFontSize('.content p','14');$(this).siblings('i').removeClass('on');$(this).addClass('on');});$('.toolsBox i').eq(2).click(function() {setFontSize('.content p','12');$(this).siblings('i').removeClass('on');$(this).addClass('on');});})();</script>
</body>
</html>

效果:

 

转载于:https://www.cnblogs.com/wmqiang/p/11603143.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt qthead里如何响应信号_Qt 中的多线程技术(翻译)

原文链接Multithreading Technologies in Qt​doc.qt.io正文Qt 提供一系列的类与函数来处理多线程。Qt 开发者们可以使用下面四种方法来实现多线程应用。QThread: 底层 API 与可选的事件循环作为 Qt 进行线程控制的基石&#xff0c;每一个 QThread 实例都代表并控制着一个线程。…

SATA盘与SAS盘的区别

在过去的20年中&#xff0c;并行&#xff08;Paralle&#xff09;总线接口在存储市场上占据了主导的地位。但随着CPU时钟频率和内存带宽的不断提升&#xff0c;两种主要的并行总线接口技术ATA和SCSI逐渐显现出不足来。尽管ATA和SCSI均是并行总线接口&#xff0c;但是它们之间却…

如何彻底删除SVN中的文件和文件夹(附恢复方法)

在SVN中如果删除某个文件或文件夹也可以在历史记录中进行找回&#xff0c;有的时候需要彻底删除某些文件&#xff0c;即不希望通过历史记录进行恢复&#xff0c;需要在服务器上对SVN的数据进行重新整理这里假设SVN项目的目录为 /data/svn/project&#xff0c;我们想排除trunk/t…

Linux 技巧: Bash 测试和比较函数

http://www.ibm.com/developerworks/cn/linux/l-bash-test.html 转载于:https://www.cnblogs.com/daojian/archive/2012/07/16/2593960.html

页面调用系统window打印

一、 打印&#xff1a;直接页面调用window.print()&#xff0c;当前页面就会转换成打印页面 当前页面是使用HTML拼接成A4纸表格样式的展示&#xff1b; doPrint:function(type) {// this.centerDialogVisiblefalse;$(#button).hide();window.print();$(#button).show(); } 二、…

为什么只看重结果_猫很现实?猫只是看重结果

猫的智谋是许多家养宠物难以比拟的&#xff0c;这和猫的思维模式有关。和一些看重过程的动物不同&#xff0c;猫非常重视结果。这意味着&#xff0c;猫会通过自己的观察&#xff0c;通过结果来倒推过程&#xff0c;从而记住最佳的行动方案。铲屎官教给猫的一些方法&#xff0c;…

SQL Server 语句查询手册

建表&#xff1a; CREATE TABLE [DB.dbo].tableName (Stud_id int CONSTRAINT constraintName1 not null primary key, Name nvarchar(5) not null, Birthday datetime, Gender nchar(1), Telcode char(12), Zipcode char(6) CONSTRAINT constraintName2 CHECK(zipcode like…

Spring 3整合Quartz 2实现定时任务(转)

http://www.meiriyouke.net/?p82 最近工作中需要用到定时任务的功能&#xff0c;虽然Spring3也自带了一个轻量级的定时任务实现&#xff0c;但感觉不够灵活&#xff0c;功能也不够强大。在考虑之后&#xff0c;决定整合更为专业的Quartz来实现定时任务功能。 首先&#xff0c;…

OpenGL Shader基本概念

转载自&#xff1a;http://blog.csdn.net/lcphoenix/article/details/6574417 使用OpenGL创造的物体&#xff0c;在最终被绘制出来之前&#xff0c;有一个流水线处理过程&#xff0c;该过程被称为graphics pipeline,或者rendering pipeline&#xff0c;期间大部分工作由GPU执行…

android 编译之后黑屏_抖音BoostMultiDex:Android低版本上首次启动时间减少80%(一)...

我们知道&#xff0c;Android 低版本(4.X 及以下&#xff0c;SDK < 21)的设备&#xff0c;采用的 Java 运行环境是 Dalvik 虚拟机。它相比于高版本&#xff0c;最大的问题就是在安装或者升级更新之后&#xff0c;首次冷启动的耗时漫长。这常常需要花费几十秒甚至几分钟&…

[转]关于多线程并发:每个开发人员都应了解的内容(转自Mainz's)

Concurrency: What Every Dev Must Know About Multithreaded Apps 本文讨论: 多线程和共享内存线程模型争用及并发访问如何能够打破不变量作为争用标准解决方案的锁定何时需要锁定如何使用锁定&#xff1b;理解开销锁定如何能够各行其道十年前&#xff0c;只有核心系统程序员会…

Filter案例之登录验证

一、登录验证&#xff0c;权限控制 1、需求分析 其中&#xff0c;登录有关的资源被访问时要直接放行&#xff0c;不然会死循环&#xff1b; 2、代码实现 转载于:https://www.cnblogs.com/wmqiang/p/11604621.html

未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。

当用sqlserver 导入excel文件的时候&#xff0c;会出现未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。 解决办法&#xff1a;去http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe下载。然后安装就行…

js导出excel单元格内换行符代码_前端和excel的那些事

前端和 excel 的那点事在开发需求中&#xff0c;经常会遇到需要和excel相关的需求&#xff0c;毕竟不是所有人都是程序员&#xff0c;很多的业务都是通过excel去进行数据的整理归类计算的&#xff0c;excel中提供的一系列快捷功能&#xff0c;统计功能也非常的实用&#xff0c;…

C语言高级技术之--游戏属性修改器(背景故事)

前些天&#xff0c;由于看朋友在玩单机游戏仙剑3&#xff08;这么早的游戏&#xff0c;早不完了&#xff09;&#xff0c;看得我实在太累&#xff0c;问他为什么不找修改器之类的&#xff0c;那样轻松一些&#xff0c;他的回答让我很无语&#xff0c;他说&#xff1a;“老是下到…

CIO职业生涯如何进行三级跳

关于从技术员到CIO转型的&#xff0c;网上讨论的已经很多了。下面笔者结合自己的工作经历&#xff0c;谈谈自己在这方面的感受。概括的说来&#xff0c;我的CIO职业生涯&#xff0c;可以用“三级跳”来概括。借此&#xff0c;也给应届毕业生几个建议。  一级跳&#xff1a;MC…

Filter案例之敏感词过滤和代理模式

一、需求分析 二 、代理模式 1、概念 2、代码实现 代理对象可以强转为真实对象&#xff0c;即对应的接口类&#xff1b; 3、通过代理增强方法 其中&#xff0c;方法对象invoke真实对象&#xff0c;反射原理&#xff1b; 三、过滤敏感词汇案例代码实现 本地的字符流和字节流创建…

555定时器回差电压计算公式_555时基电路引脚解析

555时基电路引脚解析凡是时基电路555&#xff0c;电路内部结构相同&#xff0c;性能都是相同的。 时基电路555有很多厂家型号&#xff0c;如MC555、CA555、XR555、LM555等&#xff1b;国产型号有SL555、FX555、5G1555等&#xff0c;典型的、也是最常用的是NE555。555前的字母只…

LINQ学习(四):From子句

说明&#xff1a;查询表达式必须以 from 子句开头。 另外&#xff0c;查询表达式还可以包含子查询&#xff0c;子查询也是以 from 子句开头。SQL命令中from指的是数据表&#xff0c;LINQ中from 子句中引用的数据源的类型必须为 IEnumerable、IEnumerable<T> 或一种派生类…

jQuery attr removeAttr 属性操作

jQuery attr removeAttr 属性操作 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <%String path request.getContextPath();String basePath request.getScheme() "://" request.getServerName() …