系列第五篇,整合改造版 ROME 庫(myrome)實現 RSS/Atom 統一解析,構建三欄式閱讀界面:左側訂閱樹、中間文章列表、右側正文詳情,支援雙擊跳轉原文。
getAuthor()、getPublishedDate() 返回 null 問題getSummary(int length)com.tgb.rssreader:myrome:1.0 (內部發布)
public class RomeReadRss {
public SyndFeed parseRss(String rssUrl) {
try {
URLConnection conn = new URL(rssUrl).openConnection();
// 繞過服務器 User-Agent 限制
conn.setRequestProperty("User-Agent",
"Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
XmlReader reader = new XmlReader(conn);
SyndFeedInput input = new SyndFeedInput();
return input.build(reader);
} catch (Exception e) {
log.error("RSS 解析失敗: " + rssUrl, e);
return null;
}
}
}
SyndFeed 存入 Session → 轉發 middle.jspSyndFeed 取對應 SyndEntry → 提取正文 → 轉發 content.jsp
<% SyndFeed feed = (SyndFeed) session.getAttribute("feed"); %>
<% List entries = feed.getEntries(); %>
<% for (int i = 0; i < entries.size(); i++) { %>
<% SyndEntry entry = (SyndEntry) entries.get(i); %>
<a href="servlet/ArticleServlet?articleIndex=<%=i%>"
target="contenthtml"
ondblclick="window.open('<%=entry.getLink()%>')"
title="<%=entry.getTitle()%>">
<li><%=entry.getTitle()%> <%=entry.getPublishedDate()%></li>
<li><%=((SyndContent)entry.getContents().get(0)).getSummary(30)%></li>
</a>
<hr>
<% } %>
<div id="content">
<%= request.getAttribute("content") != null ?
request.getAttribute("content") :
"歡迎使用 RSS 閱讀器!" %>
</div>
<script>
d = new dTree('d');
d.add(0,-1,'博客分組','','','','img/blog.png');
// 根據博客商動態設置圖標
// CSDN → img/csdn.png, 博客園 → img/cnblogs.png ...
</script>
| 模塊 | 技術選型 | 解決問題 |
|---|---|---|
| RSS 解析 | myrome (ROME 改造版) | 統一 RSS/Atom、修復字段缺失、摘要截取 |
| 跨域/反爬 | 設置 User-Agent 模擬瀏覽器 | 繞過服務器屏蔽 Java 默認 UA |
| 會話狀態 | HttpSession 存儲 SyndFeed | 避免重複解析,支援列表/詳情聯動 |
| 前端框架 | dTree + 原生 JS + Frameset | 輕量級三欄布局,無第三方依賴 |
| 雙擊跳轉 | ondblclick + window.open() | 區分單擊(框架內)與雙擊(新窗口原文) |

