giovedì 16 giugno 2011

JavaServer Faces Faclets: due differenti modalità per la composizione dei componenti

La facilità con cui effettuare il templating, non solo delle pagine ma anche dei componenti (tag composition), è uno dei vantaggi di cui la tecnologia JavaServer Faces ha usufruito grazie alla introduzione del Facelets.
Soffermiamoci sulla possibilità di creare delle composizioni di componenti espressi mediante tags riusabili in qualsiasi pagina come tag custom:


<mytaglib:mytag label="nome" value="#{miobean.nome}"></mytaglib:mytag>



Ci sono almeno due modi per creare composizioni di tag riutilizzabili nelle view JSF:
Mediante una taglibrary custom, e mediante la taglibrary http://java.sun.com/jsf/composite.
Vedremo che il secondo metodo risulta più immediato e non presenta problemi di autocompletamento che potrebbero verificarsi nell'editare gli attributi delle tag custom nell'editor dell'ide.

1)
Creiamo un tag custom che registreremo nella talibrary custom mediante il seguente codice di esempio:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=”http://www.w3.org/1999/xhtml” xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html">
<ui:component>
<h:outputLabel value="#{label}: ">
<h:inputText value="#{value}"/>
</h:outputLabel>
</ui:component>
</html>


Abbiamo semplicemente composto una label con una inputText, ma eventualmente potremmo anche costruire una porzione di pagina vera e propria. Salviamo questo codice come file con estensione xhtml (miotag.xhtml).

La tag custom deve essere mappata in una taglibrary :


<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>http://www.facletsexample.it/tagcustom<;/namespace>
<tag>
<tag-name>mytag</tag-name>
<source>miotag.xhtml</source>
</tag>
</facelet-taglib>


Quindi occorre specificare la libreria che si sta utilizzando nel file web.xml


<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/WEB-INF/facelets/mialibreria.taglib.xml</param-value>
</context-param>


Quindi è possibile usare il tag all’interno della pagina specificando il namespace della libreria


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns=”http://www.w3.org/1999/xhtml” xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f=”http://java.sun.com/jsf/core” xmlns:h="http://java.sun.com/jsf/html" xmlns:mytaglib=" http://www.facletsexample.it/tagcustom ">
<body>
<f:view>
<h:form>
<h:panelGrid columns="1">
<mytaglib:mytag label="nome" value="#{miobean.nome}"/>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>



2)
Vediamo ora invece come creare componenti riusabili mediante la taglibrary http://java.sun.com/jsf/composite

Creiamo la nostra composizione di tags che riutilizzeremo come tag custom inserendo il seguente codice nel file miotag.xtml



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.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">
    <h:head>
        <title>This content will not be displayed</title>
    </h:head>
    <h:body>
        <composite:interface>
            <composite:attribute name="value" required="false"/>
            <composite:attribute name="label" required="false"/>
        </composite:interface>
        <composite:implementation>
            <h:outputLabel value="#{cc.attrs.label}"></h:outputLabel>
            <h:inputText value="#{cc.attrs.value}"></h:inputText>
        </composite:implementation>
    </h:body>
</html>



Si noti come la parola "cc" è riservata per i componenti composti
L'espressione #{cc.attrs.attribute-name} è utilizzata per identificare l'attributo definito per il componente nella sua interface. Nel nostro caso gli attributi definiti sono "label" e "value".
Per rendere il tag una risorsa disponibili non è necessario registrarlo in una taglibrary, ma è fondamentale inerire il file miotag.xhtml nella directory "resources/mycomp", sotto la root dell'application web. La sottodirectory "resources" infatti è considerata dal framework una vera e propria libreria.

Non ci resta che utilizzare il tag in una pagina del tipo:



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns=”http://www.w3.org/1999/xhtml” xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f=”http://java.sun.com/jsf/core” xmlns:h="http://java.sun.com/jsf/html" xmlns:mytaglib="http://java.sun.com/jsf/composite/mycomp/ ">
<body>
<f:view>
<h:form>
<h:panelGrid columns="1">
<mytaglib:miotag label="nome" value="#{miobean.nome}"/>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>



Nell'utilizzare il tag custom:


<mytaglib:miotag label="nome" value="#{miobean.nome}"></mytaglib:mytag>


Il nome del prefisso "mytaglib" è il nome della sottodirectory in cui è contenuto il file di definizione del tag, mentre il nome del tag "miotag" è il nome del file di definizione senza l'estensione .xhtml

Nessun commento:

Posta un commento