In case you aren’t using ajax, or are still on JSF 1.x, and you really need to invoke a business action in cancel()
method (i.e. just reloading the page is insufficient), then your best bet is to add immediate="true"
to the button. This way all input fields which don’t have immediate="true"
will be skipped in processing.
<h:commandButton value="Cancel" action="#{bean.cancel}" immediate="true" />
On JSF 2.x, much better is to submit the form by <f:ajax>
, which by default only processes @this
instead of @form
.
<h:commandButton value="Cancel" action="#{bean.cancel}">
<f:ajax />
</h:commandButton>
If you want to navigate to another page here, add ?faces-redirect=true
to the outcome in the cancel()
method.
Or, if you actually don’t need to invoke any business action at all, then just use <h:button>
wherein you directly specify the (implicit) navigation case outcome.
<h:button value="Cancel" outcome="previouspage" />
This will basically reload the page by a GET request. The <h:button>
doesn’t exist in JSF 1.x, but you can also just use plain HTML+JS for that.
See also:
- Why was “immediate” attribute added to the EditableValueHolders?
- How to navigate in JSF? How to make URL reflect current page (and not previous one)
- How to let validation depend on the pressed button?