文档章节

实现类似OSChina博客的导出功能

Harmel
 Harmel
发布于 2015/08/14 18:05
字数 479
阅读 148
收藏 5
点赞 0
评论 0

实现原理:从数据库中查询出所有的文章信息,将文章信息转成XML文档,再通过XSLT文档对其转换成HTML文档后进行下载。

1、将文章信息转成XML文档

private static Document articlesToXML(List<Article> articles, String title) {
    Document doc = DocumentHelper.createDocument();
    Element root = doc.addElement("articles").addAttribute("title", title);
    for (Article article : articles) {
        Element articleEle = root.addElement("article");
        articleEle.addElement("title").setText(article.getTitle());
        articleEle.addElement("content").setText(article.getContent());
    }
    return doc;
}

转换后的XML类似于如下

<?xml version="1.0" encoding="UTF-8"?>
<articles title="我的博客">
    <article>
        <title>文章标题</title>
        <content>文章内容</content>
    </article>
</articles>

2、将XML文档转成HTML

public static byte[] articlesToHTML(List<Article> articles, String title) {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try {
        TransformerFactory factory = TransformerFactory.newInstance();
        InputStream in = ArticleUtils.class.getClassLoader().getResourceAsStream("article.xsl");
        Source xlst = new StreamSource(in);
        Transformer transformer = factory.newTransformer(xlst);
        Source xmlSource = new DocumentSource(articlesToXML(articles, title));
        Result outputTarget = new StreamResult(out);
        transformer.transform(xmlSource, outputTarget);
        in.close();
    } catch (Exception e) {
        throw new RuntimeException("文章集合转HTML数据失败", e);
    }
    return out.toByteArray();
}

XSLT文档

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <head>
                <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
                <title>
                    <xsl:value-of select="/articles[@title]/@title" />
                </title>
                <style type="text/css">
                    body{
                        background-color: #F5F5F5;
                        color: #797979;
                    }

                    h2{
                        color: #2B9B70;
                        margin: 15px;
                    }
                    
                    .article{
                        margin: 15px;
                        background-color: white;
                    }

                    .article_title {
                        color: #2B9B70;
                        font-size: 20px;
                        border-bottom: 1px dashed #2B9B70;
                        padding: 10px;
                    }

                    .article_content {
                        padding: 8px 15px;
                        line-height: 1.8;
                    }
                </style>
            </head>
            <body>
                <h2><xsl:value-of select="/articles[@title]/@title" /></h2>
                <xsl:apply-templates />
            </body>
        </html>
    </xsl:template>
    <xsl:template match="article">
        <div class="article">
            <div class="article_title">
                <xsl:value-of select="title" disable-output-escaping="yes" />
            </div>
            <div class="article_content">
                <xsl:value-of select="content" disable-output-escaping="yes" />
            </div>
        </div>
    </xsl:template>
</xsl:stylesheet>

3、实现下载 -- Struts2

public class ExportAction extends BaseAction {

    @Resource(name = "articleService")
    private ArticleService articleService;

    // 文件名
    public String getFileName() throws IOException {
        String blogTitle = (String) application.get("blog_title");
        String fileName = blogTitle + "-" + DateUtils.getDate(new Date(), "yyyyMMddHHmmss") + ".html";
        // 解决火狐和IE文件名编码差异
        HttpServletRequest request = ServletActionContext.getRequest();
        String agent = request.getHeader("user-agent");
        if (agent.contains("Firefox")) {
            fileName = "=?UTF-8?B?" + new BASE64Encoder().encode(fileName.getBytes("UTF-8")) + "?=";
        } else {
            fileName = URLEncoder.encode(fileName, "UTF-8");
        }
        return fileName;
    }

    // 下载流
    public InputStream getTargetFile() {
        String blogTitle = (String) application.get("blog_title");
        byte[] bytes = ArticleUtils.articlesToHTML(articleService.findAllArticles(), blogTitle);
        return new ByteArrayInputStream(bytes);
    }

}

Struts2配置文件

<action name="export" class="exportAction">
    <result type="stream">
        <param name="inputName">targetFile</param>
        <param name="contentType">text/html</param>
        <param name="contentDisposition">attachment;filename=${fileName}</param>
    </result>
</action>

© 著作权归作者所有

共有 人打赏支持
Harmel
粉丝 9
博文 33
码字总数 14582
作品 0
武汉
程序员
wordpress博客批量导入OSchina博客

wordpress博客批量导入OSchina博客 Wordpress有同步文章到百度hi空间、新浪博客等的插件,没有同步到OSchina博客的插件,而OSChina也没有提供博客导入的功能。就简单用代码(java)实现了这功能...

youthflies
2013/09/28
0
4
oschina导出博客获取图片

oschina通过“博客导出”功能可以导出不带图片的html文档,img标签中的src全部指向oschina,如何获取这些博客中的图片: 1、解析出导出博客的图片地址,下载图片,为图片命名并修改src属性值...

樂天
2013/01/25
0
0
OSCHINA 博客新增导出所有文章的功能

继年前刚推出的使用 Live Writer 写博客的功能后。 OSCHINA 的博客新增导出所有文章的功能,进入个人空间管理 -> 博客管理 -> 博客导出,便会弹出下载对话框,备份的文件是 html 格式,可以直...

