Reputation: 357
Is this legal?
<h:form id="status${a.myID}" >
// ...
</h:form>
where 'a' is an object in a backing bean. It seems to sort of work, but when I look at the rendered HTML, I see the id as: :0:status
for example, instead of :status0
as I would expect. My main problem is trying to reference the id from <f:ajax render=...
. I'm getting "contains an unknown id..." with pretty much every combination I can think of. Is it possible to set ids using values from a backing bean reliably?
Upvotes: 2
Views: 2244
Reputation: 1109874
The single-letter variable name ${a}
and the symptom of an iteration index like :0
being auto-appended in client ID, suggests that this <h:form>
is inside a JSF iterating component such as <h:dataTable>
or <ui:repeat>
with a var="a"
which actually is not a backing bean. It would confirm and explain all symptoms described so far. If ${a}
were a real backing bean (and not an iteration variable), then it would have "worked" and you would have seen :0:status0
, :1:status0
, :2:status0
, etc — whose usefulness is questionable though.
First of all, the id
attribute of a JSF component is evaluated and set during view build time, the moment when the JSF component tree is to be built based on XHTML source code file. The var
attribue of a JSF iterating component is set during view render time, the moment when the HTML output is to be generated based on JSF component tree. Thus, logical consequence is, the object set by var
attribute is not available at the moment the id
attribute needs to be set and thus evaluates to null/empty-string. The effect is exactly the same as when you would do
<h:form id="status">
JSF iterating components namely already auto-appends the iteration index to the generated client ID. It would not make any sense to manually set the ID of the iterated item in the component ID. There's namely physically only one <h:form>
component in the JSF component tree which is in turn reused multiple times during producing the HTML output based on the current iteration round.
This Q&A should also give more food for thought: JSTL in JSF2 Facelets... makes sense?
Coming back to your concrete functional requirement of referencing a component in <f:ajax render>
, you definitely need to solve this differently. Unfortunately you didn't clearly describe the context of the source component and the target component, so it's impossible to give/explain the right client ID and so I'm just giving you a link so that you can figure it out on your own: How to find out client ID of component for ajax update/render? Cannot find component with expression "foo" referenced from "bar"
Unrelated to the concrete problem, the old JSP EL style ${...}
has in Facelets exactly the same effect as #{...}
. In order to avoid confusion by yourself and your future maintainers it's recommend to completely ban usage of ${...}
and stick to #{...}
all the time. See also Difference between JSP EL, JSF EL and Unified EL
Upvotes: 5
Reputation: 3177
Actually ${a.myID}
this is not rendering any output. As you are getting :0:status
as form ID which implies, :0
is parent of :status
in HTML tree structure.
Upvotes: 0