Prima di iniziare, č necessario completare l'Esercizio 1.2: Differenze concettuali tra le API.
In questo esercizio verranno illustrate le differenze relative alla codifica delle classi Java tra le due API per portlet. Esaminando le due versioni della classe Java BookmarkPortlet, č possibile notare le seguenti differenze di base tra le due API:
Le classi di portlet importate dalle due API sono differenti.
import org.apache.jetspeed.portlet.*;
import javax.portlet.*;
Le due API ereditano da classi differenti. IBM portlet API estende org.apache.jetspeed.portlet.PortletAdapter che fornisce un'implementazione predefinita dell'interfaccia org.apache.jetspeed.portlet.Portlet. Questa classe portlet estende HttpServlet, pertanto i portlet IBM sono un tipo di servlet. JSR 168 portlet API fornisce una classe javax.portlet.GenericPortlet che implementa l'interfaccia javax.portlet.Portlet.
public class BookmarkPortlet extends PortletAdapter implements ActionListener
public class BookmarkPortlet extends GenericPortlet
I nomi degli oggetti richiesta e risposta per i metodi render (JSR 168 API) o service (IBM API), quali doView() e doEdit(), differiscono. IBM portlet API utilizza oggetti PortletRequest e PortletResponse; JSR 168 API utilizza oggetti RenderRequest e RenderResponse. RenderRequest e RenderResponse estendono, rispettivamente, gli oggetti PortletRequest e PortletResponse fornendo una funzionalitą comune.
public void doEdit(PortletRequest request, PortletResponse response)
public void doEdit(RenderRequest request, RenderResponse response)
IBM portlet API utilizza l'oggetto PortletContext per includere file JSP; JSR 168 portlet API utilizza l'oggetto PortletRequestDispatcher. L'azione di inclusione richiama il file JSP specificato.
getPortletConfig().getContext().include(EDIT_JSP, request, response);
PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(jspName);
rd.include(request, response);
IBM portlet API memorizza i dati utente in un oggetto PortletData. JSR 168 portlet API memorizza informazioni simili in un oggetto PortletPreferences.
PortletData prefs = portletRequest.getData()
PortletPreferences prefs = renderRequest.getPreferences()
In IBM portlet API, la classe Java deve implementare l'interfaccia ActionListener fornendo un metodo actionPerformed(). Utilizzando JSR 168 portlet API, la classe Java deve fornire un metodo processAction(); non č richiesto alcun listener.
public void actionPerformed(ActionEvent event) throws PortletException
public void processAction(ActionRequest request, ActionResponse response)
La codifica dello spazio nomi viene utilizzata per assicurare che le variabili utilizzate in un portlet siano univoche all'interno del contenitore del portale. Gli esempi riportati di seguito mostrano i metodi di codifica dello spazio nomi da utilizzare un file JSP.
in a Java class: PortletResponse.encodeNamespace()
in a JSP file: <portletAPI:encodeNamespace/>
in a Java class: RenderResponse.getNamespace()
in a JSP file: <portlet:namespace/>
A questo punto, č possibile iniziare l'Esercizio 1.4: Confronto delle differenze dei descrittori di distribuzione.