Génération d'une sortie

Découvrez comment les portlets utilisent les JSP pour générer un marquage, créer des URL vers les ressources de portlet, prendre en charge plusieurs unités, marquages et langues dans les portlets, et utiliser JSTL.

Dans l'exemple précédent, le portlet Hello World fournit un marquage en utilisant un objet Java PrintWriter. Cependant, la plupart des portlets génèrent leur sortie avec des JSP. Mais si le portlet doit convertir une source XML, il peut utiliser XSLT pour générer le marquage.

Utilisation du format JSP pour la création de marquage

Pour séparer l'affichage du portlet de ses fonctions principales, utilisez un fichier JSP. L'exemple de code ci-dessous représente le code JSP de la page de visualisation de l'exemple jsrHelloJSP.war. Tous les exemples de portlet sont accessibles à partir du catalogue de portlets en recherchant le code de navigation 1WP10017Z. Voir la rubrique Portlets modèles pour plus d'informations.

Figure 1. Exemple : JSP pour portlet Hello JSP (standard)

<%@ taglib uri="http://java.sun.com/portlet" prefix="portletAPI" %>
<%@ page session="false"%>

<p class="portlet-font">Hello JSP!</p>

Des JSP distincts peuvent exister pour fournir à l'interface utilisateur le support de modes de portlet supplémentaires, comme l'édition ou l'aide. L'assistant de portlet de base de Rational Application Developer permet de créer un portlet qui fournit des JSP pour certains des autres modes dans lesquels le portlet peut être appelé.

L'exemple suivant montre la méthode doView() fournie dans le modèle jsrHelloJSP.

Figure 2. Exemple : Source Java pour portlet Hello JSP (standard)

package com.ibm.wps.samples.jsr;

import javax.portlet.*;
import java.io.*;

public class HelloJSP extends GenericPortlet {

  public void init(PortletConfig portletConfig) throws UnavailableException, PortletException
  {
    super.init(portletConfig);
  }

  public void doView(RenderRequest request, RenderResponse response)
                                   throws PortletException, IOException {
    // set return content type
    response.setContentType("text/html");
    PortletContext context = getPortletConfig().getPortletContext();
    context.getRequestDispatcher("/jsp/View.jsp").include( request, response);
  }

}

Les points importants à retenir lorsque vous écrivez vos pages JSP sont :

  1. Par souci de cohérence dans la conception du portail, utilisez les spécifications de classe du portlet de la spécification JSR 168/JSR 286.
  2. Veillez à inclure la bibliothèque de balises appropriée pour obtenir la fonctionnalité requise dans vos JSP.
  3. Familiarisez-vous avec les instructions et les méthodes recommandées pour le marquage des portlets. Par exemple, tous les éléments nommés doivent être codés à l'aide de la balise <portletAPI:encodeNamespace> afin d'éviter tout conflit avec d'autres éléments nommés sur la page du portail.
  4. Les pages JSP du portlet ne peuvent pas établir directement de lien vers des ressources de l'arborescence de répertoires WAR du portlet.

Création d'adresses URL vers des ressources de portlet

Les pages JSP du portlet ne peuvent pas établir directement de lien vers du contenu (images, applets, autres JSP ou autres ressources, par exemple) au sein de l'arborescence de répertoires WAR du portlet. Elles recourent à la place aux services du conteneur de portlet pour créer des adresses URL de portlet à partir desquelles le contenu est accessible. Utilisez la méthode encodeURL() de PortletResponse pour accéder à du contenu figurant dans la structure WAR du portlet. Les exemples suivants sont utilisés dans les échantillons de portlet View World.

ibmViewWorld.war
Figure 3. JSP du portlet IBM avec fichier d'image

<img src='<%=portletResponse.encodeURL("images/earth.jpg")%>' 
     alt="Earth" />
jsrViewWorld.war

Pour les portlets standard, vous devez aussi ajouter le chemin d'accès au contexte du portlet par la requête :

Figure 4. JSP de portlet standard avec fichier d'image

<img src='<%=renderResponse.encodeURL(renderRequest.getContextPath() + 
       "/images/earth.jpg")%>' 
         alt="Earth" />

La chaîne renvoyée par la méthode encodeURL() retourne l'URL relative du contenu, sans le nom de l'hôte et les informations relatives au domaine.

Exemple multimédia

L'exemple suivant montre comment un fichier audio peut être inclus dans un JSP pour un portlet standard.

Figure 5. JSP de portlet standard avec fichier multimédia


<object 
   classid='<%=renderResponse.encodeURL(renderRequest.getContextPath() +
   "/audio/WakeUpSong.mp3")%>'
        type="audio/wav" width="300" height="18">
   <param name="controls" value="smallconsole" valuetype="data">
   <param name="autostart" value="true" valuetype="data">
   <param name="controller" value="true" valuetype="data">
</object>

Exemple d'applet

L'exemple suivant montre comment inclure une applet dans un JSP de portlet IBM.

Figure 6. JSP de portlet standard avec applet

<applet codebase='<%=response.encodeURL("applet")%>' 
        code="MyApplet.class" width="150" height="150">
    <param  name="timeout" value="3600">
    <param  name="border"  value="5">
    <param  name="font"   value="TimesRoman|BOLD|18">
    <param  name="bgcolor" value="ffffff">
</applet>

Utilisation de JSTL dans les JSP de portlet

L'exemple suivant montre comment utiliser JSTL pour extraire des chaînes traduites d'un regroupement de ressources dans vos JSP.

  • La bibliothèque de balises JSTL est incluse au début du JSP.
  • La balise <fmt:setBundle/> indique quel ensemble de ressources utiliser.
  • La balise <fmt:message/> indique la clé permettant de rechercher dans l'ensemble des ressources.
  • Pour la source d'image, la méthode encodeURL() est utilisée dans un scriplet Java.

<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
...
<fmt:setBundle basename="nls.reminder"/>
...
<img border='0'
     src='<%=response.encodeURL("task_add.gif")%>'
     title='<fmt:message key="add_reminder"/>'
     alt='<fmt:message key="add_reminder"/>'/>

Les fichiers JAR requis pour implémenter des balises JSTL sont fournis avec le serveur de portail. Vous ne devez pas paqueter ces fichiers JAR dans le fichier WAR de votre portlet.