我在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;
}
}
答案 0 :(得分:2)
你能遵循一些准则吗? JAVA代码
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}"
保持不变。
编辑:最后渲染时添加了}
。
编辑:意识到它需要私有成员变量的吸气剂