红薯
2012/01/25
3.2K
34
介绍一款开源的类Excel电子表格软件

Excel一直以霸主的地位,占据了Windows桌面表格软件市场No 1,与此同时,Office套装产品几乎成为了IT行业的标配办公技能。有无类似Excel的桌面程序,绿色版,实现基本的数据编辑功能呢? 假如...

葡萄城控件技术团队
2014/10/09
2.8K
2
【白话设计模式五】工厂方法模式(Factory Method)

白话设计模式 工厂模式 单例模式 【白话设计模式一】简单工厂模式(Simple Factory) 【白话设计模式二】外观模式(Facade) 【白话设计模式三】适配器模式(Adapter) 【白话设计模式四】单例模式...

陶邦仁
2016/02/19
413
0
osc动弹里的@功能和#功能 实现方案

各位,我想做一个博客方面的功能,比如我在文章里有 oschina 的关键字,会自动链接到我的站点下的oschina百科里,这样的功能如何实现?类似osc动弹里的@功能和#功能。 谢谢!...

夕水溪下
2012/12/04
243
2
OSCHINA 空间改版上线,附改动记录

今天(不对,应该是昨天了)不是什么好日子,因为我正在准备升级的时候,机房网络断了一个小时,我很不爽+无奈。 说是12点准时开始升级,其实提前了两三分钟,这点 @zhiwei 有提到过。 此次空...

红薯
2012/02/26
6.1K
79
【白话设计模式十一】生成器模式(Builder)

白话设计模式 工厂模式 单例模式 【白话设计模式一】简单工厂模式(Simple Factory) 【白话设计模式二】外观模式(Facade) 【白话设计模式三】适配器模式(Adapter) 【白话设计模式四】单例模式...

陶邦仁
2016/03/30
377
0
ui-grid 使用讲解

在ui-grid 导出pdf 时可能会出现中文字符无法显示问题,解决方法看这篇博客: http://my.oschina.net/gmd/blog/714911 html代码: ui-grid-edit: grid 编辑指令; ui-gird-pagination : gri...

whitelover
2016/05/06
12.5K
23
一套Semantic-UI的前端界面

从个人使用上感觉Twitterd的Bootstrap库太复杂,语义也不明确,遂选择了Semantic-UI,做了一个类似每日赚的界面,其中均已实现按钮响应事件,且适配大部分移动设备, 具体功能如赚钱,师徒,...

贺路的路
2016/06/02
269
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mybatis中session.getMapper方法源码分析

0开始代码AuthorMapper mapper = session.getMapper(AuthorMapper.class); 1 DefaultSqlSession类 @Override public <T> T getMapper(Class<T> type) { //最后会去调用MapperRegistry.getMap......

writeademo
4分钟前
0
0
spring cloud zuul网关的作用

zuul一般有两大作用,1是类似于Nginx的网址重定向,但zuul的重定向的一般是整个spring cloud里在Eureka注册中心的模块. zuul: ignored-services: '*' sensitiveHeaders: routes: ...

算法之名
4分钟前
0
0
java按比例之原图生成缩略图

package com.wxp.test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.imageio.ImageIO; import sun.......

恋码之子
14分钟前
0
0
SpringCloud 微服务 (十五) 服务容错 Hystrix

壹 工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直接没用了的情况,这种情况称为雪崩效应 有A服务调用B服务,B服...

___大侠
16分钟前
0
0
Spring框架中的设计模式(五)

Spring框架中的设计模式(五) 通过以前的4篇文章,我们看到Spring采用了大量的关于创建和结构方面的设计模式。本文将描述属于行为方面的两种设计模式:命令和访问者。 前传: Spring框架中的...

瑞查德-Jack
19分钟前
0
0
解决phpstorm运行很卡问题!

phpStorm一旦达到这个临界值,所有智能提示、自动补全都失效了 这TM就很尴尬了,顿时感觉自己就是个废人了,纯手写代码跟便秘一样 众所周知phpStorm基于JAVA,那么这个内存限制肯定跟JAVA的虚...

sjcehui2010
21分钟前
0
0
javascript前端AES加密解密

参考了一下网上的代码加上自已的一些想法,修改,key也可以是中文, 要引入一个aes.js的js文件。 html代码 <html> <head> <title>AES加解密</title> <meta http-equiv="Content-Type"......

oisan_
25分钟前
0
0
MacOS和Linux内核的区别

有些人可能认为MacOS和Linux内核有相似之处,因为它们可以处理类似的命令和类似的软件。甚至有人认为苹果的MacOS是基于linux的。事实上,这两个内核的历史和特性是非常不同的。今天,我们来看...

六库科技
29分钟前
0
0
Vue.js-自定义事件例子

自定义组件的 v-model 2.2.0+ 新增 一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的。m...

tianyawhl
33分钟前
0
0
RobotThread.cpp

#include "RobotThread.h"RobotThread::RobotThread(int argc, char** pArgv, const char * topic) :m_Init_argc(argc), m_pInit_argv(pArgv), m_topic(topic){/** ......

itfanr
36分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部