Hi all,

I'd like to discuss something I've been thinking about lately. How to clear 
forms easily when validation fails?

Consider this simple case;

<h:form>

                <h:messages />
        
                <h:inputText value="#{pprBean.firstname}" required="true"/>
                <h:inputText value="#{pprBean.surname}" required="true"/>

                <h:commandButton value="Save">
                    <f:ajax render="@form" execute="@form"/>
                </h:commandButton>

                <h:commandButton value="Reset" 
actionListener="#{pprBean.reset}">
                    <f:ajax render="@form" execute="@this"/>
                </h:commandButton>
                                
                <h:outputText value="#{pprBean.firstname}" id="display" />
                                
</h:form>

Bean;

private String firstname, surname;

    public void reset() {
        firstname = null;
        surname = null;
    }

So when you run this, if one of the field is empty and the other is not, 
validations fails and message is displayed. Problem happens when reset button 
is clicked to reset the form values. At processValidations phase UIInput saves 
the converted value at state
and since validation failed, update model is not executed so local value is 
never cleared. Clicking reset, clears the bean's values but inputText will not 
use the bound value and use the one kept in state as well ending up a confusing 
behavior. I've seen this in many forums.

I know wiki's like this;

http://wiki.apache.org/myfaces/ClearInputComponents

But I mean shouldn't this work as expected? Proposed solutions seem way too 
hard just to clear form values. (component binding and calling resetValue(), 
new view, javascript etc.)

If at processValidations phase, local value is not stored in state, I think 
that will make the code above work, but I'm not sure if there will be any side 
effects. Does anyone know why converted local value is kept at state by calling 
setValue().

Cagatay

Reply via email to