wiki:PortletsEtJsf

Développer des portlets avec JSF

TOC?

Introduction

JSF est un framework JEE, conçu pour réaliser rapidement des interfaces web à l'aide de composants réutilisables. A la différence de la plupart des frameworks MVC pour le web, JSF ne se base pas sur le modèle requête-réponse, mais sur le modèle évènementiel.

 Sun fournit une implémentation de référence pour JSF, mais nous allons plutôt nous baser sur l'implémentation MyFaces de la fondation Apache. MyFaces propose également un sous-projet dénommé Tomahawk, qui contient un grand nombre de composants riches.

L'exploitation d'une application JSF à travers une portlet se réalise à l'aide d'un pont (bridge), qui se charge d'adapter le modèle portlet à celui de JSF.

Etapes d'un développement

  1. Développer l'application en mode standalone. On ne se préoccupe absolument pas de la portlet. Il faut juste veiller à ne pas utiliser de redirections.
  2. Transformer l'application en portlet. Ceci ce réalise en ajoutant un descripteur nommé portlet.xml dans le dossier WEB-INF ; le descripteur contient les informations de configuration du pont.
  3. Configurer le portail

L'intégration portlets/JSF

Le pont portlets/JSF

MyFaces propose un pont pour réaliser des portlets avec JSF. Un tutoriel montre cette intégration :  http://wiki.apache.org/myfaces/CreatingJSFPortlets. Voici une traduction de ce tutoriel :

  1. S'assurer que l'application développée avec JSF fonctionne correctement en tant qu'application indépendante.
  2. Retirer toutes les redirections contenues dans le fichier faces-config.xml. Les portlets ne les supportent pas.
  3. Créer une archive WAR de la portlet en respectant les instructions du portail où elle sera déployée.
  4. Modifier le fichier portlet.xml de la manière suivante :
<!-- Vous devez utiliser le pont portlets/JSF fourni par MyFaces -->
<portlet-class>org.apache.myfaces.portlet.MyFacesGenericPortlet</portlet-class>

<!-- Vue par défaut de l'application (requis) -->
<init-param>
    <name>default-view</name>
    <value>/default-view.jsf</value>
</init-param>

<!-- Une classe implémentant org.apache.myfaces.portlet.DefaultViewSelector -->
<!-- Utile pour choisir une vue en fonction de certains paramètres.  -->
<init-param>
    <name>default-view-selector</name>
    <value>com.foo.MyViewSelector</value>
</init-param>

Note : il existe d'autres implémentations de ponts entre JSF et les portlets, mais celui proposé par MyFaces semble être le plus simple à mettre en oeuvre et n'a présenté aucun problème particulier.

Un autre tutoriel est disponible également pour exploiter les modes des portlets avec JSF :  http://wiki.apache.org/myfaces/UsingPortletModes.

Le filtre MyFaces

Pour réaliser des composants riches, MyFaces peut avoir besoin de ressources externes, comme des scripts JavaScript, ou des feuilles de style CSS. Mais leur intégration dans une page HTML par une application n'est pas toujours aisée. Heureusement, ce problème se résout grâce à un filtre de servlets. La procédure d'installation est décrite à l'adresse suivante :  http://myfaces.apache.org/tomahawk/extensionsFilter.html.

Fonctionnement du filtre MyFaces

Ce filtre doit être appliqué impérativement sur le portail. Il faut donc impérativement respecter les opérations suivantes :

  • Partager les librairies de MyFaces et Tomahawk pour toutes les applications du conteneur de servlets ;
  • Appliquer le filtre sur la servlet du portail (en configurant le fichier web.xml du portail).

La configuration du descripteur d'applications web.xml se fait de la manière suivante :

  1. Définir le filtre. Le paramètre d'initialisation maxFileSize correspond à la taille maximale des fichiers uploadés.
<webapp>
    ...

    <filter>

        <filter-name>MyFacesExtensionsFilter</filter-name>
        <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>

        <init-param>
            <param-name>maxFileSize</param-name>
            <param-value>20m</param-value>
            <description>
                Set the size limit for uploaded files.
                Format: 10 - 10 bytes
                        10k - 10 KB
                        10m - 10 MB
                        1g - 1 GB
            </description>
        </init-param>

    </filter>

    ...
</webapp>
  1. Le filtre doit ensuite être appliqué pour servir les ressources JavaScript et CSS. Vous devez donc appliquer exactement le mapping suivant :
<webapp>
    ...

    <filter-mapping>
        <filter-name>MyFacesExtensionsFilter</filter-name>
        <url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
    </filter-mapping>

    ...
</webapp>
  1. Le dernier mapping ajoute les balises HTML nécessaire à l'inclusion des ressources externes. Vous devez donc l'appliquer à une ou plusieurs servlets, ou encore selon un certain modèle d'URL.
<webapp>
    ...

    <filter-mapping>
        <filter-name>MyFacesExtensionsFilter</filter-name>
        <servlet-name>ServletPortail</servlet-name>
        <url-pattern>/pages-filtrees/*</url-pattern>
    </filter-mapping>

    ...
</webapp>

Conclusion

Les environnements portlets et JSF cohabitent de manière très agréable. L'utilisation de JSF permet de se tenir éloigné du modèle bas-niveau des portlets, pour la plus grande joie du développeur.

Attachments