Restore View - Creates or restores the previous page.
Apply Request Values - Set component submitted values to request values.
Process Validations - Convert and validate component values. Set component values to submitted values if valid.
Update Model Values - Set backing bean values to component values.
Invoke Application - Execute actionListeners and actions.
Render Response - Return response.
Now with bypassUpdates attribute, only 4-5 phases are skipped; validation happens as usual. To credit Nick Belaevski for giving a concrete example of a sign up form, you can have one button in form to cancel (set immediate=true) and another checks whether screenname is already taken (set bypassUpdates=true). Obviously, setting both to true for same component does not make sense. If you are still not clear, here is code snippet from org. ajax4jsf.component.AjaxActionComponent
if (event instanceof ActionEvent) {It should be crystal clear now...at least it was for me.
if (event.getComponent() == this) {
if (isImmediate()) {
event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
} else if (isBypassUpdates()) {
event.setPhaseId(PhaseId.PROCESS_VALIDATIONS);
} else {
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
}
}
// UICommand set Phase ID for all ActionEvents - bypass it.
getParent().queueEvent(event);
}