AEM 6.2中ASRP博客文章RSS生成器制作及方案咨询
Hey Raj, great question! Let’s walk through your options for generating an RSS feed for your ASRP blog in AEM.
AEM does have built-in capabilities to generate RSS feeds, especially if your ASRP blog follows standard AEM Sites content structures:
- Leverage AEM’s Feed Servlet: AEM includes a default Feed servlet that can generate RSS feeds for pages with structured content lists. If your blog has a parent page that lists all ASRP posts (e.g., a blog landing page with references to individual post pages), you can often access the RSS feed by appending
.rssto the page URL. For example:http://your-aem-instance/content/your-blog/landing.rss. This works if your page component supports the RSS selector, which many OOTB AEM components do. - Use the OOTB Feed Component: Some AEM implementations include a pre-built Feed component that you can add to your blog landing page. This component lets you configure feed details (title, description) and select which content to include (e.g., recent posts), then outputs the RSS feed automatically.
Before jumping to custom code, test these OOTB options first—they might cover your basic needs without extra development.
If you need customizations like filtered content, custom RSS fields, or specific formatting that the OOTB tools don’t support, building a custom RSS generator is the way to go. Here’s how to approach it:
- Create a Custom Sling Servlet: Build a Sling Servlet mapped to a specific path/selector (e.g.,
/content/your-asrp-blog/rssor.rssselector on your blog page) that handles GET requests and outputs RSS XML. - Query Your Blog Content: Use AEM’s QueryBuilder API to fetch your ASRP blog posts (filter by content type, publication status, date, etc.).
- Build the RSS XML: Construct valid RSS 2.0 XML with all required fields (channel title, link, description, plus individual item details like title, link, description, and publication date).
- Set Proper Response Headers: Ensure the response uses the correct
Content-Type(application/rss+xml) and encoding.
Here’s a simplified example of what the servlet might look like:
@Component(service = Servlet.class, property = { "sling.servlet.paths=/content/your-asrp-blog/rss", "sling.servlet.methods=GET", "sling.servlet.extensions=rss" }) public class ASRPBlogRssServlet extends SlingSafeMethodsServlet { @Reference private QueryBuilder queryBuilder; @Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { // Configure response for RSS response.setContentType("application/rss+xml"); response.setCharacterEncoding("UTF-8"); PrintWriter writer = response.getWriter(); // Query ASRP blog posts (adjust parameters to match your content structure) Map<String, String> queryParams = new HashMap<>(); queryParams.put("path", "/content/your-asrp-blog/posts"); queryParams.put("type", "cq:Page"); queryParams.put("property", "jcr:content/isPublished"); queryParams.put("property.value", "true"); queryParams.put("sort", "jcr:content/publishDate"); queryParams.put("sort.order", "desc"); Query query = queryBuilder.createQuery(PredicateGroup.create(queryParams), request.getResourceResolver()); SearchResult searchResult = query.getResult(); // Build RSS XML writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); writer.println("<rss version=\"2.0\">"); writer.println("<channel>"); writer.println("<title>ASRP Blog Latest Posts</title>"); writer.println("<link>" + request.getRequestURL().toString().replace(".rss", "") + "</link>"); writer.println("<description>Latest updates from the ASRP Blog</description>"); // Iterate over posts and add RSS items for (Hit hit : searchResult.getHits()) { Page postPage = hit.getResource().adaptTo(Page.class); if (postPage == null) continue; PageContent postContent = postPage.getContent(); writer.println("<item>"); writer.println("<title>" + escapeXml(postContent.getTitle()) + "</title>"); writer.println("<link>" + postPage.getPath() + ".html</link>"); writer.println("<description>" + escapeXml(postContent.getDescription()) + "</description>"); writer.println("<pubDate>" + formatDate(postContent.getPublishDate()) + "</pubDate>"); writer.println("</item>"); } writer.println("</channel>"); writer.println("</rss>"); } // Helper to escape XML special characters private String escapeXml(String input) { if (input == null) return ""; return input.replace("&", "&") .replace("<", "<") .replace(">", ">") .replace("\"", """) .replace("'", "'"); } // Helper to format date per RSS spec (RFC 822) private String formatDate(Date date) { if (date == null) return new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z").format(new Date()); return new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z").format(date); } }
Start with the OOTB options—they’re quick to test and often sufficient for basic RSS needs. If you need more control over the feed’s content or structure, the custom servlet approach gives you full flexibility to tailor the feed to your third-party plugin’s requirements.
内容的提问来源于stack exchange,提问作者Raj Kumar Samala

