【问题标题】:Duplicate component id in JSF [duplicate]JSF中的重复组件ID [重复]
【发布时间】: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 已在视图中找到”

似乎没有一种模式可以确定何时发生此异常。有没有办法从父组件中“删除”组件?

【问题讨论】:

    标签: jsf components


    【解决方案1】:

    binding 属性应该引用请求范围的 bean 属性,而不是会话范围的属性。

    另见:

    也就是说,根据具体的功能需求,使用普通 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 已在视图中找到。任何其他解决方案来解决这个问题?帮助我。在此先感谢
    • 这并没有解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2016-01-20
    • 2011-06-04
    • 2015-07-28
    • 2012-11-21
    • 1970-01-01
    相关资源
    最近更新 更多