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 文件 request 中定义为请求范围。我们可以为 bean 中的各个属性定义范围吗? faces-config.xml?您使用的是哪个 JSF 版本? 我不完全确定,但我使用的jar文件是javax.faces-2.1.7.jar 我建议您下载并坚持使用书中提到的相同 JSF 版本。它肯定在 1.x 中的某个地方,因为使用老式的 faces-config.xml 方式来注册 bean。或者,找一本更现代的书。 JSF 2.x 已经推出 2.5 年了,在支持 bean 中创建组件有点……笨拙。 那么我将切换到一本新书,但是它确实让我感到困扰,当在请求范围内定义某些内容时,不应该在每次调用后立即销毁 bean 吗?在这一点上可能没有实际意义。【参考方案2】:

检查表单中是否有两个具有相同 id 的元素。就我而言,这就是问题所在。

【讨论】:

OP 的情况并非如此。仔细查看错误消息:“组件 ID welcomeForm:j_id51 已在视图中找到”。有问题的组件有一个动态生成的 ID j_id51,这意味着有问题的组件根本没有设置固定的 ID,这意味着这个问题不可能是由在多个组件上指定相同的固定 ID 引起的(其中毕竟是一个相当明显的错误)。【参考方案3】:

把这个参数放到web.xml

    <context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>

【讨论】:

我放了 细节。即使我遇到了同样的错误(重复的 id)。 javax.servlet.ServletException: 组件 ID :j_id22 已在视图中找到。任何其他解决方案来解决这个问题?帮助我。在此先感谢 这并没有解决我的问题。

以上是关于JSF中的重复组件ID [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JSF,重复组件 ID,同时从 IceFaces 1.8 迁移到 3.3 [重复]

如何从jsf / primefaces中的托管bean向页面添加组件[重复]

通用 JSF 实体转换器 [重复]

JSF 复合组件值和 <c:if> [重复]

在运行时添加您在编译时不知道的 JSF 组件 [重复]

从当前行数据表中获取 id 以链接 JSF Primefaces Java [重复]