Apps

Module JSR286 3.0

Description

Le Module JSR 286 permet d'ajouter dans votre portail Jalios des Portlets respectant les spécifications de Portlet Java 2.0 (JSR 286) ou de Portlet Java 1.0 (JSR 168).

Cette version ne fonctionne qu'à partir de la version 9 du coeur applicatif.


Le tutoriel Convertir une Application Métier en Portlet JSR 286 détaille comment intégrer une Application métier existante écrite en Spring MVC.


Captures d'écran

1. Exemples de Portlet
2. Edition de la Portlet Conteneur JSR 286

Installation

Installer le module

  1. Installer le module dans JCMS
  2. Arrêter le serveur d’application
  3. Si vous utilisez une version de JCMS < 8.0.3, appliquer le patch suivant : Patch AjaxFilter.java pour le module JSR 286
  4. Copier les librairies suivantes, présente dans /JCMS/WEB-INF/plugins/JSR286Plugin/appserver-lib, dans le répertoire des librairies du serveur d’application (ex : TOMCAT_HOME/lib) :

  5. ccpp-1.0.jar
    jstl-1.2.jar
    pluto-container-api-2.0.3.jar
    pluto-container-driver-api-2.0.3.jar
    pluto-taglib-2.0.3.jar
    portlet-api-2.0.jar
  6. Mettre à jour le fichier /JCMS/WEB-INF/web.xml, en ajoutant les éléments définis dans le fichier /JCMS/WEB-INF/web-jsr286.xml. Ces éléments doivent être ajoutés en respectant le schéma XML.
  7. Ajouter l’attribut crosscontext="true" sur la déclaration du contexte dans server.xml (ou le fichier context.xml correspondant) du serveur d’application (Tomcat)
    <Context docBase="[JCMS_PATH]" path="/[JCMS_NAME]" reloadable="false" crosscontext="true"/>
  8. Redémarrer le serveur d’application

Déployer une Portlet JSR 286 sur le serveur d’application

Déploiement manuel

La procédure décrite ci-dessous est à refaire pour chaque nouvelle Portlet JSR 286 à déployer.

      1. Arrêter le serveur d’application
      2. Déployer (Décompresser le WAR) une Portlet JSR 286 sur le même serveur d’application que celui de JCMS
      3. Modifier le fichier /WEB-INF/web.xml se trouvant dans le dossier de la Portlet JSR 286 déployée, en ajoutant la servlet suivante :

        <servlet>
          <servlet-name>{MY_PORTLET}</servlet-name>
          <servlet-class>org.apache.pluto.container.driver.PortletServlet</servlet-class>
          <init-param>
            <param-name>portlet-name</param-name>
            <param-value>{MY_PORTLET}</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
          <servlet-name>{MY_PORTLET}</servlet-name>
          <url-pattern>/PlutoInvoker/{MY_PORTLET}</url-pattern>
        </servlet-mapping>

        Remplacer {MY_PORTLET} par le nom de la portlet définie dans le fichier /WEB-INF/portlet.xml se trouvant dans le dossier de la Portlet JSR 286 déployée.

      4. Redémarrer le serveur d’application

Auto-déploiement

Cette option est utilisée seulement pour des développements simples ou des déploiements de test. Si vous voulez déployer une nouvelle application dans un environnement plus complexe, comme un environnement de production, il est recommandé de ne pas activer cette option.

Il est possible de configurer le module de manière à déployer automatiquement des fichiers WAR JSR-286, sans avoir besoin de modifier manuellement le descripteur de déploiement (web.xml).

Il faut configurer cette option en allant dans l'administration du module : 

jsr286-plugin-properties

  • Activer l'auto-déploiement : Permet d'activer ou non l'option d'auto-déploiement
  • Répertoire d'auto-déploiement : Répertoire dans lequel les applications à déployer seront copiées puis modifiées. Par exemple : C:\Tomcat\autodeploy
  • Répertoire de déploiement du serveur d'application : Répertoire du serveur d'application dans lequel l'application modifiée est ensuite déployée. Par exemple : C:\Tomcat\webapps

