PrimeFaces中的面板更新

时间:2016-06-30 02:53:10

标签: jsf jsf-2 primefaces

我在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;
    }
}

2 个答案:

答案 0 :(得分:2)

你能遵循一些准则吗? JAVA代码

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

XHTML代码: 我只是将bean名称从@PostConstruct更改为PanelRendered,我就像这样更新面板panelRendered

你的代码在我的最后工作正常,如果你有任何错误,请在这里发布。

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

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

答案 1 :(得分:1)

当涉及到JSF时,我有点像n00b,但我遇到过类似的问题。我认为PanelRendered类中的布尔值应该具有如下命名的getter:

public boolean isMainPanelRendered()
public boolean isSubPanelRendered()

XHTML文件中使用的表达式语言保持不变。这似乎是一种惯例,表达式语言将添加&#34;是&#34;在搜索bean的属性(函数或变量)之前,将字母大写并大写字母。

所以这个:

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

保持不变。 编辑:最后渲染时添加了}。 编辑:意识到它需要私有成员变量的吸气剂