Specifying When to Fire an Event
So far, I’ve told you how to bind a
component to an event handling method,
but I haven’t let you in yet on the secret of how an
ActionEvent can be made to fire either at the end
of the Apply Request Value phase or in the Invoke Application phase.
There are different ways to solve this problem, but the specification
group decided to go with an approach in which the source component
decides when the event should be processed, with a little bit of help
from the application developer. Here’s how it works.
The FacesEvent class—which all JSF events
must extend either directly or through one of the standard
subclasses, such as ActionEvent—defines a
property named phaseId:
package javax.faces.event;
import java.util.EventObject;
...
public abstract class FacesEvent extends EventObject {
private PhaseId phaseId = PhaseId.ANY_PHASE;
public PhaseId getPhaseId( ) {
return phaseId;
}
public void setPhaseId(PhaseId phaseId) {
this.phaseId = phaseId;
}
...
}The phaseId property data type is
PhaseId, which is a type-safe enumeration
containing one value per request processing lifecycle phase:
PhaseId.APPLY_REQUEST_VALUES,
PhaseId.PROCESS_VALIDATIONS,
PhaseId.UPDATE_MODEL_VALUES,
PhaseId.INVOKE_APPLICATION,
PhaseId.RENDER_RESPONSE, or
PhaseId.ANY_PHASE. The
PhaseId.ANY_PHASE value means
“process the event in the phase where it was
queued,” and it’s the default value
for the phaseId property.
So even though UICommand always queues an
ActionEvent in the Apply Request ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access