【问题标题】:Panel update in PrimeFaces [duplicate]PrimeFaces 中的面板更新 [重复]
【发布时间】:2016-11-01 23:08:27
【问题描述】:

我在 PrimeFaces 面板更新时遇到问题。

我有一个包含两个输出面板的主面板。每个输出面板可能包含一个按钮,即交换面板。交换面板按钮用于将输出面板从一个切换到另一个。

如果我更新按钮操作以呈现面板,我需要提供主面板 ID,它可以正常工作。但是对于树形结构层次结构,如果我的意思是给两个输出面板 Ids 它不会渲染面板。当我放置日志以确认时,Button 操作仅调用一次。

我将附上下面给出的代码示例:

renderingPanel.XHTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets" 
      xmlns:c="http://java.sun.com/jsp/jstl/core">

    <h:head>
        <title>
           Panel Rendered
        </title>
    </h:head>
    <h:body>
        <f:event listener="#{PanelRendered.initializePageAttributes}" type="preRenderComponent"/>

        <h:form id="panelFormId">
            <p:panel id="mainPanelId" widgetVar="mainPanelId">
                <p:outputPanel id="mainOutputPanel" rendered="#{PanelRendered.mainPanelRendered}">
                    <h:outputText value="hello main"/>
                    <p:commandButton id="mainSwap" value="Swap To Sub Panel" update="mainOutputPanel,subOutputPanel" action="#{PanelRendered.mainButtonAction}" icon="ui-icon-transferthick-e-w"/>
                </p:outputPanel>

                <p:outputPanel id="subOutputPanel" rendered="#{PanelRendered.subPanelRendered}">
                    <h:outputText value="hello sub"/>
                    <p:commandButton id="subSwap" value="Swap To Main" update="subOutputPanel,mainOutputPanel"  action="#{PanelRendered.subButtonAction}" icon="ui-icon-transferthick-e-w"/>
                </p:outputPanel>

            </p:panel>
        </h:form>
    </h:body>
</html>

PanelRendered.Java

public class PanelRendered
{

    private boolean mainPanelRendered;
    private boolean subPanelRendered;
    private Logger logger = Logger.getLogger(PanelRendered.class);

    public PanelRendered()
    {
         File configFile = new File("/home/nafeel/Applications/apache-tomcat-7.0.34/webapps/treetable/conf" + File.separator + "log4j.properties");
        if (configFile.exists())
        {
            PropertyConfigurator.configure(configFile.getAbsolutePath());
        }
        else
        {
            System.out.println("Configuration Logger File not available");
        }
    }

    public String mainButtonAction()
    {
        logger.info("Enter inside main button action");
        mainPanelRendered = false;
        subPanelRendered = true;
        return null;
    }

    public String subButtonAction()
    {
        logger.info("Enter inside sub button action");
        mainPanelRendered = true;
        subPanelRendered = false;
        return null;
    }

    public void initializePageAttributes()
    {
        logger.info("Enter inside initializepage");
        mainPanelRendered = true;
        subPanelRendered = false;
    }

    /**
     * @return the mainPanelRendered
     */
    public boolean isMainPanelRendered()
    {
        return mainPanelRendered;
    }

    /**
     * @param mainPanelRendered the mainPanelRendered to set
     */
    public void setMainPanelRendered(boolean mainPanelRendered)
    {
        this.mainPanelRendered = mainPanelRendered;
    }

    /**
     * @return the subPanelRendered
     */
    public boolean isSubPanelRendered()
    {
        return subPanelRendered;
    }

    /**
     * @param subPanelRendered the subPanelRendered to set
     */
    public void setSubPanelRendered(boolean subPanelRendered)
    {
        this.subPanelRendered = subPanelRendered;
    }
}

【问题讨论】:

  • 您在服务器日志或浏览器上遇到的任何错误。因为我只是复制过去,到目前为止它还在工作。
  • 我使用 faces-config 来声明托管 bean。托管 Bean 名称与类名称相同。我正在使用会话范围而不是查看范围

标签: jsf jsf-2 primefaces


【解决方案1】:

你能遵循一些指导方针吗 JAVA代码

  • 为 bean 使用正确的命名,因为您的类名是 PanelRendered,并且您在 xhtml 文件中使用相同的名称并且您没有发布您的 @ManagedBean @ViewScoped,所以我假设您在 xhtml 上的 bean 名称应该是 panelRendered 而不是 @987654324 @。
  • 使用@PostConstruct 来初始化JSF bean 中的变量。避免使用 java 构造函数。

XHTML 代码: 我只是将 bean 名称从 PanelRendered 更改为 panelRendered 并且我是这样的更新面板 update="mainPanelId"

您的代码在我这里运行良好,如果您有任何错误,请在此处发布。

您的问题 但是对于树形结构层次结构,如果我的意思是给两个输出面板 Ids 它不会渲染面板。

如果带有rendered="false"的组件没有在浏览器上生成任何HTML代码,所以你在输出的HTML代码中没有找到id="subOutputPanel"标签,当你点击命令按钮时它会调用back bean方法和来更新update="mainOutputPanel,subOutputPanel" 它没有找到subOutputPanel id 和ajax 调用将失败,您将无法获得正确的行为或UI。并且从下一次它没有调用任何东西,对于停止回调 bean 方法,您可以研究在素面得到 ajax 失败后发生的事情。希望这会对你有所帮助。

【讨论】:

  • 如果你给 mainPanelId 它的工作正常为我的页面本身。但是如果你给两个输出面板 ID 它不起作用。我的意思是问原因。为什么 subPanel Id 更新在这里不起作用。?
  • 查看我更新的代码。谢谢,如果你同意,请接受我的回答。
  • 我现在明白了这个概念,但是我怎么能更新两个 ID。可能吗。?我用两个文本框尝试了相同的更新,效果很好。请说清楚。
【解决方案2】:

在 JSF 方面我有点不习惯,但我也遇到过类似的问题。我认为 PanelRendered 类中的布尔值应该具有如下命名的 getter:

public boolean isMainPanelRendered()
public boolean isSubPanelRendered()

XHTML 文件中使用的表达式语言保持不变。在搜索 bean 的属性(函数或变量)之前,表达式语言会在前面添加“is”并将字母大写,这似乎是一种约定。

所以这个:

rendered="#{PanelRendered.mainPanelRendered}"
rendered="#{PanelRendered.subPanelRendered}"

保持不变。 编辑:在渲染的最后添加了}。 编辑:意识到它需要一个用于私有成员变量的getter

【讨论】:

  • 当我们使用 getter 和 setter 时,它会自动创建变量的 is in 前缀。我希望这不是问题。我在所有项目中都尝试过。
  • 我还没有真正找到支持这一点的文档,但这是我在从事的 JSF primefaces 项目中的经验。我们使用的是 VCH 类型方法而不是 JavaBeans 样式,但我没有理由相信那里的约定会发生变化。
  • 通过封装布尔变量将产生getter/setter。 getter/setter 可以为您在 JSF 中提到的表达式语言创建实例名称。我也试过你的技术,但也失败了。 JSF 需要 getter 和 setter 来绑定 Java 类。
  • 那么您是否尝试使用名为 isMainPanelRendered/isSubPanelRendered 的 getter?
  • 是的,它失败了@David Findlay。我只是修改我的问题。这对我来说可以。如果我把主面板ID。而不是我的主面板 ID。我需要给我的子面板 ID 它不起作用。问题在于更新。不要继续使用 Java bean 或其他任何东西。
猜你喜欢
  • 2013-08-30
  • 2012-12-23
  • 2015-02-02
  • 2012-04-23
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多