Ganz allgemein waren und sind Portale Einstiegsseiten ins Internet. In ihrer ursprünglichen Form gliedern sie eine Vielzahl von Informationen in Themenbereiche und stellen Suchfunktionen zur Verfügung, um so den Nutzern die Orientierung und Navigation zu erleichtern. Die unterschiedlichen Anforderungen verschiedener Nutzer führten dazu, dass viele Portale die ursprünglich statischen Seiten um Möglichkeiten der Personalisierung ergänzt haben. Besonders im Unternehmenskontext fand eine weitere Dynamisierung der Seiten dadurch statt, dass die Inhalte der dargestellten Themenbereiche sich nach Präferenzen und Berechtigungen des angemeldeten Benutzers richten. Dabei können die dargestellten Inhalte aus anderen IT-Systemen im Unternehmen stammen. Die Single-Sign-On-(SSO-)Funktionalität eines Portals stellt sicher, dass für den Zugriff auf diese Systeme nach der Anmeldung am Portal keine weiteren Eingaben von Nutzernamen oder Kennwörtern erforderlich sind [1]. Da Inhalte aus anderen Systemen in den seltensten Fällen als HTML-Fragmente zur Verfügung stehen, müssen sie von so genannten Portalanwendungen für die Darstellung im Portal aufbereitet werden. Über die Portalanwendungen bzw. deren Anzeigekomponenten ist neben der Darstellung von Informationen dann auch eine Interaktion mit den angebundenen Systemen möglich. Aus dieser kurzen Charakterisierung lassen sich bereits die zentralen Komponenten bzw. Dienste eines Portals ableiten. Dazu gehören ein Layout- und Struktur-Management, eine Benutzer- und Rechteverwaltung, SSO-Unterstützung und die Administration der Portalanwendungen. Das Struktur-Management definiert den grundlegenden Aufbau des Portals und die Navigationselemente. Das Layout-Management bestimmt die Zusammenstellung (Aggregation) der einzelnen Portalseiten aus den verfügbaren Inhalten. Für die Einbindung der Portalanwendungen muss das Portal eine Schnittstelle definieren, über die das Portal die darzustellenden Seitenfragmente anfordern (Rendering) bzw. an das Portal gerichtete Benutzeraktionen an die Portalanwendung weiterleiten kann.
Jetspeed-2
Jetspeed-2 [2] implementiert die beschriebene Architektur unter konsequenter Einhaltung eines komponentenorientierten Ansatzes auf Basis des Spring Framework [3]. Zentrales Element ist die Jetspeed Engine mit einer zugeordneten Pipeline, deren Komponenten (Valves) sukzessive unterschiedliche Aspekte der Anfrage bearbeiten. Am Anfang stehen die Prüfung von Zugriffsrechten und die Verarbeitung von Aktionen. Am Ende steht das Anfordern der Seitenfragmente von den Portalapplikationen. Komponenten der Pipeline dekorieren die Fragmente, d.h., versehen sie mit einem Rahmen von Steuerelementen und aggregieren sie entsprechend dem gewählten Layout (z.B. einspaltig, zweispaltig) auf der anzuzeigenden Portalseite. Dekoration und Layout werden bei Jetspeed-2 über Velocity Templates [4] oder JSPs gesteuert und sind über diese konfigurierbar. Verschiedene Arten der Dekoration können parallel definiert werden. Sie sind als Themen (Themes) beim Anlegen einer Portalseite nutzbar. Als Persistenzdienst nutzt Jetspeed-2 die Apache ObjectRelationalBridge (OJB) [5]. OJB bietet grundsätzlich die gleichen Möglichkeiten wie das bekanntere Hibernate. Hauptgrund für die Auswahl dürfte hier der Wunsch gewesen sein, durchgängig ASF-Komponenten für die Implementierung zu nutzen. Jetspeed-2 kann über die Website des Projekts portals.apache.org/jetspeed-2/ heruntergeladen werden. Es steht eine Derby- und eine MultiDb-Version zur Verfügung. Erstere integriert eine vorkonfigurierte Derby-Datenbank, Letztere kann eines der von OJB unterstützten Datenbanksysteme (HsqlDB, MySQL, Oracle, Postgres, DB2, Sybase, SQL Server) nutzen. Allerdings muss die jeweilige Datenbank bereits installiert sein und entsprechend den Jetspeed-2-Anforderungen konfiguriert werden. Für ein erstes Kennenlernen ist daher die Derby-Version die bessere Wahl. Mit 70 MB ist der Download nicht gerade klein. Dabei ist aber zu bedenken, dass die Datei neben dem Portal bereits eine Vielzahl von Portalapplikationen enthält.Installation und erste Schritte
Die Installation erfolgt durch Aufruf von java -jar Jetspeed2.0-derby-install.jar. Danach muss das Installationsverzeichnis (z.B. „Jetspeed2.0“) angegeben werden. Die angebotenen optionalen Portalapplikationen sollte man zum Kennenlernen mitinstallieren. Die Verzeichnisstruktur der fertigen Installation kommt jedem, der schon einmal mit Tomcat gearbeitet hat, sehr bekannt vor - letztlich ist Jetspeed-2 ein im Tomcat-Container laufendes Servlet. Entsprechend erfolgt auch der Start über den Aufruf von startup.sh (Unix) bzw. startup.bat (Windows) im Unterverzeichnis bin des Installationsverzeichnisses. Das Portal ist dann nach kurzer Wartezeit über http://localhost:8080/jetspeed/portal erreichbar. Je nach gewünschten Rechten kann man eines der vorkonfigurierten Logins admin/admin, manager/manager oder user/user für die Anmeldung nutzen. Nach der Anmeldung als Administrator zeigt das Portal den größten Funktionsumfang (Abb. 1).
|
Listing 1 - Testseite.psml
<?xml version="1.0" encoding="UTF-8"?><page id="/Testseite.psml" hidden="false" version="1.0"><!-- Im Editor geaendert/ergaenzt: --><title>First test page</title><metadata name=”title” xml:lang=”de”>Erste Testseite</metadata><short-title>Test Page</short-title><metadata name="short-title" xml:lang="de">Testseite</metadata><!-- Ende Aenderung --><defaults layout-decorator="tigris" portlet-decorator="tigris"/><fragment id="P-1090856bb75-10000" type="layout"name="jetspeed-layouts::VelocityTwoColumns"><fragment id="P-109085cde27-10001" type="portlet"name="jsf-demo::CalendarPortlet"><property name="row" value="0"/><property name="column" value="0"/></fragment><fragment id="P-109085cde2c-10002" type="portlet"name="j2-admin::LocaleSelector"><property name="row" value="0"/><property name="column" value="1"/></fragment></fragment><!-- Im Editor ergaenzt: --><security-constraints><security-constraint><roles>user</roles><permissions>view, edit</permissions></security-constraint></security-constraints></page>
JSR 168
Ein architektonischer Vorteil bei der Nutzung eines Portals liegt darin, dass es das Konzept komponentenorientierter Softwareentwicklung bis an die Benutzeroberfläche bringt. Traditionell endet die klare Aufteilung einer Applikation in Komponenten in der Applikationsschicht. In dieser Schicht können Bausteine noch völlig unabhängig voneinander entwickelt und dann integriert werden. Ist für eine Komponente eine Benutzerschnittstelle verfügbar, kann diese meistens nur für Testzwecke verwendet werden. Zu sehr weicht eine unabhängig realisierte Oberfläche von den Vorgaben für die Gesamtapplikation und von eventuell vorhandenen Oberflächen anderer Komponenten ab. Bestenfalls ist die Oberfläche auf Basis der für die Applikation gewählten Techniken realisiert und kann durch entsprechende Änderungen des Quellcodes angepasst und in die Implementierung der Präsentationsschicht integriert werden. Verwendet man aber für die Präsentationsschicht einer Applikation ein Portal, ist die Integration von Benutzeroberflächen einzelner Komponenten in die Gesamtapplikation leicht möglich, sofern sie als Portalapplikationen realisiert sind. Voraussetzung ist, dass ein API für die Einbindung der Portalapplikationen in das Portal definiert ist (und eingehalten wird). Für die Java/Java EE-Umgebung spezifiziert der JSR 168 ein solches API sowie ein Dateiformat, in dem die Portalapplikationen bereitzustellen sind. Analog zum Begriff Servlets definiert der JSR 168 eine einzelne Oberflächenkomponente, die auf einer Portalseite dargestellt wird, als Portlet. Eine Portalapplikation besteht aus einem oder mehreren Portlets, die zusammen die gewünschte Funktionalität zur Verfügung stellen. Die Laufzeitumgebung eines Portlets ist der Portlet-Container, der den Lebenszyklus des Portlets verwaltet und Dienste wie persistenten Speicher für (benutzerspezifische) Portlet-Präferenzen zur Verfügung stellt. Die Unterstützung des JSR 168 ist für Entwickler von Portalapplikationen die wichtigste Neuerung in Jetspeed-2. Jetspeed-2 integriert dazu den Pluto-Portlet-Container der Apache Software Foundation. Pluto ist die Referenzimplementierung des JSR 168 und trägt erheblich dazu bei, dass Jetspeed-2 alle Tests des Technology Compatibility Kit erfolgreich absolviert.Ein minimales Portlet
Das von einem Portlet zu implementierende Interface enthält lediglich vier Methoden:- init(PortletConfig config) ruft der Portlet-Container einmal nach dem Erzeugen des Portlets auf.
- processAction(ActionRequest request, ActionResponse response) wird vom Portal-Container aufgerufen, wenn der Benutzer eine Aktion im Darstellungsbereich des Portlets anwählt.
- render(RenderRequest request, RenderResponse response) muss den HTML-Code ausgeben, der den Beitrag des Portlets in seinem aktuellen Zustand zur angezeigten Portalseite bildet. Dabei sollte das Portlet den im Request übergebenen Portlet-Modus (View, Edit oder Help) und den Darstellungs-Modus (normal, maximized oder minimized) berücksichtigen.
- destroy() ruft der Portal-Container einmalig auf, wenn er das Portlet nicht mehr verwendet.
Listing 2 - HelloWorld.java
package de.mnl.portlets;import javax.portlet.GenericPortlet;import javax.portlet.RenderRequest;import javax.portlet.RenderResponse;import javax.portlet.PortletException;import java.io.PrintWriter;import java.io.IOException;/*** Das Hello World Portlet.*/public class HelloWorld extends GenericPortlet {public void doView(RenderRequest request, RenderResponse response)throws PortletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<div class=\"portlet-font\" "+ "style=\"font-size:200%;\">Hello World</div>");}}
Listing 3 - web.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><display-name>Portlet Beispiel</display-name></web-app>
<?xml version="1.0" encoding="UTF-8"?><portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsdhttp://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" version="1.0"><portlet><description xml:lang="en">Hello World</description><portlet-name>helloworld</portlet-name><display-name xml:lang="en">Hello World Portlet</display-name><portlet-class>de.mnl.portlets.HelloWorld</portlet-class><supports><mime-type>text/html</mime-type><portlet-mode>view</portlet-mode></supports><supported-locale>en</supported-locale><portlet-info><title>Hello World</title><short-title>Hello</short-title><keywords>Hello World</keywords></portlet-info></portlet></portlet-app>
URLs
Action URLs von Formularen bzw. Verweisziele, die das Portlet selbst referenzieren, können nicht direkt, auch nicht als relative URLs, ausgegeben werden. Jeder an das Portal gerichtete URL muss Informationen über das Portlet enthalten, auf die sie sich bezieht. Portlets müssen URLs daher vom Portal anfordern und um zusätzliche Parameter ergänzen....PortletURL url = response.createRenderURL();url.setParameter("zusatztext"," and Univers");out.println("<A HREF=\""+url.toString()+"\">Zusatztext anzeigen</A>");...
...String zusatz = request.getParameter("zusatztext");if (zusatz == null) { zusatz = ""; }out.println("<div class=\"portlet-font\" style=\"font-size:200%;\">"+ "Hello World" + zusatz + "</div>");...
Portlets und Bridges
Natürlich ist die Ausgabe von HTML-Code über println ziemlich umständlich. Normalerweise wird ein Portlet daher die Aufgabe der HTML-Erzeugung delegieren, z.B. an eine JSP (allgemein an ein beliebiges Servlet). Die Implementierung von doView besteht dann nur noch aus einem Aufruf:getPortletContext().getRequestDispatcher("/hello.jsp").include (request, response);
Fazit
Jetspeed-2 ist eine vollständige, JSR 168-konforme Portalimplementierung. Die vielfältigen Konfigurationsmöglichkeiten konnten im Rahmen dieses Artikels bestenfalls angedeutet werden. Die Implementierung von Darstellungskomponenten als Portlets stellt keine besondere Herausforderung dar. Schon das einfache Portlet Interface bietet mit der Trennung der Methoden zur Ausführung einer Aktion und der Generierung der Darstellung eine komfortablere Implementierungsbasis als das klassische Servlet Interface. Übergänge zu etablierten Frameworks vereinfachen die Realisierung von Portlets weiter. Portal-Services wie SSO und Portlet-Präferenzen bieten fertige Lösungen für Aufgaben, denen man bei der Implementierung von konfigurierbaren Oberflächen immer wieder begegnet. JSR 168-konforme Portale wie Jetspeed-2 sind damit eine gute Basis für eine effiziente Implementierung der Präsentationsschicht einer Anwendung. Die Entscheidung für die Nutzung eines Portals und die Auswahl einer bestimmten Implementierung muss dabei selbstverständlich - wie bei allen Komponenten - vor dem Hintergrund der spezifischen Anforderungen des zu realisierenden Projekts getroffen werden.Dr. Michael Lipp (mnl@mnl.de) ist Lösungsarchitekt bei einem Systemintegrator. Sein Aufgabenschwerpunkt liegt in der Konzeption und Umsetzung von Lösungsangeboten im Bereich Workflow/BPM auf Basis der Java EE-Archiktektur.
Links & Literatur
[1] Anja Kirchhof, Thorsten Gurzki, Henning Hinderer, Joannis Vlachakis: Was ist ein Portal?, Frauenhofer Institut Arbeitswissenschaft und Organisation, Whitepaper, 2004[2] portals.apache.org/jetspeed-2
[3] www.springframework.org
[4] jakarta.apache.org/velocity/
[5] db.apache.org/ojb/
[6] portals.apache.org/bridges/




