Exemples de SPI modèle

Le SPI modèle peut être utilisé dans les portlets, les thèmes et les habillages. Les modèles peuvent être utilisés avec des utilisateurs authentifiés et des utilisateurs anonymes.

Les exemples suivants concernent les JSP mais le code peut également être utilisé dans des fichiers source Java.

Affichage du chemin de sélection du portail (piste de navigation)

L'exemple suivant montre comment afficher une piste de navigation qui indique le chemin de sélection courant.


<%@ taglib uri="http://www.ibm.com/xmlns/prod/websphere/portal/v6.0/portal-fmt" 
    prefix="portal-fmt" %>
<%@ taglib uri="http://www.ibm.com/xmlns/prod/websphere/portal/v6.0/portal-navigation" 
    prefix="portal-navigation" %>
<%@ page import="com.ibm.portal.model.NavigationSelectionModelHome" %>
<%@ page import="com.ibm.portal.model.NavigationSelectionModelProvider" %>
<%@ page import="com.ibm.portal.navigation.NavigationSelectionModel" %>
<%@ page import="com.ibm.portal.navigation.NavigationNode" %>
<%@ page import="com.ibm.portal.ModelException" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.NamingException" %>

<%
try{
    Context ctx = new InitialContext();
    NavigationSelectionModelHome home = (NavigationSelectionModelHome) 
        ctx.lookup("portal:service/model/NavigationSelectionModel");
    if (home != null) {
        NavigationSelectionModelProvider provider = 
            home.getNavigationSelectionModelProvider();
        NavigationSelectionModel model = 
            provider.getNavigationSelectionModel(request, response);
        for (java.util.Iterator i = model.iterator(); i.hasNext(); ) 
        {
            NavigationNode node = (NavigationNode) i.next();
            if (i.hasNext()) {
%>

        <a href="<portal-navigation:navigationUrl type='link' varname='<%=node%>'/>">
            <portal-fmt:title varname='<%=node%>'/>
        </a> 
        &gt;
<%
            }
            else 
            {
%>
        <portal-fmt:title varname='<%=node%>'/>
<%
            }
        }
    }
}
catch (ModelException mx) {
%>

<p><span style="color:#ff0000">A model exception occured</span></p>

<%
}
catch (NamingException nx) {
%>

<p><span style="color:#ff0000">A naming exception occured</span></p>

<%
}
%>

Cet exemple utilise une recherche JNDI pour obtenir le modèle de sélection de navigation. Une itération du modèle est ensuite effectuée et un titre est généré pour chaque nœud à l'aide de la balise <portal:title/>. Tant que le dernier nœud n'a pas été atteint, la balise <portal:navigationUrl/> est utilisée afin de générer des liens vers les pages référencées.

Obtention d'informations sur la disposition des pages

Cet exemple indique un code de portlet qui affiche les informations de disposition d'une page telles qu'elles ont été récupérées du modèle de mise en page de cette page. Le portlet génère la structure de la page dans laquelle il se trouve. Deux méthodes du portlet sont indiquées dans l'exemple ci-après. La première, showTableModel, correspond au point d'entrée pour afficher un tableau contenant la disposition d'une page. La page est identifiée par le noeud de navigation sélectionné du modèle de sélection de navigation. La deuxième méthode, printLayoutElement, explore de manière récursive le modèle de mise en page et génère des marquages en fonction des éléments qu'elle rencontre.


/**
 * Displays a table model of the layout of a page.
 *
 * @param aWriter the writer where the output goes to
 * @param aLayoutModel the layout model to show
 * @param aPage the page for which to show the layout model\
 * @param aRequest the portlet request
 * @throws ModelException if an exception occurs
 */
private void showLayoutModel(final PrintWriter aWriter, 
        final LayoutModel aLayoutModel, final ContentPage aPage, 
        final RenderRequest aRequest) 
      throws ModelException {
   aWriter.print("<h3>Layout for page ");
   aWriter.print(getTitle(aPage));
   aWriter.println("</h3>");   
   // invoke the recursive traversal of the layout model; 
   // start with the root node   
   printLayoutNode(aWriter, aLayoutModel, 
                  (LayoutNode) aLayoutModel.getRoot(), aRequest);   
   }   

/**
 * Outputs a single element of the layout model to the output writer.
 *
 * @param writer the writer where the output goes to
 * @param model the layout model to use 
 * @param node the current node of the layout model 
 * @param request the portlet request 
 * @throws ModelException if an exception occurs 
 */
private void printLayoutNode(final PrintWriter writer, final LayoutModel model, 
        final LayoutNode node, final RenderRequest request) throws ModelException { 
   if (node != null) {
      if (node instanceof LayoutControl) {
         // output control information
         writer.print("<b>Control</b> (");
         writer.print(getTitle((LayoutControl) node));
         writer.println(")");
      } 
      else {
         writer.println("<table border=\"1\">");
         // get the layout metrics 
         // (needed to find out the orientation of containers)
         final LayoutMetrics metrics = node.getLayoutMetrics();
         final Object info = metrics.getValue(LayoutMetrics.ORIENTATION);
         writer.print("<tr><td><b>Container</b> (");
         writer.print(info);
         writer.println(")");
         if (info == Orientation.HORIZONTAL) {
            writer.println("<table>");
            writer.println("<tr>");
            // recurse for the horizontal container
            if (model.hasChildren(node)) {
               for (Iterator i = model.getChildren(node); i.hasNext();) {
                  writer.println("<td valign=\"top\">");
                  printLayoutNode(writer, model, (LayoutNode) i.next(), request);
                  writer.println("</td>");
               }
            }
            writer.println("</tr>");
            writer.println("</table>");
         } 
         else {
            // recurse for the vertical container
            if (model.hasChildren(node)) {
               writer.println("<table>");    
               for (Iterator i = model.getChildren(node); i.hasNext();) {
                  writer.println("<tr><td>");
                  printLayoutNode(writer, model, (LayoutNode) i.next(), request);
                  writer.println("</td></tr>");
               }
               writer.println("</table>");
            }
         }
         writer.println("</td></tr></table>");
      }
   }
}