Dans le cas de serveur d'application de type Tomcat, vous pouvez configurer les options suivantes pour un redéploiement plus performant :

  • Manager web application URL : URL de l'application web "Manager" utilisée pour le déploiement automatique des application archivées. Par exemple : http://localhost:8080/manager
  • Nom d'utilisateur du Manager : Nom d'utilisateur qui a les droits d'accès au "Manager". Pour ajouter un utilisateur, aller dans le fichier tomcat-users.xml, ajouter le role "manager" et ajouter ce role à un utilisateur :
    <role rolename="manager"/>
    <user name="[username]" password="[password]" roles="manager" />
  • Mot de passe du Manager : Mot de passe de l'utilisateur ayant accès au "Manager"

Ajouter une Portlet Conteneur JSR 286 dans JCMS

La Portlet Conteneur JSR 286 est une Portlet JCMS qui permet d'ajouter des Portlets JSR 286 au sein du portail JCMS.

    1. Activer le type de Portlet Conteneur JSR 286 dans l’administration de l’espace de travail
    2. Créer une Portlet Conteneur JSR 286 dans JCMS, et sélectionner l’Application dans la première liste et une de ses Portlets dans la seconde liste.
      jsr286-edit-application-portlet
    3. Vous pouvez activer le mode Ajax. Celui-ci permet à la Portlet d'être modifiée dynamiquement afin d'utiliser 'ajax-refresh' sans aucune modification dans la Portlet d'origine. Cela permet de rafraîchir seulement la Portlet, et pas toute la page.
      jsr286-edit-ajax-mode
         ATTENTION: le mode Ajax peut ne pas fonctionner en raison d'un conflit avec le Javascript déjà présent dans la Portlet. Voir FAQ.
      Les autres paramètres sont les paramètres standards d’une Portlet JCMS.
    4. Ajouter la Portlet Conteneur JSR 286 précédemment créée dans un espace de travail, espace collaboratif ou bureau virtuel

Intégration avec JCMS

Authentification

Il est possible de vérifier si l'utilisateur est authentifié sur le site de JCMS. Pour cela, il faut appeler la méthode présente dans l'objet request : getUserPrincipal. Cette méthode retourne un objet java.security.Principal qui contient le login deu membre authentifié. Si la méthode retourne null, alors l'utilisateur ayant fait la requête n'est pas authentifié.

Internationalisation

Il est possible d'avoir une Portlet multilingue et d'utiliser la langue sélectionnée dans JCMS. Pour cela, la langue est transmise dans la request et peut être récupérée en appelant la méthode getLocale.

Certains Frameworks permettent de gérer l'internationalisation et se base sur la valeur trouvée dans la méthode getLocale. Il n'y a donc aucune surcouche à ajouter pour fonctionner avec JCMS.

Par exemple, si vous utilisez Spring, il existe les objets LocaleResolver et MessageSource qui permettent de gérer l'internationalisation en déclarant par exemple les beans suivants :

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"
p:basenames="messages" />

<!-- Declare the Interceptor -->
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"
p:paramName="locale" />
</mvc:interceptors>

<!-- Declare the Resolver -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

Informations JCMS

Si la Portlet a besoin d'informations spécifiques JCMS, il est possible de récupérer l'objet PortletInfos dans la request.

PortletInfos portletInfos = SerializationUtils.fromString((String) request.getAttribute(JSR286Constants.JCMS_ATTR_PORTLET_INFOS));

Cet objet contient les informations JCMS telles que l'ID de la Portlet JCMS, l'ID du portail JCMS, les catégories courantes, savoir si le mode Ajax de la portlet est activé ...

 

Il est possible également de récupérer des informations supplémentaires sur le membre courant, telles que le nom, le prénom, l'email, savoir si c'est un membre en base de données, savoir si le membre est administrateur ...

MemberPrincipal mbrPrincipal = SerializationUtils.fromString((String) request.getAttribute(JSR286Constants.JCMS_ATTR_PRINCIPAL));

 

ATTENTION : Pour pouvoir récupérer ces informations dans la Portlet, il est nécessaire de rajouter le JAR du module JSR286 dans le classpath de l'application de Portlet (ex: [MY_PORTLET]/WEB-INF/lib).


Changements

FAQ

1. Comment puis-je ajouter dans JCMS une application web en tant que Portlet ?

