ADF : Les fragments et composants de pages

Les fragments de page jsff peuvent faire appel à des composants jsff. Ces composants permettent avant tout, une maintenabilité plus aisée du code jsff dans une application ADF. Le gros avantage des composants réside dans le passage des attributs de la page mère à la page fille (de type String, Date, tableau etc…)

Ces composants sont appelés depuis les fragments jsff et sont intégrés directement dans la page (visible directement depuis le Design sous JDevelopper). La mise en place nécessite un fragment .jsff et un composant .jsff :

Création du composant

Pour la création d’un composant, un fragment jsff classique est nécessaire, vous devez ensuite ajouter plusieurs balises :

  • af:componentDef permet de définir que le fragment jsff est un composant
    • L’attribut var définit le nom de la variable que vous allez utiliser pour faire appel à vos attributs
  • af:xmlContent doit être présent, ainsi que les balises component et description (Cette balise vous permet de décrire le contenu du composant)
  • attribute doit être utilisé pour tout attribut que vous souhaitez ajouter à votre composant. Il permettra de faire passer des données entre le fragment et le composant
    • attribute-name est le nom de l’attribut tel que vous allez l’utiliser par la suite
    • attribute-class est le type de l’attribut (type String, Date etc…)
    • required n’est pas obligatoire, mais il vous permet de définir si l’attribut est requis ou non lors de l’appel du composant

Exemple d’utilisation

Page composant.jsff

<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
  <af:componentDef var="attrs">
    <af:xmlContent id="t">
      <component xmlns="http://xmlns.oracle.com/adf/faces/rich/component">
        <description>page demo</description>
        <attribute>
          <attribute-name>title</attribute-name>
          <attribute-class>java.lang.String</attribute-class>
          <required>true</required>
        </attribute>
      </component>
    </af:xmlContent>
    <af:panelGroupLayout id="panel_title">
      <af:outputText value="#{attrs.title}" id="title_text"/>
    </af:panelGroupLayout>
  </af:componentDef>
</jsp:root>
Pour récupérer les valeurs des attributs, il vous faut utiliser l'appel suivant #{var.name}

Depuis le fragment qui fait appel au composant, vous devez utiliser les balises suivantes :

  • af:declarativeComponent vous permet de déclarer le composant
    • L’attribut viewId doit contenir le chemin vers votre composant (attention, lors d’un refractor sur le nom d’un composant, il ne sera pas mis à jours)
  • f:attribute permet de faire passer les différentes valeurs au composant
    • L’attribut name doit faire référence à votre attribut attribute-name définit dans le composant.
    • L’attribut value sera la valeur que vous voulez faire passer à votre composant
<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
  <af:declarativeComponent id="DC_fragment" viewId="composant.jsff">
         <f:attribute name="title" value="Présentation des fragments"/>
</af:declarativeComponent>
</jsp:root>

Différents types de valeurs peuvent être passés au composant, comme des tableaux, des graphes etc…

Voici quelques exemples de codes

Composant jsff :

<attribute>
    <attribute-name>typeString</attribute-name>
    <attribute-class>java.lang.String</attribute-class>
    <default-value>graphique</default-value>
</attribute>
<attribute>
    <attribute-name>typeTableau</attribute-name>
    <attribute-class>oracle.adf.view.rich.component.rich.data.RichTable</attribute-class>
    <required>true</required>
</attribute>
<attribute>
    <attribute-name>typeDCIteBinding</attribute-name>
    <attribute-class>oracle.adf.model.binding.DCIteratorBinding</attribute-class>
    <required>true</required>
</attribute>
…
<af:outputText value="#{attrs.typeString}" id="octb3"/>
…
<dvt:lineGraph id="panel1" value="#{attrs.typeDCIteBinding}"
                         subType="LINE_VERT_ABS"
                         inlineStyle="width:550px; height:550.0px;">
…
<af:table value="#{attrs.typeTableau}" var="row"
                    rendered="#{attrs.simpleLigne}"
                    emptyText="No data to display" rowBandingInterval="0"
                    id="t1" inlineStyle="width:225px; height:400.0px;">
…

Fragement jsff :

<f:attribute name="typeString" value="#{backingBenDemo.stringValue}"/>
<f:attribute name="typeTableau" value="#{bindings.DemoView1.collectionModel}"/>
<f:attribute name="typeDCIteBinding" value="#{bindings.DemoView1.graphModel}"/>

On peut donc faire appel a des données du backingBean ou du bindings du fragment jsff.