JSF中的重复组件ID [重复]
Posted
技术标签:
【中文标题】JSF中的重复组件ID [重复]【英文标题】:Duplicate component id in JSF [duplicate] 【发布时间】:2012-04-11 07:05:24 【问题描述】:我正在研究“JSF in action book”中的一个示例,该示例显示了由输入驱动的数字的动态网格(html 表格)。下面是jsp部分
<p>
<h:panelGrid id="controlPanel"
binding="#helloBean.controlPanel"
columns="20" border="1" cellspacing="0"/>
</p>
<h:commandButton id="redisplayCommand" type="submit"
value="Redisplay"
actionListener="#helloBean.addControls"/>
绑定bean代码如下
public void addControls(ActionEvent actionEvent)
Application application = FacesContext.getCurrentInstance().getApplication();
List children = controlPanel.getChildren();
children.clear();
for (int count = 0; count < numControls; count++)
HtmlOutputText output = (HtmlOutputText)application.
createComponent(HtmlOutputText.COMPONENT_TYPE);
output.setValue(" " + count + " ");
output.setStyle("color: blue");
children.add(output);
代码对一些值有效,然后我不知从哪里得到这个错误
“javax.servlet.ServletException: 组件 ID welcomeForm:j_id51 已在视图中找到”
似乎没有一种模式可以确定何时发生此异常。有没有办法从父组件中“删除”组件?
【问题讨论】:
【参考方案1】:binding
属性应该引用请求范围的 bean 属性,而不是会话范围的属性。
另见:
Binding attribute causes duplicate component ID found in the view也就是说,根据具体的功能需求,使用普通 UI 组件可能会有更好的方法来实现需求。
【讨论】:
bean 在 faces-config.xml 文件检查表单中是否有两个具有相同 id 的元素。就我而言,这就是问题所在。
【讨论】:
OP 的情况并非如此。仔细查看错误消息:“组件 ID welcomeForm:j_id51 已在视图中找到”。有问题的组件有一个动态生成的 IDj_id51
,这意味着有问题的组件根本没有设置固定的 ID,这意味着这个问题不可能是由在多个组件上指定相同的固定 ID 引起的(其中毕竟是一个相当明显的错误)。【参考方案3】:
把这个参数放到web.xml
<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>false</param-value>
</context-param>
【讨论】:
我放了以上是关于JSF中的重复组件ID [重复]的主要内容,如果未能解决你的问题,请参考以下文章
JSF,重复组件 ID,同时从 IceFaces 1.8 迁移到 3.3 [重复]