forms - How to use EL with <ui:repeat var> in id attribute of a JSF component -


i have following code:

<ui:repeat var="class2" value="#{bean.list}" varstatus="status">   <h:form id="#{class2.name}">      <h:outputtext value="#{class2.name}" />   </h:form> </ui:repeat> 

however, when open page, errors follows:

component identifier must not zero-length string

but printed in <h:outputtext>. how caused , how can solve it?

you can use el in id attribute of jsf component, el variable has available during view build time, while jsf component tree built. however, <ui:repeat> runs during view render time, while html output generated based on jsf component tree. <ui:repeat var> not available during view build time , #{class2.name} evaluates null totally explains error got. works in <h:outputtext> because runs during view render time.

if replace <ui:repeat> <c:foreach>, runs during view build time, it'll work intented. <c:foreach> namely generate physically multiple <h:form> components in jsf component tree each generate individually own html output (in contrary <ui:repeat>, wherein same <h:form> component been reused multiple times generate html output).

<c:foreach var="class2" items="#{bean.list}" varstatus="status">   <h:form id="#{class2.name}">      <h:outputtext value="#{class2.name}" />   </h:form> </c:foreach> 

however, wonder why need that. there's no need dynamically assign component ids. jsf ensure uniqueness of id. below example,

<ui:repeat var="class2" value="#{bean.list}" varstatus="status">   <h:form id="form">      <h:outputtext value="#{class2.name}" />   </h:form> </ui:repeat> 

will end in multiple forms each unique id, suffixed iteration index of <ui:repeat>. if need use #{class2.name} javascript/jquery purposes (you did state concrete functional requirement in question thought right solution, it's merely guessing), wrap in plain vanilla html element:

<ui:repeat var="class2" value="#{bean.list}" varstatus="status">   <div id="#{class2.name}">      <h:form id="form">       <h:outputtext value="#{class2.name}" />     </h:form>   </div> </ui:repeat> 

or set style class of jsf component, selectable via css selector:

<ui:repeat var="class2" value="#{bean.list}" varstatus="status">   <h:form id="form" styleclass="#{class2.name}">     <h:outputtext value="#{class2.name}" />   </h:form> </ui:repeat> 

see also:


Comments

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -