Bevor Sie anfangen, müssen Sie die Übung 1.2: Konzeptionelle Unterschiede zwischen den APIs ausführen.
In dieser Übung lernen Sie die Unterschiede bei der Codierung der Java-Klassen zwischen den beiden Portlet-APIs kennen. Untersuchen Sie die beiden Versionen der Java-Klasse BookmarkPortlet. Beachten Sie die Hauptunterschiede zwischen den beiden APIs:
Die beiden APIs importieren unterschiedliche Portletklassen.
import org.apache.jetspeed.portlet.*;
import javax.portlet.*;
Die beiden APIs erben von unterschiedlichen Klassen. Die IBM Portlet-API erweitert org.apache.jetspeed.portlet.PortletAdapter, wodurch eine Standardimplementierung der Schnittstelle org.apache.jetspeed.portlet.Portlet bereitgestellt wird. Diese Portletklasse erweitert HttpServlet, so dass IBM Portlets eine Art Servlet darstellen. Die JSR 168-Portlet-API stellt eine Klasse javax.portlet.GenericPortlet bereit, die die Schnittstelle javax.portlet.Portlet implementiert.
public class BookmarkPortlet extends PortletAdapter implements ActionListener
public class BookmarkPortlet extends GenericPortlet
Die Namen der Anforderungs- und Antwortobjekte der Methoden render (JSR 168-API) bzw. service (IBM API), beispielsweise doView() und doEdit(), unterscheiden sich. Die IBM Portlet-API verwendet die Objekte PortletRequest und PortletResponse. Die JSR 168-API dagegen verwendet die Objekte RenderRequest und RenderResponse. RenderRequest und RenderResponse erweitern jeweils die Objekte PortletRequest und PortletResponse und stellen eine einheitliche Funktionalität bereit.
public void doEdit(PortletRequest request, PortletResponse response)
public void doEdit(RenderRequest request, RenderResponse response)
Die IBM Portlet-API schließt JSP-Dateien mit dem Objekt PortletContext ein. Die JSR 168-Portlet-API verwendet dazu das Objekt PortletRequestDispatcher. Bei der Einschließungsaktion wird die angegebene JSP-Datei aufgerufen.
getPortletConfig().getContext().include(EDIT_JSP, request, response);
PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(jspName);
rd.include(request, response);
Die IBM Portlet-API speichert Benutzerdaten in einem Objekt PortletData. Die JSR 168-Portlet-API speichert ähnliche Informationen in einem Objekt PortletPreferences.
PortletData prefs = portletRequest.getData()
PortletPreferences prefs = renderRequest.getPreferences()
Bei der IBM Portlet-API muss die Java-Klasse die Schnittstelle ActionListener durch die Bereitstellung einer Methode actionPerformed() implementieren. Bei der JSR 168-Portlet-API muss die Java-Klasse eine Methode processAction() bereitstellen. Ein Listener ist nicht erforderlich.
public void actionPerformed(ActionEvent event) throws PortletException
public void processAction(ActionRequest request, ActionResponse response)
Mit Hilfe der Namensbereichscodierung wird sichergestellt, dass die in einem Portlet verwendeten Variablen innerhalb des Portalcontainers eindeutig sind. Die nachstehenden Auszüge zeigen auch Methoden zur Namensbereichscodierung zur Verwendung in einer JSP-Datei an.
in einer Java-Klasse: PortletResponse.encodeNamespace()
in einer JSP-Datei: <portletAPI:encodeNamespace/>
in einer Java-Klasse: RenderResponse.getNamespace()
in einer JSP-Datei: <portlet:namespace/>
Nun sind Sie bereit für die Übung 1.4: Unterschiede zwischen den Implementierungsdeskriptoren vergleichen.