RSS 与 Atom
Spring Web MVC 提供了对 RSS 和 Atom 摘要(Feeds)的内置支持。它基于 ROME 项目,允许你通过简单的视图类来生成这些 XML 格式的数据。
注意
从 Spring Framework 7.0 开始,org.springframework.web.servlet.view.feed 包中的内置视图类(如 AbstractRssFeedView)已被弃用。官方建议通过自定义视图类型或在 Web 处理器(Handler)中直接渲染来代替。
核心组件
生成的 Feed 视图主要通过继承以下抽象类实现:
- AbstractAtomFeedView: 用于生成 Atom 摘要。
- AbstractRssFeedView: 用于生成 RSS 2.0 摘要。
两者都继承自 AbstractFeedView。
实现示例 (基于 ROME)
在使用这些视图之前,你需要确保项目中包含 ROME 库的依赖。
1. 创建 RSS 视图类
你需要实现 buildFeedMetadata 来设置 Feed 的基本信息,以及 buildFeedItems 来填充具体内容。
java
public class MyRssView extends AbstractRssFeedView {
@Override
protected void buildFeedMetadata(Map<String, Object> model, Channel feed,
HttpServletRequest request) {
feed.setTitle("Spring 官方新闻");
feed.setDescription("来自 Spring 社区的最新动态");
feed.setLink("https://spring.io");
}
@Override
protected List<Item> buildFeedItems(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) {
List<Item> items = new ArrayList<>();
Item item = new Item();
item.setTitle("Spring Framework 7.0 发布");
item.setLink("https://spring.io/blog/7.0");
items.add(item);
return items;
}
}kotlin
class MyRssView : AbstractRssFeedView() {
override fun buildFeedMetadata(model: Map<String, Any>, feed: Channel,
request: HttpServletRequest) {
feed.title = "Spring 官方新闻"
feed.description = "来自 Spring 社区的最新动态"
feed.link = "https://spring.io"
}
override fun buildFeedItems(model: Map<String, Any>, request: HttpServletRequest,
response: HttpServletResponse): List<Item> {
val item = Item().apply {
title = "Spring Framework 7.0 发布"
link = "https://spring.io/blog/7.0"
}
return listOf(item)
}
}2. 控制器映射
控制器负责返回该视图的实例或逻辑名称。
java
@GetMapping("/rss")
public View getRssFeed() {
return new MyRssView();
}现代方案:直接渲染 (Direct Rendering)
由于 Spring 7.0 弃用了上述视图类,现在更推荐的做法是在控制器中通过 HttpMessageConverter 直接生成内容,这通常配合 ROME 提供的序列化能力。
java
@GetMapping(value = "/feed/atom", produces = MediaType.APPLICATION_ATOM_XML_VALUE)
@ResponseBody
public SyndFeed getAtomFeed() {
SyndFeed feed = new SyndFeedImpl();
feed.setFeedType("atom_1.0");
feed.setTitle("我的博客");
// ... 添加内容
return feed;
}补充教学
1. 什么是 RSS 和 Atom?
它们都是基于 XML 的内容同步协议。
- RSS (Really Simple Syndication): 历史更为悠久,简单直观,被大多数阅读器支持。
- Atom: 设计更晚,试图解决 RSS 规范的不一致性问题,功能更强大(支持更复杂的元数据和内容类型)。
2. 为什么在 MVC 中处理?
虽然可以用简单的字符串模版生成 XML,但使用 Spring 视图或 ROME 对象可以确保生成的 XML 符合规范,并能自动处理字符编码、Media Type(application/rss+xml)等 HTTP 细节。
3. 内容协商 (Content Negotiation)
你可以配置 Spring,使同一个 URL 根据扩展名返回不同的视图。
/news.html-> 返回网页视图。/news.rss-> 返回 RSS 视图。/news.atom-> 返回 Atom 视图。 这通过ContentNegotiationManager进行统一管理,是构建多端兼容应用的常用手段。