Réutiliser des composants composites dans JSF 2 – Le fichier jar - Article en français
>> 22 February 2011
English Article
Composite components ou composants composites en JSF 2 est parmi les outils très puissants. L'utilisation de cette technique permet d'économiser beaucoup de temps et d'efforts (Je reviendrai sur l'utilisation des composants composites dans des prochains articles). Cependant, pour arriver à cette fin, il est conseillé de mettre ce genre de composants dans un fichier .jar, pour permettre une utilisation simple, en simplement copier ce fichier dans le dossier war/WEB-INF/lib. Il est bien sûr possible, par exemple dans la phase de développement de copier le dossier " resources ", pour pouvoir utiliser les composants composites, mais cela, ne donne pas toute la puissance de composants ré-utilisables " write once, run many ", vue la difficulté de copier à chaque fois le(s) dossier(s) de composants et leurs classes.
Ce petit tutoriel commence par les étapes manuelle du processus de packaging dans un fichier .jar, afin de décrire la composition du fichier .jar de composants, libre à vous par la suite d'écrire par exemple un script Ant pour automatiser l'ensemble des étapes. Un script d'exemple est inclus à la fin.
Ce tutoriel est réalisé avec :
Eclipse Helios, GAEJ (Google App Engine pour Java) plateforme et MyFaces Core 2.0.4
Copier dans le dossier META.INF
Copier le dossier "resources"
Copier le fichier faces-config.xml dans le dossier META.INF
Créer un fichier .taglib.xml dans le dossier META-INF
Cette étape est optionnelle, permettant d'utiliser un name-space personnalisé pour utiliser les composants. Ce fichier a pour nom : nom_de_library.taglib.xml (par exemple ici le library d’appel " ka " et le fichier aura pour nom ka.taglib.xml)
META.INF/
resources/
ka/ (library de composants)
css/ stylesheets
images/ images
js/ Javascript
faces-config.xml
ka.taglib.xml
Les classes beans associées aux composants composites, sont à mettre dans la racine du fichier .jar avec leurs packages.
ka.taglib.xml
<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://www.java_javafx.com/ka</namespace>
<composite-library-name>ka</composite-library-name>
</facelet-taglib>
faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<application>
<resource-bundle>
<base-name>com.java_javafx.ka.composite.localizedMessages</base-name>
<var>msgsc</var>
</resource-bundle>
<!-- set locales -->
<locale-config>
<default-locale>en</default-locale>
<supported-locale>fr</supported-locale>
<supported-locale>de</supported-locale>
<supported-locale>ar</supported-locale>
</locale-config>
<!-- end locals -->
</application>
</faces-config>
logo.xhtml
Note:
" home " est le nom donné à la classe bean (ManagedBean). Cet exemple d'un composant composite, affiche simplement une image accompagnée d'une Url. Primefaces (excellente library ou bibliothèque) est utilisée ici pour afficher une boîte de dialogue, avant de quitter le site.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui"
>
<composite:interface>
<composite:attribute name="image" required="true" />
<composite:attribute name="url" required="true" />
<composite:attribute name="styleClass" default="icon"/>
<composite:attribute name="isDialog" default="false"/>
</composite:interface>
<composite:implementation>
<h:outputStylesheet library="css" name="jsf.css" target="head"/>
<h:outputStylesheet library="css" name="primeFacesThemes/ui-lightness/skin.css" target="head"/>
<h:inputHidden binding="#{home.hiddenComponent}">
<f:attribute name="url" value="#{cc.attrs.url}"/>
</h:inputHidden>
<h:panelGrid rendered="#{cc.attrs.isDialog}" style="border:0">
<h:commandLink onclick="cd.show()">
<h:graphicImage url="#{cc.attrs.image}" styleClass="#{cc.attrs.styleClass}" border="0"/>
</h:commandLink>
<!-- confirm dialog -->
<p:confirmDialog message="#{msgsc.quit_message} ?"
header="#{msgsc.quit_header}" severity="alert" widgetVar="cd" modal="true">
<h:panelGrid columns="2" style="border:0" >
<h:commandButton value="#{msgsc.quit_yes}" action="#{home.go}" oncomplete="cd.hide()" ajax="false"/>
<h:commandButton value="#{msgsc.quit_no}" onclick="cd.hide();"/>
</h:panelGrid>
</p:confirmDialog>
</h:panelGrid>
<h:panelGrid rendered="#{!cc.attrs.isDialog}" style="border:0">
<h:commandButton action="#{home.go}" image="#{cc.attrs.image}" styleClass="#{cc.attrs.styleClass}"/>
</h:panelGrid>
</composite:implementation>
</html>
Exporter le fichier .jar
Un clic droit sur le projet dans Package Explorer d'Eclipse -> Export
Sélectionner Java -> Jar file -> Next
Sélectionner les dossiers "com" et "META.INF" dans war -> WEB-INF -> classes.
Décocher ".classpath" and ".project".
Entrer un nom et le chemin pour votre fichier .jar.
Vous pouvez ici sélectionner uniquement les classes ou exporter les classes avec les fichier sources.
"Finish"
Retravailler le fichier .jar
Pour pouvoir réutiliser le .jar comme library ou bibliothèque dans un autre projet JSF procéder comme suite :
Décompresser le jar obtenu dans l'étape précédante
Dans le dossier obtenu, déplacer les dossiers META-INF et com vers la racine du .jar tout en gardant le fichier MANIFEST.MF
La racine du .jar
Recomposer le fichier .jar
Dans un terminal taper la commande suivante suivie de Enter:
jar -cvf fileName.jar *
Installer le fichier .jar comme une library (ou bibliothèque)
Il suffit de copier le fichier .jar dans le dossier lib de n'importe quel projet JSF
war -> WEB-INF -> lib (le fichier .jar obtenu)
Ajouter le fichier .jar dans Java Build Path du projet
Ant Build
Ici est un exemple rapide d'un Script Ant. Je suis sûr que vous pouvez ajouter des instructions puissantes pour le rendre vraiment utilisable dans vos projets :)
<?xml version="1.0" encoding="UTF-8"?>
<project name="createJar" basedir="." default="makejar">
<property name="war" value="${basedir}/war" />
<property name="classes" value="${basedir}/war/WEB-INF/classes" />
<!--change the destination .jar file -->
<property name="jarFile" value="/home/kas/hello777.jar" />
<!--choose a destination tmp folder to copy the components -->
<property name="tmpDir" value="/home/kas/tmp-6_fev_2010_n777" />
<property name="webInf" value="${basedir}/war/WEB-INF" />
<target name="makejar">
<mkdir dir="${tmpDir}"/>
<!-- Ecrire un fichier à la vollé .taglib.xml (option) -->
<echo file="${tmpDir}/ka.taglib.xml" ><![CDATA[<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://www.java_javafx.com/ka</namespace>
<composite-library-name>ka</composite-library-name>
</facelet-taglib>
]]></echo>
<copy todir="${tmpDir}" >
<fileset dir="${war}">
<include name="resources/" />
</fileset>
</copy>
<!--Il est possible de copier tous les dossiers nécessaires au composants -->
<copy todir="${tmpDir}/resources" >
<fileset dir="${war}">
<include name="css/" />
<include name="images/"/>
<include name="primeFacesThemes/" />
</fileset>
</copy>
<jar destfile="${jarFile}" basedir="${classes}" includes="com/">
<metainf dir="${tmpDir}" >
<include name="resources/" />
<include name="ka.taglib.xml"/>
</metainf>
<metainf dir="${webInf}">
<include name="faces-config.xml"/>
</metainf>
</jar>
<delete dir="${tmpDir}" />
</target>
</project>
0 comments:
Post a Comment