Actually, all that static code did was clutter up the question. I'll take it for granted that you've initialized stuff.
When you fire an
JSF command (commandButton, commandLink) or AJAX action, each of the controls in the submitted form (or for AJAX, the selected parts of the form) are processed.
First the incoming values are validated. Failure to validate aborts processing,
Then the valueChangeListeners are invoked for each control which has a listener. The actual pseudo code is:
You can get false firings if the "equals"
test fails. One common way for that to happen is if the value used to populate the form had trailing spaces, since HTML will remove the spaces as it does with any space-padded output text. Then when the value is submitted, the trimmed value is visually equal to the original value, but in raw comparison it is unequal.
A less common problem would be if the backing bean property value didn't convert to the exact same (character-by-character)
String value as the value being recieved from the form. Since HTML is text-based, the form value is always text, but properties can be of many types, and JSF whill automatically convert them where possible, or require an explicit converter where no automatic conversion is suitable.