Bereitstellung von RSS-Content mit JSP und Javascript

(http://www.zdnet.de/magazin/39135056/bereitstellung-von-rss-content-mit-jsp-und-javascript.htm)

von Brian Schaffner, 26. Juli 2005

RSS-Feeds für JSP-basierte Websites lassen sich ganz einfach generieren. Dieser Artikel zeigt eine Lösung, mit der man rasch und einfach RSS-Feeds für andere Websites bereitstellen kann.

Zahlreiche Websites liefern nützlichen Content zur Bereitstellung und Verteilung an andere Sites, so auch ZDNet. ZDNet verfügt außerdem über eigene RSS-Feeds[1], mit denen Webentwickler Content in ihre Sites integrieren können.

Das Erstellen von RSS-Feed ist die eine Sache, deren allgemeine Bereitstellung eine völlig andere. In diesem Artikel wird eine Lösung vorgestellt, mit der man rasch und einfach RSS-Feeds für andere Websites bereitstellen kann.

Kurze Einführung zu RSS

Wer sich bereits mit RSS auskennt, kann diesen Abschnitt überspringen. Für alle anderen Leser werden hier die Grundlagen von RSS beschrieben.

RSS ist, einfach gesagt, eine XML-Grammatik zur Beschreibung von Fremd-Content. Content ist natürlich ein weit gefasster Begriff. Für diesen Artikel sind unter Content Artikel zu verstehen, die auf einer Nachrichten-Website veröffentlicht werden. Die Site liefert Content in Form von Artikeln, die an andere Websites bereitgestellt und verteilt werden können. Die RSS-XML-Grammatik beschreibt die Überschriften und Einleitungen der Artikel und liefert Informationen zur Verknüpfung mit dem kompletten Content.

RSS-XML-Dokumente bestehen aus Definitionen. Auf der obersten Ebene befindet sich der Channel. Alle Content-Elemente beziehungsweise Artikel in einem RSS-Feed gehören zu einem Channel. Häufig besteht ein RSS-Feed aus einem einzelnen Channel, der sämtliche Artikel umfasst. Der Channel enthält Informationen wie den Titel und eine Beschreibung des Artikels, Bilder der Content-Quelle sowie eine Verknüpfung zu der Quelle. Listing A zeigt ein Beispiel des RSS-Feeds von builderau.com.au.

Listing A

Zwei Komponenten stellen den Feed für andere Websites bereit. Die unmittelbare Komponente beantwortet die Frage nach dem Verfahren der Content-Bereitstellung an die Endbenutzer. Die zusätzliche Komponente löst die Frage nach dem Verfahren der Generierung des für die Endbenutzer bereitzustellenden Contents. Das Ziel besteht darin, mithilfe eines einfachen Javascript-Codes einen formatierten Feed direkt an einen Endbenutzer zu erzeugen. Innerhalb der HTML-Seite müsste man eine einzelne Zeile wie die folgende einfügen können:

In diesem Fall verweist das Scriptlet auf eine JSP-Seite, die die RSS-Überschriften darstellt. Die erste Java-Komponente ist also das Javascript, das den Feed auf der Seite des Benutzers bereitstellt. Die zweite Komponente ist das JSP, das ausgehend von einem RSS-Dokument das Javascript erstellt.

Ausgangspunkt Ergebnis

Zunächst soll hier die Javascript-Ausgabe untersucht werden. Das verwendete JSP wird eine Ausgabe erzeugen, die derjenigen in Listing B ähnelt.

Listing B

Dieses Script benutzt das Dokument-Objekt, um HTML an den Browser zu schreiben. Mit anderen Worten, das oben genannte Scriptlet fungiert im Grunde wie eine clientseitige HTML-Einfügung, die vom Browser des Benutzers aus ausgeführt wird. Wenn der Browser das Scriptlet-Tag sieht, ruft er die URL in der Quelle auf und führt die Ausgabe als Javascript aus. Das Javascript stellt in diesem Fall die als HTML dargestellten RSS-Überschriften dar. Eine weitere Anforderung an den hier verwendeten Feed lautete, dass er parametergesteuert sein soll. Es gibt drei Parameter, die für diese Seite festgelegt werden können:

Tabelle A: Feed-Parameter

Parameter Beschreibung Gültige Werte Standardwert
1 bis 10 10
feed gibt an, welcher Feed angezeigt werden soll 1 oderr 2
desc gibt an, ob Überschriften-
beschreibungen angezeigt werden sollen
ja, nein nein

Nun da klar ist, wie die Eingabe für das verwendete JSP (ein RSS-Feed) und die Ausgabe aussieht (die HTML-basierten Überschriften als Javascript), kann man den Code schreiben, der den Feed bereitstellt. Der RSS-Parser bestimmt die Inhalte der Seite, wie man in der hier im Zip-Format verfügbaren Datei serveFeed.jsp[7] erkennen kann.

Bei der Durchsicht des Codes fallen einige Besonderheiten auf. So wurde beispielsweise eine lokale Klasse innerhalb der JSP-Seite definiert. Dafür gibt es zwei Gründe: Einerseits sollte das Programm eine gewisse Struktur und Modularität erhalten, was allerdings auch mit einer Klasse außerhalb der JSP-Seite möglich gewesen wäre. Zudem sollte dieses gesamte Tool jedoch auch vollständig in einer einzelnen JSP-Seite verkapselt werden.

Auffällig ist auch, dass der eigentliche Code für die JSP-Seite nur wenige Zeilen umfasst. Im Grunde wird lediglich die FeedServer-Klasse initiiert, der Feed ausgehend von den Eingabe-Parametern generiert und schließlich die Ausgabe erzeugt.Das Instantiieren der Klasse dient der Schaffung gewisser Voraussetzungen. Zum einen werden so die Standardwerte für die verwendeten Parameter initialisiert. Zum anderen werden die benötigten Feed-Definitionen erstellt. Anschließend ruft man die generateFeed()-Methode auf. Dann wechselt man in das HttpServletRequest-Objekt, sodass die Klasse auf die Parameter zugreifen kann, die in der Anfrage-URL bereitgestellt werden.

Die Methode generateFeed() erstellt einen neuen StringBuffer für die Ausgabe, übernimmt die Parameter, parst das XML-Dokument (den RSS-Feed) und erstellt die Ausgabe. Bei der Übernahme der Parameter werden gewisse grundlegende Überprüfungen durchgeführt und Standardwerte verwendet, wenn ein Parameter nicht gültig ist. Der Dokument-Parser verwendet einen einfachen DocumentBuilder zum Parsen des Feeds auf Basis der URL.

Die URL für jeden Feed wird in einer HashMap gespeichert. So kann man die spezifische URL des Feeds vom Benutzer abstrahieren.

Auch das Erstellen der Ausgabe ist recht einfach. Hierfür gibt es eine kleine Hilfsmethode namens getElementValue(), die zum Extrahieren spezifischer Werte von dem XML-Dokument dient. Diese Methode wird mehrmals von der Methode createOutputFromXMLDoc() aufgerufen, um auf die zur Erstellung der bereitgestellten Ausgabe benötigten Daten zuzugreifen.

Auf der obersten Ebene werden die Channel- und Bilddaten aus dem Feed extrahiert und ausgegeben, zusammen mit einigen Stylesheet-Definitionen. Dies geschieht in einer formatierten HTML-Tabelle, die in Javascript verpackt wurde. Dann geht man alle Elemente der Überschriften durch und hängt die Verknüpfung und Beschreibung (sofern aktiviert) für die Überschrift an.

Zuletzt wird die Ausgabe zurück an den Benutzer geschickt, zur Anzeige auf dessen Browser. Es gibt einige Dinge, auf die man bei Verwendung des hier vorgestellten Ansatzes achten sollte. Eines davon ist der Einsatz der lokalen Klasse in der JSP-Seite. Nach Durchsicht des Codes und einigen Überlegungen zu seiner Gestaltung, wurde der Code schließlich so belassen, wie er hier zu sehen ist. Eine der Fragen, die sich dabei stellten, war ob die Klasse die Anfrage auf Grundlage diskreter Parameter verarbeiten sollte - wie im Folgenden

generateFeed(feedType, nHeads, showDesc)

- oder ob weiterhin das HttpServletRequest an die Methode weitergegeben werden sollte. Einerseits schien eine fortgesetzte Weitergabe des HttpServletRequest eng mit dem JSP verknüpft. Dies bedeutet: Selbst wenn man die Klasse aus dem JSP herausnimmt, ist sie noch immer über die Servlet-Schnittstelle verknüpft. Andererseits war zu bedenken, dass durch eine vollständige Weitergabe des HttpServletRequest anstelle diskreter Parameter die Abkopplung auf andere Weise erfolgen würde.

Beispielsweise müsste man die diskreten Parameter erst im JSP parsen bevor sie an die Klasse versendet werden. Wenn man neue Parameter hinzufügt (oder die bestehenden verändert), müsste man sowohl im JSP als auch in der Feed-Parser-Klasse eine Änderung vornehmen. Durch Weitergabe des gesamten HttpServletRequest-Objekts lassen sich dagegen die Änderungen auf die Feed-Parser-Klasse beschränken. Mit anderen Worten: Man muss die JSP-Seite nicht ändern, da sie lediglich die Parser-Klasse aufruft, die gesamte Anfrage versendet und die Ergebnisse ausgibt.

Als Weiterentwicklung könnte man mit der Code-Basis einen RSS-Aggregator erstellen. Indem man die Klasse so verändert, dass sie mehrere RSS-Feeds aufruft, und die HTML-Ausgabe entsprechend anpasst, könnte man eine praktische Überschriftenliste aus mehreren Quellen erstellen.

URLs in diesem Artikel:
[1] = http://www.zdnet.de/service/rss_feeds.htm
[2] = http://cnn.com//
[3] = http://cnn.com/2004/WORLD/americas/02/26/haiti.revolt/index.html
[4] = http://cnn.com/2004/WORLD/europe/02/26/macedonia.crash/index.html
[5] = http://cnn.com/2004/WORLD/asiapcf/02/26/nkorea.talks.thurs/index.html
[6] = http://cnn.com/2004/WORLD/asiapcf/02/26/afghan.aidworkers.ap/index.html
[7] = http://www.zdnet.de/i/bld/program/2005/07/serveFeed.zip