weblets

En travaillant sur une librairie JSF faite maison, j’ai rapidement souhaité packager des fichiers CSS et des images. Avec richFaces, il est possible de charger un fichier CSS se situant dans un JAR avec le composant <a4j:loadStyle />, mais je n’ai pas trouvé la même fonctionnalité pour récupérer une image packagée dans un JAR. C’est alors que j’ai découvert weblets :
Component libraries for web application frameworks often need to provide resource files along with implementation classes. For example, JavaServer Faces Renderers often need JavaScript, CSS and image resources.
Il s’agit donc d’un framework qui met à la disposition d’une application web les ressources contenues dans un JAR “tag-librairie”. Cette technologie est compatible avec JSF, JSP, JavaScript, CSS, etc. Elle est utilisable dans une application basée sur JSF ou sur des servlets.
La librairie
Il n’y a qu’une seule règle à suivre pour le packaging de la librairie : le fichier de configuration weblets-config.xml doit être dans le répertoire META-INF. Voici un exemple de fichier de configuration :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <description>Weblets Demo</description> <servlet> <servlet-name>Weblets Servlet</servlet-name> <servlet-class>net.java.dev.weblets.WebletsServlet</servlet-class> </servlet> <!-- The Weblets servlet mapping must be path based otherwise Weblets will fail! --> <servlet-mapping> <servlet-name>Weblets Servlet</servlet-name> <url-pattern>/weblets/*</url-pattern> </servlet-mapping> </web-app>
Ce fichier ressemble étrangement au fichier web.xml. Ici, toutes les ressources qui sont dans le package org.myapp.faces.renderer.html.resources seront disponibles à l’adresse http://…../root-webapp-context/faces/weblets/myressources/*. Le nom de la weblet est myweblet. Il peut y avoir plusieurs weblets dans un même fichier de configuration.
Je n’aime pas la paraphrase, vous trouverez toutes les explications utiles à cette adresse : https://weblets.dev.java.net/doc_11/longdoc/packingweblets.html
Mise en place sur une application web JSF
Dans une application JSF, la weblets se déploie automatiquement. Il n’y a que deux limitations :
- Utiliser la servlet JSF de l’implémentation de référence : javax.faces.webapp.FacesServlet
- Utiliser le mapping de servlet JSF /faces/*
Voici un exemple de fichier web.xml :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <description>Weblets Demo</description> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> </web-app>
Si vous utiliser Seam comme moi, votre mapping de servlet est certainement *.seam. Il faut s’avoir qu’il est possible de définir plusieurs mappings différents sans aucun problème. Pour plus d’explication je vous invite à visiter la documentation officielle : https://weblets.dev.java.net/doc_11/longdoc/setup.html
Utilisation dans l’application JSF
L’utilisation dans votre application JSF est très simple. Dans une page facelets :
#{weblet.url['weblets.demo']['/welcome.js']} <!– avec weblets.demo = le nom de la weblet et /welcome.js le chemin de la resource –>
Dans un fichier CSS :
background-image: url( weblet:resource( "weblets.demo" , "/myimage.png" ) );
Maven
Enfin, comme toute librairie qui se respecte, voici comment l’utiliser avec maven : Ajouter le repository java.net à votre pom.xml :
<repository> <id>maven2-repository.dev.java.net</id> <name>Java.net Repository for Maven</name> <url>http://download.java.net/maven/2/</url> <layout>default</layout> </repository> <pre>
Ajouter les deux dépendances suivantes :
<dependency> <groupId>net.java.dev.weblets</groupId> <artifactId>weblets-api</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>net.java.dev.weblets</groupId> <artifactId>weblets-impl</artifactId> <version>1.1</version> </dependency>
Pour terminer cet article, j’ajouterai que j’ai eu beaucoup de difficultés pour mettre en place ma librairie car la documentation n’est pas tout à fait correcte ou plutôt, elle induit en erreur le développeur de temps en temps. Il ne faut pas avoir peur de checkouter les sources pour s’inspirer des exemples, la racine du repository subversion est : https://weblets.dev.java.net/svn/weblets avec l’utilisateur guest sans mot de passe. Cela vous fera certainement gagner du temps.
org.myapp.faces.renderer.html.resources