【问题标题】:RequestContext won't workRequestContext 不起作用
【发布时间】:2014-11-30 10:57:54
【问题描述】:

我无法使用 PrimeFaces 的 RequestContext 从后面的 bean 更新视图。在下面的示例中,我有一个按钮和 2 个面板。按下按钮时,我想更新一个面板,而不是另一个面板。 但它不起作用,我找不到错误! requestContext.update("panela"); 被解雇,但没有完成它的工作! 非常感谢您的帮助!

XHTML 文件:

<!DOCTYPE html>
<html xmlns="http://www.w3c.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
    <h:head/>
    <h:body>
        <h:form>
            <p:panelGrid columns="1">
                <p:commandButton value="Save" actionListener="#{runtimeUpdatesBean.save}" />
                <p:panel id="panela">
                    <h:outputText value="#{runtimeUpdatesBean.texta}"/>
                </p:panel>
                <p:panel id="panelb">
                    <h:outputText value="#{runtimeUpdatesBean.textb}"/>
                </p:panel>
            </p:panelGrid>
        </h:form>
    </h:body>
</html>

豆子:

package com.glasses.primework;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.context.RequestContext;

@ManagedBean
@SessionScoped
public class RuntimeUpdatesBean {
    private String texta;
    private String textb;
    private boolean outcome;

    public String getTexta() {
        texta += "a";
        System.out.println("RuntimeUpdatesBean.getTexta() = " + texta);
        return texta;
    }

    public String getTextb() {
        textb += "b";
        System.out.println("RuntimeUpdatesBean.getTextb() = " + textb);
        return textb;
    }

    public void save() {
        RequestContext requestContext = RequestContext.getCurrentInstance();

        if(outcome) {
            System.out.println("RuntimeUpdatesBean.save() = update panela");
            requestContext.update("panela");
            outcome = false;
        } else {
            System.out.println("RuntimeUpdatesBean.save() = update panelb");
            requestContext.update("panelb");
            outcome = true;
        }
    }
}

【问题讨论】:

    标签: jsf jsf-2 primefaces requestcontext


    【解决方案1】:

    问题在于您所引用的组件的 ID。
    在 JSF 中,当您将组件放置在 h:form(或某些 Primefaces 组件,如 TabView)中时,该组件的 Id 也将基于 h:form id 生成。
    这是示例:

    <h:form id="panelaForm">
       <p:panel id="panela">
           ....
       </p:panel>
    </h:form>
    

    在上述情况下,您的 p:panel 的 ID 将生成为 panelaForm:panela
    在您的情况下,由于您没有为 h:form 提供任何 ID,因此将附加动态 ID,例如 j_xyz:panela(您可以使用浏览器的检查元素查看它)。

    因此,如果您想在同一 h:form 内使用 ID panela 访问 p:panel,则无需附加表单 ID。
    但是如果你想在h:form之外访问p:panel,那么你需要附加h:form id来访问它。

    您的问题的解决方案是:为您的 h:form 使用自定义 ID(顺便说一句,这是最佳实践..)并通过附加该表单 ID 访问 p:panel

    <h:form id="panelaForm">
       <p:panel id="panela">
           ....
       </p:panel>
    </h:form>
    

    在托管 bean 中使用:

    RequestContext.getCurrentInstance().update("panelaForm:panela");
    

    【讨论】:

    • 您还可以将
      中的 prependId 属性设置为 false。因此,表单中的 id 不会被添加到子元素中。
    • @MahttiasSchrebiér:是的,你可以,但这取决于它如何影响应用程序的更广泛上下文。如果您在一个非常庞大的应用程序中工作,并且每个页面包含多个 ui:includes 并且包含的​​每个页面都是由全球多个开发人员开发的,那么您不能保证他们中的任何两个都使用相同的 Id 作为其组件。如果表单 id 附加了 atleaset,您可以根据模块来区分它们。
    • 你是对的。我只是想参考另一种处理该问题的可能性。在大多数情况下,就模块化和多开发人员编程而言,您的方式肯定是更可取的解决方案。
    【解决方案2】:

    我是这里的新人(Java EE),但是下面的解决方案对我有用:

    <!DOCTYPE html>
    <html   xmlns="http://www.w3c.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:p="http://primefaces.org/ui"
        xmlns:f="http://xmlns.jcp.org/jsf/core">
    <h:head/>
    <h:body>
        <h:form id="form">
            <p:panelGrid columns="1">
                <p:commandButton value="Save" actionListener="#{runtimeUpdatesBean.save}" update=":form" />
                <p:panel id="panela">
                    <h:outputText value="#{runtimeUpdatesBean.texta}"/>
                </p:panel>
                <p:panel id="panelb">
                    <h:outputText value="#{runtimeUpdatesBean.textb}"/>
                </p:panel>
            </p:panelGrid>
        </h:form>
    </h:body>
    

    【讨论】:

    • 嗨@Silwestpl!谢谢您的回答!但我必须说你的代码不起作用。如果您更新表单,那么您将自动更新panelapanelb。尽管此代码的目的是在 public void save() { ... } 中决定要更新哪个面板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2022-12-21
    • 2011-08-07
    • 2011-10-15
    • 1970-01-01
    • 2011-08-04
    相关资源
    最近更新 更多