这是JSF代码:
<h:inputText binding="#{bean.input}" />
Run Code Online (Sandbox Code Playgroud)
这里是支持bean的一部分用于绑定支持:
private HtmlInputText input;
public void setInput(HtmlInputText input) {
this.input = input;
}
public HtmlInputText getInput() {
return this.input;
}
Run Code Online (Sandbox Code Playgroud)
当我第一次打开页面时一切正常但是当我第二次打开它时(刷新或在另一个选项卡中打开相同的URL或任何其他方式)我得到重复的ID错误.错误消息表明<h:inputText>没有唯一ID.以下是长错误消息的一部分:
java.lang.IllegalArgumentException: Component ID formId:inputId has already been found in the view
+id: inputId type: javax.faces.component.html.HtmlInputText@cafebabe
Run Code Online (Sandbox Code Playgroud)
添加binding属性后出现问题.如果我删除它,一切都会再次正常工作.我如何正确使用binding属性?
在JSF中,<ui:repeat/>类似的组件(如PrimeFaces)<p:dataTable/>根据迭代索引为子组件生成动态ID,即:
<p:dataTable id="table" var="item" value="#{itemList}">
<h:outputText id="name" value="#{item.name}"/>
</p:dataTable>
Run Code Online (Sandbox Code Playgroud)
会生成这样的东西:
<table id="table">
<span id="table:0:name">name0</span>
<span id="table:1:name">name1</span>
<span id="table:2:name">name2</span>
...
<span id="table:n:name">nameN</span>
</table>
Run Code Online (Sandbox Code Playgroud)
所以所有元素显然都有明确的客户ID.我故意跳过了<tr/>,<td/>等
因此,<p:ajax ... update=":table:name"/>引用表中的所有名称并且它工作正常,<p:ajax ... update=":table:#{someDesiredIndex}:name"/>失败并显示类似于SEVERE: javax.faces.FacesException: Cannot find component with identifier ":table:0:name" in view.事件的消息,但我可以确认该组件存在于标记中.是不是可以这样做?
我正在运行GlassFish 3.1.2和Mojarra 2.1.6,以防它相关.