Why prependId=”false” in a jsf form?

In my experience, I never use this attribute. However, in some cases it can be useful.

When you use Facelets, you can create templates or include pages inside another page. So you can imagine that a page could be included in several different pages. Take the example where the parent pages contain a form, with different id:

Page 1:

<h:form id="form1">
    <ui:include src="https://stackoverflow.com/questions/3972653/pages/my-page.xhtml"/>
    ...
</h:form>

Page 2:

<h:form id="form2">
    <ui:include src="https://stackoverflow.com/questions/3972653/pages/my-page.xhtml"/>
    ...
</h:form>

Now, in the my-page.xhtml, you have a <h:inputText id="foo"/>. In the first case, the real ID of the input will be form1:foo, while in the second case, it will be form2:foo. This could create complex situations if you need a direct access to this component in Javascript or in Java (using findComponent("...") method).

If you use prependId="false" (or on some components forceId="true"), the real ID will be simply foo, and then your code will be simpler as you will not have to care about the container of the input field.

However, you will have to use this attribute carefully, as you may get a duplicate ID error if you use this prepend attribute too often…

In modern jsf versions it might also break ajax, see UIForm with prependId=”false” breaks <f:ajax render>

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)