Présentation : Développement d'une configuration d'interface utilisateur dynamique

Découvrez les tâches principales impliquées dans la création d'une configuration de l'interface utilisateur dynamique.

Pourquoi et quand exécuter cette tâche

La présentation générale suivante décrit les tâches principales impliquées dans la création d'une configuration de l'interface utilisateur dynamique.
Remarque : Seuls les portlets standard peuvent lancer des interfaces utilisateur dynamiques. Les portlets HCL, toutefois, peuvent être lancés comme des portlets dynamiques et recevoir des propriétés. Les portlets standard peuvent aussi lancer des pages dynamiques contenant une combinaison de portlets standard et HCL.

Procédure

  1. Planification. Déterminez les conditions requises pour la configuration de l'interface utilisateur dynamique. Voici certaines questions qui peuvent vous aider dans le processus de planification :
    • Quelle est la présentation de la définition de la page ?
    • Les définitions de page doivent-elles être visibles pour les utilisateurs ? Si la réponse est non, où doivent-elles être placées dans la topologie du portail ?
    • Dans la topologie du portail, où doit être placée l'extension de noeud ?
    • Quelles informations doivent être transmises à chaque interface utilisateur dynamique ? Comment les portlets utiliseront-ils ces informations ?
    • Comment l'interface utilisateur sera-t-elle fermée ? Devez-vous utiliser des balises pour permettre à l'utilisateur de fermer les pages et les portlets dynamiques ? Si la réponse est non, la responsabilité de fermer l'interface utilisateur incombe-t-elle au portlet appelant ou à un portlet dynamique ?
  2. Création du noeud d'extension pour des pages dynamiques
    1. Créez la page à utiliser pour contenir les interfaces utilisateur dynamiques.
    2. Attribuez un nom unique au noeud. Pour cela, utilisez le portlet Noms uniques.
    3. Ouvrez une invite de commande.
    4. Placez-vous dans le répertoire wp_profile_root/ConfigEngine.
    5. Exécutez la tâche de configuration suivante :
      • AIX®HP-UXLinuxSolaris: ./ConfigEngine.sh action-enable-page-as-extension-node-wp.dynamicui.config -DPageUniqueName=pageUniqueName [-DVirtualPortalContext=virtualPortalContext]
      • IBM® i: ConfigEngine.sh action-enable-page-as-extension-node-wp.dynamicui.config -DPageUniqueName=pageUniqueName [-DVirtualPortalContext=virtualPortalContext]
      • Windows : ConfigEngine.sh action-enable-page-as-extension-node-wp.dynamicui.config -DPageUniqueName=pageUniqueName [-DVirtualPortalContext=virtualPortalContext]
      • z/OS® : ./ConfigEngine.sh action-enable-page-as-extension-node-wp.dynamicui.config -DPageUniqueName=pageUniqueName [-DVirtualPortalContext=virtualPortalContext]

      pageUniqueName correspond au nom unique du nœud d'extension et virtualPortalContext est le contexte du portail virtuel auquel appartient la page spécifiée. L'indicateur -DVirtualPortalContext est requis uniquement si un portail virtuel est utilisé.

      Cette commande désigne la page comme un noeud d'extension. Si vous avez ensuite besoin de supprimer la désignation du nœud d'extension, exécutez la commande avec la tâche action-disable-page-as-extension-node-wp.dynamicui.config.
  3. Développement de la définition de portlet pour des portlets dynamiques. Un portlet existant peut être utilisé comme définition pour un portlet dynamique. Pour les portlets standard, veillez à bien définir l'attribut ID pour l'élément <portlet-app/> dans portlet.xml. Le portlet de lancement utilise cette valeur ainsi que <portlet-name/> pour obtenir l'ID objet de la définition de portlet. Pour les portlets HCL, l'attribut uid de l'élément <portlet-app/> est utilisé.
    Identifiez les propriétés à transmettre au portlet.
    Considérations sur le descripteur de déploiement de portlet
    Pour recevoir les propriétés de portlet, le paramètre de préférence com.ibm.portal.context.enable doit être défini dans le fichier portlet.xml avec la valeur true. Par défaut, cette valeur est définie sur false.
    • Pour les portlets standard :
      <portlet-preferences>
      
      		 ...
          <preference>
          <name>com.ibm.portal.context.enable</name>
          <value>true</value>
      		 </preference>
      		 ...
      </portlet-preferences>
      
    • Pour les portlets HCL
      ...
         <config-param>
            <param-name>com.ibm.portal.context.enable</param-name>
            <param-value>true</param-value>
         </config-param>
      ... 

      De plus, vous devez également modifier le fichier web.xml des portlets HCL pour recevoir les propriétés de portlet. L'entrée de classe de servlet doit spécifier la classe com.ibm.wps.pb.wrapper.PortletWrapper. VoirConditionnement, déploiement et compilation de portlets coopératifs pour plus d'informations et un exemple.

    Remarques sur la recherche de contexte
    Les portlets standard reçoivent des propriétés de page sur la méthode processAction() à l'aide de l'attribut de requête com.ibm.portal.action.name. La valeur de cet attribut est un plan stockant les entrées de contexte. Chaque valeur de propriété est obtenue par son nom. Le nom et la valeur de chaque valeur de propriété sont déterminés par les conditions requises pour votre configuration d'interface utilisateur dynamique. Utilisez l'exemple de code suivant afin d'extraire une valeur pour la propriété propertyName :
    public void processAction (ActionRequest request, ActionResponse response) 
                throws PortletException, java.io.IOException
    {
           
       // perform application specific action handling
       ...
              
       // perform page context processing
       
       String specialAction = request.getParameter("com.ibm.portal.action");
     
       if (specialAction != null &&
           specialAction.equals("com.ibm.portal.context.receive")) 
       {
          //this indicates context was passed to the launched page
          java.util.Map contextMap = (java.util.Map)
                        request.getAttribute("com.ibm.portal.context");
    
          Object propertyValue =  (Object) contextMap.get(<propertyName>);
          
          portletSession.setAttribute(<propertyName>, propertyValue);
            
       }
    
    }

    Les portlets HCL doivent mettre en œuvre l'interface PropertyListener qui fournit la méthode setProperties(), laquelle fournit les propriétés de page sous forme de gamme d'objets PropertyValue.

    Dans cet exemple, une boucle est utilisée pour examiner la gamme et rechercher les propriétés de tâche.
    public void setProperties(PortletRequest request, PropertyValue contextArray[])
    {
          
       Object propertyValue;
    
       for (int i = 0; i < contextArray.length; i++) 
       {
          String propertyName = contextArray[i].getProperty().getName();
    
          if(propertyName.equals(<propertyName>))
          {
             propertyValue = (Object)contextArray[i].getValue();
          }
            
       }
    
       request.getSession().setAttribute(<propertyName>, propertyValue);
          
    }
    Considérations sur le portlet IBM
    Pour recevoir des propriétés de portlet, le paramètre de configuration com.ibm.portal.context.enable est spécifié dans le fichier portlet.xml. Ce paramètre joue le même rôle fonctionnel que la préférence de portlet standard. De plus, vous devez également modifier le fichier web.xml pour recevoir les propriétés de portlet. L'entrée de classe de servlet doit spécifier la classe com.ibm.wps.pb.wrapper.PortletWrapper. Voir la section Conditionnement, déploiement et compilation de portlets coopératifs pour plus d'informations.
  4. Développement de la définition de page pour des pages dynamiques.
    1. Créez la disposition et le contenu de la définition de page à partir de laquelle les pages dynamiques sont lancées. Pour le développement, vous pouvez utiliser Gestion des pages lorsque vous travaillez avec la disposition visuelle.
    2. Attribuez un nom unique à la page à l'aide du portlet Noms uniques. Le portlet utilise ce nom pour rechercher l'ID objet de la définition de page.
  5. Développement du portlet de lancement de l'interface utilisateur dynamique
    1. A l'aide de la recherche JNDI, obtenez une référence aux services de portlet requis.
      
      
      private DynamicUIManagementFactoryService dynamicUIManagerFactoryService;
      private RedirectURLGeneratorFactoryService redirectService;
      PropertyFactory propertyFactory;
      ...
      
      // Obtain a reference to the Dynamic UI Management Factory service
      PortletServiceHome dynamicUIManagerFactoryServiceHome = (PortletServiceHome) 
         ctx.lookup("portletservice/com.ibm.portal.portlet.service.dynamicui.DynamicUIManagementFactoryService"); 
      dynamicUIManagerFactoryService = (DynamicUIManagementFactoryService) 
         dynamicUIManagerFactoryServiceHome.getPortletService(DynamicUIManagementFactoryService.class);
      
      // Obtain a reference to the property factory
      PortletServiceHome serviceHome = (PortletServiceHome) 
         ctx.lookup("portletservice/com.ibm.portal.propertybroker.service.PropertyFactory"); 
         propertyFactory = 
           (PropertyFactory)serviceHome.getPortletService(com.ibm.portal.propertybroker.service.PropertyFactory.class);
      
      // If the dynamic UI should be displayed immediately upon launch,
      // obtain a reference to the RedirectURLGeneratorFactory service 
         PortletServiceHome redirectServiceHome = (PortletServiceHome) 
            ctx.lookup("portletservice/com.ibm.portal.portlet.service.state.RedirectURLGeneratorFactoryService");
         redirectService = (RedirectURLGeneratorFactoryService) 
         redirectServiceHome.getPortletService(RedirectURLGeneratorFactoryService.class);
      
      
    2. Obtenez l'ID objet de la définition de page ou de la définition de portlet. Cela peut être fait en utilisant un nom unique (pour une définition de page ou de portlet) ou un nom de portlet +portlet-app ID (définition de portlet uniquement).
      Utilisation d'un nom unique :
      Context ctx = new InitialContext();
      
      ...
      
      Name uniqueName = new CompositeName("portal:uniquename");
      
      uniqueName.add(yourUniqueName);
      ObjectID oidForName = (ObjectID) ctx.lookup(uniqueName);
      
      
      Utilisation du nom de portlet + porlet-app id :
      Context ctx = new InitialContext();
      
      ...
      
      Name portletName = 
           new CompositeName("portal:config/portletdefinition");
      portletName.add(appID);
      portletName.add(portletName);
      
      ObjectID portletDefOID = (ObjectID) ctx.lookup(portletName);
      
    3. Obtenez une instance de l'interface DynamicUICtrl à partir de la fabrique.
      La fabrique attend la requête/réponse de l'action Render/ suivie du nom de configuration (chaîne) comme paramètres d'entrée. L'interface DynamicUICtrl qui est renvoyée est paramétrée avec la requête/réponse. DynamicUICtrl doit être obtenue une fois par requête et ne doit pas être stockée.
      
      DynamicUICtrl DynamicUICtrl = 
          dynamicUIManagerFactoryService.getDynamicUICtrl(request, response, extensionNode);
      
      
    4. Créez les propriétés qui doivent être transmises à l'interface utilisateur dynamique.
      PropertyController property1 = propertyFactory.createProperty(config); 
      property1.setName(propertyKey);
      property1.setClassname("java.lang.String");
      property1.setDirection(Direction.OUT);
      
      PropertyValue value = 
          propertyFactory.createPropertyValue(request, property1, propertyValue);
      PropertyValue[] propertyValues = new PropertyValue[1];
      propertyValues[0] = value;  
      
    5. Lancez l'interface utilisateur dynamique à l'aide des méthodes addPage() ou addPortlet et transmettez l'ID objet de la définition de page/portlet. Exemple de lancement d'une page :
      
      DynamicUICtrl.addPage(pageDefinitionID, 
                    new LocalizedImpl(title,description), propertyValues);
      
      
    6. Facultatif : Naviguez jusqu'à la page qui vient d'être lancée à l'aide d'une redirection.
      
      RedirectURLGenerator redirector = 
                        redirectService.getURLGenerator(request, response);
      EngineURL redirectURL = redirector.createPortletURL(launchedPortlet);
      
      response.sendRedirect(redirectURL.toString());
      
      
  6. Fourniture de contrôles pour fermer les interfaces utilisateur dynamiques
    Dans de nombreux cas, vous pouvez permettre à l'utilisateur de fermer explicitement une interface utilisateur dynamique à partir d'un thème ou d'un habillage. Ces icônes sont activées à l'aide des balises <portal:closePage/> et <portal:closePortlet/>. Voir Balises utilisées par les fichiers JSP du portail pour plus d'informations.

    Autrement, le portlet de lancement peut fermer une interface utilisateur dynamique à l'aide des méthodes removePage() ou removePortlet() de l'interface DynamicUICtrl, en fournissant l'ID objet de l'interface utilisateur dynamique comme entrée sur l'appel. Dans le cas de la suppression d'un portlet dynamique, le portlet appelant doit être sur la même page.

  7. Test de la configuration.
    Chaque configuration d'interface utilisateur dynamique a ses propres conditions, conception et implémentation et, par conséquent, un ensemble différent de cas de test. Toutefois, vous devez toujours vérifier les comportements généraux suivants.
    • Les pages et les portlets sont correctement créés et supprimés.
    • Chaque fois qu'une interface utilisateur dynamique est lancée, une nouvelle instance de la page ou du portlet est créée ou, dans le cas d'interfaces utilisateur partagées, l'utilisateur est renvoyé à une instance existante.
    • Les propriétés sont transmises et traitées par les portlets dynamiques comme prévu.
    • Lorsque les portlets sont ajoutés et supprimés d'une page dynamique, la page conserve une disposition équilibrée.
  8. Déploiement de la configuration
    Lorsque la configuration de l'interface utilisateur dynamique est prête à être transmise à un serveur de niveau de production, créez les scripts XMLAccess qui contiennent les définitions de page et de portlet nécessaires. Vous pouvez utiliser le portlet Gestion de pages pour exporter la configuration de page dans XMLAccess, notamment toutes les connexions ou noms uniques utilisés par la configuration.