Whenever an UICommand component fails to invoke the associated action method or an UIInputelement fails to update the model value, and you aren't seeing any obvious exceptions/warnings in the server log, then verify the following:
-
UICommandandUIInputcomponents must be placed inside anUIFormcomponent, e.g.<h:form>, andUICommandcomponents must not havetype="button"attribute (get rid of it, that's only for push buttons, not for submit buttons). -
You cannot nest multiple
UIFormcomponents in each other. This is namely illegal in HTML. Watch out with include files! You can useUIFormcomponents in parallel, but they won't process each other during submit. -
No
UIInputvalue validation/conversion error should have occurred. You can use<h:messages>to show any messages which are not shown by any input-specific<h:message>components. Don't forget to include theidof<h:messages>in the<f:ajax render>, if any, so that it will be updated as well on ajax requests. -
If
UICommandorUIInputcomponents are placed inside an iterating component like<h:dataTable>,<ui:repeat>, etc, then you need to ensure that exactly the samevalueof the iterating component is been preserved during the apply request values phase of the form submit request. JSF will namely reiterate over it to find the clicked link/button and submitted input values. Putting the bean in the view scope and/or making sure that you load the data model in@PostConstructof the bean (and thus not in a getter method!) should fix it. -
The
renderedattribute of the component and all of the parent components should not evaluate tofalseduring the apply request values phase of the form submit request. JSF will namely recheck it as part of safeguard against tampered/hacked requests. Making the bean@ViewScopedor making sure that you're properly preinitializing the condition in@PostConstructof a@RequestScopedbean should fix it. The same applies to thedisabledattribute of the component, which should not evaluate totrueduring apply request values phase. -
The
onclickattribute of theUICommandcomponent and theonsubmitattribute of theUIFormcomponent should not returnfalseor cause a JavaScript error. There should in case of<h:commandLink>or<f:ajax>also be no JS errors in the document. In recent browsers you can press F12 to get the web developer toolset with the JS console. All JS errors will be logged there. Usually googling the exact error message will already give you the answer. -
If you're using JSF 2.x
<f:ajax>on the command component, make sure that you have a<h:head>in the master template instead of the<head>. Otherwise JSF won't be able to auto-include the necessaryjsf.jsJavaScript file which contains the Ajax functions. This would result in a JavaScript error like "mojarra is not defined" in the JS console. -
If a parent of the
<h:form>with theUICommandbutton is beforehand been rendered/updated by an ajax request coming from another form in the same page, then the first action will always fail. The second and subsequent actions will work. This is caused by a bug in view state handling which is reported as JSF spec issue 790 and currently scheduled to be fixed in JSF 2.3. For older JSF versions, you need to explicitly specify the ID of the<h:form>in therenderof the<f:ajax>, or to use the script in this answer. -
If the
<h:form>hasenctype="multipart/form-data"set in order to support file uploading, then you need to make sure that you're using at least JSF 2.2, or that the servlet filter who is responsible for parsing multipart/form-data requests is properly configured, otherwise theFacesServletwill end up getting no request parameters at all and thus not be able to apply the request values. How to configure such a filter depends on the file upload component being used. For Tomahawk<t:inputFileUpload>, check this answer and for PrimeFaces<p:fileUpload>, check this answer. Or, if you're actually not uploading a file at all, then remove the attribute altogether. -
Be sure that the
ActionEventargument ofactionListeneris anjavax.faces.event.ActionEventand thus notjava.awt.event.ActionEvent, which is what most IDEs suggest as 1st autocomplete option. -
Be sure that no
PhaseListeneror anyEventListenerin the request-response chain has changed the JSF lifecycle to skip the invoke action phase by for example callingFacesContext#renderResponse()orFacesContext#responseComplete(). -
Be sure that no
FilterorServletin the same request-response chain has blocked the request fo theFacesServletsomehow.
My bet that your particular problem is caused by point 2: nested forms. You probably already have a <h:form> in the parent page which wraps the include file. The include file itself should not have a <h:form>. You can also fix it the other way round, ensure that the parent page does not have a <h:form> around the place of the include file.