I have created form and I want to show previous existing items on a table while a new one is creating. I’d like to show matching items as form is filling up. But when I try to filter the list without having the form completed, the validation messages appear and the table doesn’t get updated.
Don’t know if it’s possible, but what I want to do something like this:
<h:form id="form">
<h:outputText value="Name: "/>
<p:inputText value="#{itemsBean.name}" id="name" required="true"/>
<br/>
<h:outputText value="Description: "/>
<p:inputText value="#{itemsBean.description}" id="description" required="true"/>
<p:commandButton value="Save" update="form" actionListener="#{itemsBean.save}"/> //validate and save
<p:commandButton value="Filter" update="form" actionListener="#{itemsBean.updateItemsList}"/> //don't validate, and update the table.
<p:dataTable id="list" value="#{itemsBean.itemsList}" var="item">
<p:column>
<h:outputText value="#{item.name}"/>
</p:column>
<p:column>
<h:outputText value="#{item.description}"/>
</p:column>
</p:dataTable>
</h:form>
I’m very new to JSF.
I understand that you want to filter based on the
nameinput field. The<p:commandButton>sends by default an ajax request and has aprocessattribute wherein you can specify which components you’d like to process during the submit. In your particular case, you should then process only thenameinput field and the current button (so that its action will be invoked).The
processattribute can take a space separated collection of (relative) client IDs of the components, wherein@thisrefers to the current component. It defaults in case of<p:commandButton>to@form(which covers all input fields of the current form and the pressed button), that’s why they were all been validated in your initial attempt. In the above example, all other input fields won’t be processed (and thus also not validated).If you however intend to skip the
requiredvalidation for all fields whenever the button in question is been pressed, so that you can eventually process multiple fields which doesn’t necessarily need to be all filled in, then you need to make therequired="true"a conditional instead which checks if the button is been pressed or not. For example, let it evaluatetrueonly when the save button has been pressed:This way it won’t be validated as
required="true"when a different button is pressed. The trick in the above example is that the name of the pressed button (which is essentially the client ID) is been sent as request parameter and that you could just check its presence in the request parameter map.See also: