我需要为JSF中的某些组件生成动态ID来解决我的问题.
看看这个例子:
<h:outputText id="#{bean.id}" value="#{bean.value}" />
Run Code Online (Sandbox Code Playgroud)
我的问题是我收到此错误:
java.lang.IllegalArgumentException: Empty id attribute is not allowed
Run Code Online (Sandbox Code Playgroud)
当我查看生成的HTML输出时,组件的ID为空.这是怎么造成的,我该如何解决?
Bal*_*usC 19
你是对的.我在数据表中使用它.
如果#{bean}
表示在var
属性中声明的当前迭代对象,则会发生这种情况,如下所示:
<h:dataTable value="#{someBean.beans}" var="bean">
<h:column>
<h:outputText id="#{bean.id}" value="#{bean.value}" />
Run Code Online (Sandbox Code Playgroud)
在视图构建时,即需要组合JSF组件树的那一刻,评估JSF组件的id
(和binding
)属性.但是,#{bean}
仅在视图呈现时间期间可用,此时<h:dataTable>
需要迭代所有对象并为每个对象生成HTML表行.的#{bean}
,因此不能在视图生成时可用的和的计算结果为null
,最终得到EL-强制为空字符串.因此例外java.lang.IllegalArgumentException: Empty id attribute is not allowed
.
你基本上有3种选择:
使用视图构建时间标记来迭代集合.您只需要自己编写所有HTML样板:
<table>
<c:forEach items="#{someBean.beans}" var="bean">
<tr>
<td>
<h:outputText id="#{bean.id}" value="#{bean.value}" />
Run Code Online (Sandbox Code Playgroud)使用纯HTML元素:
<h:dataTable value="#{someBean.beans}" var="bean">
<h:column>
<span id="#{bean.id}">#{bean.value}</span>
Run Code Online (Sandbox Code Playgroud)不要设置动态ID,而是设置固定ID.JSF将通过在表格的行索引前加上它来确保HTML输出的唯一性:
<h:dataTable value="#{someBean.beans}" var="bean">
<h:column>
<h:outputText id="id" value="#{bean.value}" />
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
12854 次 |
最近记录: |