CERCA SITEMAP FEED RSS 1280
Ultimo aggiornamento: 30 Agosto 2009

Gestione degli eventi in JavaServer Faces

In JavaServer Faces esistono due tipi di eventi: action event e value-change event.
Il primo viene generato da quei componenti come bottoni e link che vengono attivati quando l’utente vi clicca sopra, il secondo invece viene generato da quei componenti il cui valore può essere cambiato dall’utente come textfield, checkbox, menu ed altri ancora.
In aggiunta è possibile gestire anche phase event, ovvero eventi che si verificano prima e dopo ogni fase del ciclo di vita della pagina JSF.

Gestire l'evento value-change

L’evento value-change rappresentato dalla classe ValueChangeEvent del package javax.faces.event si verifica quando l’utente modifica il valore di un componente che implementa l’interfaccia EditableValueHolder.
Affinchè sia possibile gestire l’evento è necessario definire un listener che implementi l’interfaccia ValueChangeListener:
public class MioChangeListener implements ValueChangeListener 
{
  ...

  public void processValueChange(ValueChangeEvent event) 
  {
    ...

  }
}
Per registrare il listener è possibile utilizzare il tag f:valueChangeListener all’interno del tag del componente specificando o la classe del listener mediante l’attributo type:
<h:inputText id="id_input" size="50" value="#{miobean.valore}" required="true">
  <f:valueChangeListener type="miopackage.MioChangeListener" />
</h:inputText>
o il riferimento ad un oggetto che implementa l’interfaccia ValueChangeListener mediante l’attributo binding:
<h:inputText id="id_input" size="50" value="#{miobean.valore}" required="true">
  <f:valueChangeListener binding="#{miobean.miochangelistener}" />
</h:inputText>
Alternativamente è possibile evitare l’uso del tag f:valueChangeEvent facendo riferimento al metodo di un backing bean che accetta un ValueChangeEvent e restituisce void mediante l’attributo valueChangeListener nel tag del componente
<h:inputText id="id_input" size="50" value="#{miobean.valore}" valueChangeListener="#{miobean.metodochangelistener}" required="true" />

Gestire l'evento action

L’evento action rappresentato dalla classe ActionEvent si verifica quando un componente, come un bottone o un link, che implementa l’interfaccia ActionSource o ActionSource2 viene attivato.
Per gestire tale evento è necessario definire una classe che implementa l’interfaccia ActionListener:
public class MioActionListener implements ActionListener 
{
  ...

  public void processAction(ActionEvent e) 
  {
    ...
  }
   
}
Per registrare il listener presso il componente è possibile usare il tag f:actionListener specificando o la classe del listener mediante l’attributo type
<h:inputText id="id_input" size="50" value="#{miobean.valore}" required="true">
  <f:actionListener type="miopackage.MioActionListener" />
</h:inputText>
o il riferimento ad un oggetto che implementa l’interfaccia ActionListener mediante l’attributo binding.
<h:inputText id="id_input" size="50" value="#{miobean.valore}" required="true">
  <f:actionListener binding="#{miobean.mioactionlistener}" />
</h:inputText>
In alternativa si può fare riferimento mediante l’attributo actionListener del tag del componente al metodo di un backing bean che accetta un ActionEvent e restituisce void.
<h:inputText id="id_input" size="50" value="#{miobean.valore}" valueChangeListener="#{miobean.metodoactionlistener}" required="true" />
E’ importante comprendere la differenza fra l’attributo actionListener e l’attributo action: il primo fa riferimento ad un metodo per gestire l’evento click sul componente, il secondo invece fa riferimento ad un metodo che determina la logica di navigazione.
L’implementazione JSF invoca sempre l’ActionListener prima del metodo referenziato dall’attributo action.

Attributo immediate

Come è desiderabile nella maggior parte delle web application, in JavaServer Faces gli eventi value-change sono gestiti dopo la fase di Process Validation e gli gli eventi action dopo la fase di Application Invoke.
A volte però può essere necessario gestire tali eventi all’inizio del ciclo di vita per bypassare la fase di validazione: per fare ciò si fa uso dell’attributo immediate.
Se si pone a true tale attributo gli eventi value-change ad action vengono per il componente vengono gestiti dopo la fase di Apply Request Values (prima però i dati del componente vengono convertiti e validati) e quindi è possibile saltare direttamente alla fase di Render Response invocando il metodo renderResponse dell’istanza FacesContext.

Gestione di phase event

JavaServer Faces consente di gestire anche phase event rappresentati dalla classe PhaseEvent che si verificano prima e dopo le varie fasi del ciclo di vita.
Per gestire tali eventi è necessario definire un listener che implementa l’interfaccia PhaseListener contenente tre metodi:
PhaseId getPhaseId()

void afterPhase(PhaseEvent)

void beforePhase(PhaseEvent)
e quindi occorre registrare il listener nel file di configurazione dell’applicazione:
<faces-config>
  <lifecycle>
    <phase-listener>miopackage.MioPhaseListener</phase-listener>
  </lifecycle>
</faces-config>