- 浏览: 185397 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
youngbird221:
楼主有答案了么
ERROR JDBCTransaction : Could not toggle autocommi -
xuyoubin1987:
谢了 支持楼主
Struts2+Spring2.5+Ibatis2.3图书管理 -
wx_hello:
哈哈。。谢啦。。
Struts2+Spring2.5+Ibatis2.3图书管理 -
zhuzhijia:
为啥跟图片的高度有关?请教
JavaScript——延迟加载技术 -
zhameng:
...
JavaScript——延迟加载技术
OPML也是最近才发现的一个东东,以前只知道解析Rss,前几天老总问我要这个东西的时候我才知道,还有OPML的存在。
什么是OPML呢?说白啦,就是把你的网站的RSS聚合在一起生成的一个OPML文件,主要也就是方便RSS文件的提交。
对OPML还没有做太深入的理解,在网上查了查,发现没有那个开源项目可以用的,有Jakarta下的一个开源项目可以使用(FeedParser),可是好像是项目还没有完成啦,在Apache里没有找到下载。还有一个Informa也可以做,不过从2004年之后就没有组织再对其进行更新和维护啦。
想来想去决定用FreeMarker做去,以模板的形式生成一个opml.ftl模板文件。模板文件如下:
完成所需要的模板文件后,就要对模板文件进行生成啦。我使用的技术是Struts2+Spring+Hibernate+Dwr实现的,生成文件的那点是使用Dwr去实现的。具体的生成代码如下:
上面方法中的参数是通过Dwr传递过来的,下面是页面JSP文件:
OPML是对Rss资源的整合,避免了反复提交Rss文件所带来的负担,从而提高Rss的可收录度,相信不久以后OPML和Rss可以更完美的结合,人们可以更好的使用Rss资源。
什么是OPML呢?说白啦,就是把你的网站的RSS聚合在一起生成的一个OPML文件,主要也就是方便RSS文件的提交。
对OPML还没有做太深入的理解,在网上查了查,发现没有那个开源项目可以用的,有Jakarta下的一个开源项目可以使用(FeedParser),可是好像是项目还没有完成啦,在Apache里没有找到下载。还有一个Informa也可以做,不过从2004年之后就没有组织再对其进行更新和维护啦。
想来想去决定用FreeMarker做去,以模板的形式生成一个opml.ftl模板文件。模板文件如下:
<?xml version="1.0" encoding="utf-8" ?> <opml version="1.0"> <head> <title>${title}</title> <dateCreated>${pubDate}</dateCreated> <ownerName>${owner}</ownerName> <ownerEmail>${email}</ownerEmail> <description>${title}</description> <createdBy>${builder}</createdBy> <link>${link}</link> </head> <body> <outline title="${title}" text="${title}" opml="" kind="nkPath"> <#list typeList as type> <outline title="${type.title}" text="${type.title}" type="rss" xmlUrl="${buildPath}/news/rss/${type.typecode}.xml" interval="60" itemMax="400" htmlUrl="" description="${type.title}" kind="nkFeed" /> </#list> </outline> </body> </opml>
完成所需要的模板文件后,就要对模板文件进行生成啦。我使用的技术是Struts2+Spring+Hibernate+Dwr实现的,生成文件的那点是使用Dwr去实现的。具体的生成代码如下:
public String opmlBuild(String typeCode, String fileName, String owner, String email, String builder, String link, String buildPath, HttpServletRequest request, HttpServletResponse response) { String result = ""; try { response.setContentType("text/opml"); response.setCharacterEncoding("utf-8"); String ftlPath = request.getSession().getServletContext() .getRealPath("/") + "//WEB-INF//ftl//"; String path = request.getSession().getServletContext().getRealPath( "/"); // String ftlPath = ftl + "//ftl//"; config.setDirectoryForTemplateLoading(new File(ftlPath)); // 得到模板文件 Template template = config.getTemplate("opml.ftl"); // 设置编码格式 template.setEncoding("utf-8"); YxNewsType type = typeNews.getTypeByTypeCode(typeCode); List<YxNewsType> typeList = typeNews .getAllChildTypeByTypeCode(typeCode); if (typeList != null) { Map root = new HashMap(); //设置发布的OPML的标题 root.put("title", type.getTitle()); //设置OPML的发布时间 root.put("pubDate", new Date().toString()); //设置OPML的所有者 root.put("owner", owner); //设置OPML的发布者的EMail地址 root.put("email", email); //设置OPML的创建人 root.put("builder", builder); //设置OPML文件的连接地址,可以直接你网站的连接地址 root.put("link", link); //设置自己的创建Rss的连接地址 root.put("buildPath", buildPath); root.put("typeList", typeList); // 设置到生成的文件名称 String file = ""; //判断当前操作系统,如果是Windows系统的做就是反斜杠,如果是Linux系统就使用正斜杠 Properties properties = System.getProperties(); Object object = properties.get("os.name"); // System.out.println("当前操作系统:" + String.valueOf(object)); if ("Windows".equals(String.valueOf(object))) { file = path + "\\rss\\opml\\" + fileName + ".opml"; } else { file = path + "//rss//opml//" + fileName + ".opml"; } //设置要生成的文件 Writer out = new OutputStreamWriter(new FileOutputStream(file), "utf-8"); template.process(root, out); //清理写入流 out.flush(); // 关闭流文件 out.close(); result = "buildSuccess"; } else { result = "noChild"; } } catch (Exception e) { result = "error"; e.printStackTrace(); } return result; }
上面方法中的参数是通过Dwr传递过来的,下面是页面JSP文件:
<%@ page language="java" pageEncoding="GBK"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>信源管理</title> <link rel="stylesheet" href="${pageContext.request.contextPath}/common/css/admin/style.css" type="text/css" /> <script type="text/javascript" src="${pageContext.request.contextPath}/dwr/engine.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/dwr/util.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/dwr/interface/rssBuild.js"></script> <script type="text/javascript"> var typeCode; function showBuild(title,code){ //alert(title); typeCode = code; var doc = document.getElementById("buildOpml"); document.getElementById("tableTitle").innerHTML=title; document.getElementById("opmlName").value = ""; document.getElementById("nameMessage").innerHTML = "请以英文名称命名"; document.getElementById("startBuild").value = "生成OPML"; doc.style.display = "block"; } function buildOpml(){ owner = document.getElementById("opmlOwner").value; email = document.getElementById("opmlEmail").value; builder = document.getElementById("opmlBuilder").value; url = document.getElementById("opmlUrl").value; fileName = document.getElementById("opmlName").value; prefix = document.getElementById("opmlPrefix").value; msg = document.getElementById("nameMessage"); btnBuild = document.getElementById("startBuild"); if(""!=fileName){ msg.innerHTML = "<font color='green'>文件生成中,请等待……</font>"; btnBuild.disabled = true; btnBuild.value = "文件生成中"; rssBuild.opmlBuild(typeCode,fileName,owner,email,builder,url,prefix,callBackResult); }else{ msg.innerHTML = "<font color='red'>请填写你的OPML文件名称</font>"; } } function callBackResult(result){ msg = document.getElementById("nameMessage"); btnBuild = document.getElementById("startBuild"); if(result=="buildSuccess"){ msg.innerHTML = "<font color='green'>文件已经成功生成</font>"; btnBuild.disabled = false; btnBuild.value = "生成成功"; }else if(result=="noChild"){ msg.innerHTML = "<font color='red'>此类别没有子信息,无法生成</font>"; btnBuild.disabled = false; btnBuild.value = "没有子类可供生成"; }else{ msg.innserHTML = "<font color='red'>生成出现错误,请联系管理员</font>"; btnBuild.disabled = false; btnBuild.value = "生成失败"; } } function showHideDIV(){ var doc = document.getElementById("buildOpml"); doc.style.display =(doc.style.display == "none"?"block":"none"); } </script> </head> <body> <div id="container"> <table class="tableBorder" align="center" border="0" cellpadding="2" cellspacing="1" style="width: 98%;"> <tr> <th height="25" colspan="10"> 类别名称 </th> </tr> <tr> <s:iterator value="listType"> <td class="TableRow2"> <a href="javascript:showBuild('${title }','${typecode }');" style="text-shadow: none;"> <s:property value="title" /> </a> </td> </s:iterator> </tr> </table> <div id="buildOpml" style="display:none;"> <table class="tableBorder" align="center" border="0" cellpadding="2" cellspacing="1" style="width: 98%;"> <tr> <th colspan="3"> <div id="tableTitle"></div> </th> </tr> <tr> <td class="TableRow2">请输入OPML的所有者:</td> <td class="TableRow2"> <input type="text" id="opmlOwner" value="中国分告传媒" disabled="disabled"/> </td> <td class="TableRow2"> <div id="ownerMessage">请正确填写OPML的所有者</div> </td> </tr> <tr> <td class="TableRow2">请输入OPML所有者的联系邮箱:</td> <td class="TableRow2"> <input type="text" id="opmlEmail" value="zyj-jack@163.com"/> </td> <td class="TableRow2"> <div id="emailMessage">请正确填写邮箱地址</div> </td> </tr> <tr> <td class="TableRow2">请输入OPML创建者的名字:</td> <td class="TableRow2"> <input type="text" id="opmlBuilder" value="河南亿禧软件有限公司" disabled="disabled"/> </td> <td class="TableRow2"> <div id="builderMessage">请正确填写创建者</div> </td> </tr> <tr> <td class="TableRow2">请输入网站的连接URL:</td> <td class="TableRow2"> <input type="text" id="opmlUrl" value="www.fansgoo.com" disabled="disabled"/> </td> <td class="TableRow2"> <div id="urlMessage">请输入合法的网络地址</div> </td> </tr> <tr> <td class="TableRow2">请填写您生成文件前缀地址:</td> <td class="TableRow2"> <input type="text" id="opmlPrefix" value="http://www.fansgoo.com" disabled="disabled"/> </td> <td class="TableRow2">请填写您生成文件所在的位置</td> </tr> <tr> <td class="TableRow2">请输入您的生成的OPML名称:</td> <td class="TableRow2"><input type="text" id="opmlName" name="opmlName"/></td> <td class="TableRow2"><div id="nameMessage">请以英文名命名</div></td> </tr> <tr> <td class="TableRow2" colspan="3" align="center"> <input type="button" id="startBuild" value="生成OPML" onclick="buildOpml();"/> </td> </tr> </table> </div> <br /> <jsp:include page="admin_bottom.jsp" /> </div> </body> </html>
OPML是对Rss资源的整合,避免了反复提交Rss文件所带来的负担,从而提高Rss的可收录度,相信不久以后OPML和Rss可以更完美的结合,人们可以更好的使用Rss资源。
发表评论
-
服务器技术——网络负载均衡配置十步完成
2010-12-22 09:53 1825随着互联网的日渐扩大,网络技术的快速提高,现在越来 ... -
揭开Web开发者最初的困惑
2010-12-22 09:50 1281越来越多的Web开发 ... -
经典算法——鸡尾酒排序(冒泡算法改良)
2010-08-06 14:41 2503搞开发的人都需要积累一些经典算法,以备不时之须 ... -
ASP专栏——ASP生成静态文件
2010-07-16 14:15 2302对于Web开发人员来说,生成静态文件这个概念并 ... -
C#——通过XML读取左侧菜单实现Extjs菜单动态加载
2010-05-31 18:30 2853项目中使用到了Extjs,使用了Extjs的边框布 ... -
迅雷、快车、旋风解加密
2009-07-27 17:24 2106以前看一个朋友写过一个关于迅雷、快车、旋风的解加密工具 ... -
JSTL和Struts2谁才是真正的王道
2008-12-17 12:38 4355Struts1、struts2的标签都已经用的很久 ... -
报表--JFreeChart
2008-08-12 17:03 1330对于一个企业级的 ... -
以编程方式创建数据库表
2008-08-04 11:15 1614前几天下了个开源的论坛系统JForum,看了一下,此论坛系统是 ... -
电信拨号器
2008-07-18 08:58 1677公司用的是电信的网络,前段时间公司的电脑总是拨不上去号,自 ...
相关推荐
欢迎使用ReadWorldRSS阅读器 1 这个程序更改了我上回发布的《聚合新闻(RSS)阅读器》的一些错误。 2 新增了频道列表的拖放功能,及导入,导出(OPML)功能。 3 重新设计了一下界面 4 本程序是仿照《新郎点点通》...
Gregarius是国外一个RSS聚合程序,免费开源,具备良好的用户体验,易于操作和管理。可以把其当成RSS阅读器使用。 Gregarius是一个RSS/RDF/ATOM新闻聚合器支持OPML导入/导出,XHTML/CSS输出。 Gregarius包含一...
国内最好的开源PHP新闻聚合 1.支持RSS多核心切换,默认支持lastrss,simplepie,magpierss 2.支持 RDF,RSS,ATOM feeds 支持智能识别 3.基于浏览器Web端的前台浏览和后台管理,可在前台编辑,删除,锁定相关新闻 4.支持...
Sismics Reader 是一个 Google ... 支持 RSS 和 Atom 支持分类组织,并跟踪喜好的文章 提供 Web 和移动接口 RESTful Web API 全文搜索 OPML 导入导出 皮肤自定义 Android 应用 标签:Sismics
声明原作者版本: : 汉化版本: : 下载GitHub: : 本站下载: : 界面特征C-LX RSS是另一个基于Web的单用户RSS阅读器。它带有OPML和CronJobs支持。要求必需组件PHP> 5.5和具有PDO支持SQLite(或具有PDO支持MySQL)...
Podget 是一个简单的播客聚合器,针对作为预定的后台作业(即 cron)运行进行了优化,支持类别和文件夹、从 OPML 列表和 iTunes PCAST 文件导入服务器、导出 OPML 文件、自动创建和清理播放列表。 2016 年 6 月 ...
国内最好的开源PHP新闻聚合 1.支持RSS多核心切换,默认支持simplepie,...6.支持导入和导出OPML 7.可显示favicon 8.具有多种主题样式,现有default,bxna两套主题 9.支持Rewrite启用 10.生成SiteMAP0.9 11.多语言包
饲料聚合器一个 Django 1.8 应用程序,用于聚合 RSS 和 Atom 提要(行星)特征Python 2/3 兼容导入/导出 OPML 提要按供稿、作者或标签浏览帖子引导模板RSS 和 Atom 提要站点地图像 2004 年一样显示词云多个模板标签...
要使用它,请创建一个新的存储库,并添加opml文件名称为feeds.opml以及网站rss / atom feed的列表。 创建一个如下所示的github工作流以获取数据并将其放入内容分支 name: Schedule on: schedule: - cron: '*/5 * *...
国内功能最强大、内容最全面、用户群最大的RSS内容阅读和管理工具,从多个内容源聚合信息、即时更新、屏蔽垃圾广告、足不出户便知天下事新版v3.0增加了以下精彩的功能和服务:系统架构优化:使系统效率更高、速度更...
国内功能最强大、内容最全面、用户群最大的RSS内容阅读和管理工具,从多个内容源聚合信息、即时更新、屏蔽垃圾广告、足不出户便知天下事新版v3.0增加了以下精彩的功能和服务:系统架构优化:使系统效率更高、速度更...
用Rust编写的Atom / RSS阅读器。 这是一个个人项目,但是如果您对与可移植性相关的更改感兴趣,请告诉我。 一些基本问题 什么 命令行的准系统聚合器,强调可组合性。 为什么 我之所以喜欢该终端,有几个原因:应...
简单的饲料聚合服务,上面放糖。 产品特点 具有嵌入式数据库的单个可执行文件。 管理订阅源订阅。 使用文件导入/导出订阅源。 积极且可调的聚合过程。 单独管理Feed聚合。 使用可插拔过滤器系统对商品进行修改...
Feeder是一种RSS阅读器应用,可以将杂乱无序的信息聚合起来,进行高效阅读 Material Design的设计风格,界面,相互作用清爽简洁 应用内包含超过1,000,000条RSS源,可以利用搜索功能,方便地添加到自己的订阅列表中 ...
它支持从RSS和ATOM XML提要中下载播客,将文件分类到文件夹和类别中,从iTunes PCAST文件和OPML列表中导入URL,自动创建M3U和ASX播放列表以及自动清除旧文件。 它还具有针对MS Windows服务器上托管的播客的自动...
它是一个RSS阅读器,RSS聚合器,可读性工具,文章存档器,微博,社交图管理器和阅读列表管理器。 您可以使用它将所有提要发布到一个社交大纲(OPML)中,以便其他人可以轻松地一次订阅您所有的提要。 您可以在网上...
podStation是一个简单的RSS播客聚合器(或者我应该说一个podcatcher吗?)。 只需将您的供稿添加到主页中,或使用搜索工具即可感到高兴。 特点:*功能齐全的音频播放器,它在后台播放,并提供对播放速率(速度)的...
podStation是一个简单的RSS播客聚合器(或者我应该说一个podcatcher吗?)。 只需将您的供稿添加到主页中,或使用搜索工具即可感到高兴。 功能:*全局媒体控制支持*功能齐全的音频播放器,它在后台播放,并提供对...