Il existe un tutoriel qui explique comment (Lien en accès restreint) . Vous pouvez télécharger les projets contenant les exemples utilisés dans le tutoriel :

  • (Lien en accès restreint) : L'application métier
  • (Lien en accès restreint) : La Portlet obtenue à partir de l'application métier
2. Pourquoi ma Portlet ne fonctionne pas correctement quand j'active le mode Ajax ?

Le mode Ajax a pour but de rafraîchir seulement la Portlet, et pas toute la page. Seulement, ce rafraîchissement partiel utilise du Javascript présent dans JCMS.

Si la Portlet que vous ajoutez dans JCMS contient son propre Javascript, cela peut provoquer un conflit avec celui de JCMS.

C'est par exemple le cas pour une Portlet JSF dont les actions sur les liens où les formulaires sont réalisés avec du Javascript, court-circuitant l'appel au Javascript de JCMS.

Dans ce cas là, vous pouvez essayer d'ajouter la classe 'portlet-ajax' sur la PortletContainer JSR286' qui permet dans certains cas de forcer l'utilisation du Javascript de JCMS et non de celui de la Portlet.

Si cela ne permet pas de résoudre le problème, soit il est possible de supprimer le Javascript de la Portlet, soit il est nécessaire de désactiver le mode Ajax.

3. Comment puis-je ajouter des en-têtes HTML de ma Portlet JSR 286 ?

Il est possible d'ajouter des en-têtes HTML, par exemple pour ajouter des fichiers CSS ou Javascript spécifiques à une Portlet en surchargeant la méthode doHeaders(RenderRequest request, RenderResponse response) de la classe javax.portlet.GenericPortlet.

Par exemple, si la Portlet utilise le Framework Spring, vous devez avoir dans portlet.xml la définition qui suit :

<portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class>

Créer une classe qui étend la Portlet de classe précédemment définie. Vous trouverez ci-dessous la classe MyDispatcherPortlet avec différents exemples d'en-têtes HTML définis :

package sample.code.listing.portlet;

import javax.portlet.MimeResponse;
import javax.portlet.PortalContext;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import org.springframework.web.portlet.DispatcherPortlet;
import org.w3c.dom.Element;

public class MyDispatcherPortlet extends DispatcherPortlet {

  @Override
  protected void doHeaders(RenderRequest request, RenderResponse response) {
    super.doHeaders(request, response);
    PortalContext portalContext = request.getPortalContext();
    if (portalContext.getProperty(PortalContext.MARKUP_HEAD_ELEMENT_SUPPORT) != null) {
      // -- add CSS
      Element cssElement = response.createElement("link");
      // --encoding URLs to resources is important
      cssElement.setAttribute("href", response.encodeURL(request.getContextPath() + "/css/style.css"));
      cssElement.setAttribute("rel", "stylesheet");
      cssElement.setAttribute("TYPE", "text/css");
      response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, cssElement);

      // -- add JavaScript
      Element jsElement = response.createElement("script");
      // --encoding URLs to resources is important
      jsElement.setAttribute("SRC", response.encodeURL((request.getContextPath() + "/js/bookCatalog.js")));
      jsElement.setAttribute("type", "text/javascript");
      jsElement.setTextContent(" ");
      response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, jsElement);

      // -- add META tag
      Element metaElement = response.createElement("META");
      metaElement.setAttribute("name", "Custom-Meta");
      metaElement.setAttribute("CONTENT", "This is the content of the meta");
      response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, metaElement);

      // -- add META HTTP-EQUIV tag
      Element httpEquivElement = response.createElement("meta");
      httpEquivElement.setAttribute("HTTP-EQUIV", "Custom-Http-Equiv");
      httpEquivElement.setAttribute("content", "This is the content of the meta HTTP-EQUIV");
      response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, httpEquivElement);
    }
  }
}

Enfin, dans portlet.xml, remplacer la définition précédente par ce qui suit

<portlet-class>sample.code.listing.portlet.MyDispatcherPortlet</portlet-class>

Informations

Version
  • 3.0
Stabilité
  • Stable
Compatibilité
  • JPlatform 10
Certifié Jalios
  • Oui
Prix
  • Module payant
Support
  • Jalios Support
Auteur
  • Jalios SA
Licence
  • Jalios
Taille
  • 7,39 Mo
Mis-à-jour
  • 05/10/18
Téléchargements
  • 6