java.net member

Rechercher dans ce site

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 dossier "resources" de war/resources vers src/META-INF. Dans ce dossier, il y a un sous dossier pour les composants (ka dans l'exemple), avec d'autres sous dossiers pour les autres ressources (images, stylesheets, javascript, etc.)

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

  © Blogger template Simple n' Sweet by Ourblogtemplates.com 2009

Back to TOP