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 ...
Get JavaServer Faces now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.