JSF2 - Component, traitement initial au chargement de la page
Bonjour à tous
Je teste actuellement les composants jsf2.
Je tente de faire un composant pour gérer les clés étrangères. Le principe est simple, on a un champ de saisie qui représente un identifiant de la clé étrangère et le composant se charge de rechercher le libellé associé... bref, très simple fonctionnellement...
Lorsque je modifie la valeur de la référence, ça fonctionne correctement (ou presque parce que si je reviens à la valeur initiale, le listener n'est pas appelé)
Mon problème de base est d'appeler le listener à la création de la vue.
Est ce qu'il y a une solution à ce problème ?
Le contexte est le suivant :
- PrimeFaces 3.2
- Eclipse Indigo
- Java 1.7
Code du composant
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:p="http://primefaces.org/ui">
<composite:interface>
<composite:attribute name="value" required="true" />
</composite:interface>
<composite:implementation>
<nobr>
<p:inputText value="#{cc.attrs.value}" valueChangeListener="#{personReference.identityChanged()}" update="personLabel" immediate="true" onchange="submit();"/>
<h:outputLabel id="personLabel" value="#{personReference.label}"/>
</nobr>
</composite:implementation>
</html> |
Le ManagedBean PersonReference
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
package com.sample.bean;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ValueChangeEvent;
import com.sample.ejb.PersonSingletonBean;
import com.sample.model.Person;
@ManagedBean(name = "personReference")
@ViewScoped
public class PersonReference
{
private String label;
@EJB
private PersonSingletonBean ejb;
public PersonReference()
{
super();
}
public String getLabel()
{
return label;
}
public void setLabel(String label)
{
this.label = label;
}
public void identityChanged(ValueChangeEvent event)
{
if (event != null)
{
extractLabel(event.getNewValue().toString());
}
}
private void extractLabel(String value)
{
Person person = ejb.get(value);
if (person != null)
{
setLabel(person.getName());
}
else
{
setLabel("La personne n'existe pas !");
}
}
} |
La page de test
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:util="http://java.sun.com/jsf/composite/component"
xmlns:p="http://primefaces.org/ui">
<ui:composition template="/template/template.xhtml">
<ui:define name="content">
<h:form id="jsfform1">
<util:personReference value="#{personTest.identity}"/>
<br/>
<p:commandButton value="Charger" action="#{personTest.load()}"/>
</h:form>
</ui:define>
</ui:composition>
</html> |
(Sachant que le ManagedBean à une propriété identity avec une valeur initiale en dur pour le test)