使用绑定更新组件(JSF2 + PrimeFaces 5.0.2)

时间:2014-06-12 23:41:56

标签: jsf-2 primefaces binding

我在处理PrimeFaces 5.0和带有"绑定"的panelGroup时遇到了一些麻烦。我知道,"绑定"糟透了,但我正在使用遗留系统并相信我,如果没有"绑定"它真的很难让它成为正确的方式。

所以,当我点击mi链接时,"绑定"在" action"之前调用属性,然后调用该操作,并在所有"更新"之后调用。但是,组件未正确更新。

即使我让它运行"动作"在绑定的getter之前,getter返回正确的东西,这个特定的组件不会更新。

我有更多没有绑定的组件正确更新,但没有#34;绑定"。


更新:

这是代码的其余部分。 flag以" false"开头值。

页面始终打印"只读"。

Somepage.xhtml

<h:form id="frm">

   <p:commandLink value="#{messages.Guardar}" id="bt_Guardar" action="#{myBean.flagFalse}" update="someid" />
   <p:commandLink value="#{messages.Editar}" id="bt_Editar" action="#{myBean.flagTrue}" update="someid" />


   <h:panelGroup id="someid" layout="block">
      <h:panelGroup id="panelCamposTD" layout="block" binding="#{myBean.someStuff}"  ></h:panelGroup>                            
   </h:panelGroup>

</h:form>

我的myBean,是一个 SessionScoped bean(因为它来自遗留系统)

@ManagedBean(name="myBean")
@SessionScoped
public class MyBean implements Serializable{


   private static final long serialVersionUID = 7628440827777833854L;

   private boolean flag = false;

   public void flagFalse(){
      flag = false;
   }

   public void flagTrue(){
      flag = true;
   }

   public HtmlPanelGroup getSomeStuff(){

       HtmlPanelGroup pg = new HtmlPanelGroup();   
       HtmlOutputText t = new HtmlOutputText();

       if (flag){          
           t.setValue("EDITED");           
       }else{          
           t.setValue("READ ONLY");            
       }
       pg.getChildren().add(t);

       return pg;
   }   

   public void setSomeStuff(HtmlPanelGroup pg){
      return;
   }


   public boolean isFlag() {
      return flag;
   }

   public void setFlag(boolean flag) {
      this.flag = flag;
   }


}

1 个答案:

答案 0 :(得分:0)

您应该避免使用会话范围绑定到托管bean。这可能会造成很多麻烦:

JSF 2.0 Spec

  

3.1.5组件绑定

     

[...]

     

组件绑定通常与通过Managed Bean Creation工具动态实例化的JavaBeans一起使用(请参见第5.8.1节“VariableResolver和Default VariableResolver”)。强烈建议应用程序开发人员在“请求”范围内放置由组件绑定表达式指向的托管bean。这是因为将它放在会话或应用程序范围中需要线程安全,因为UIComponent实例依赖于在单个线程内部运行。在“会话”范围内放置组件绑定时,对内存管理也可能产生负面影响。

有两种解决方案可以避免绑定:

在此解决方案中,输出文本始终可见,只是从支持的bean获取不同的文本:

<h:panelGroup id="someid" layout="block">
    <h:panelGroup id="panelCamposTD" layout="block">
      <h:outputText value="#{myBean.flaggedText}"></h:outputText>
    </h:panelGroup>
</h:panelGroup>

将getter添加到支持的bean:

 public String getFlaggedText(){
       if (flag){          
           return "EDITED";
       }else{          
           return "READ ONLY";
       };
   }   

另一种选择是将两个输出文本放在前端并隐藏其中一个:

   <h:panelGroup id="someid" layout="block">
    <h:panelGroup id="panelCamposTD" layout="block">
      <h:outputText value="EDITED" rendered="#{myBean.flag}"></h:outputText>
      <h:outputText value="READ ONLY" rendered="#{not myBean.flag}"></h:outputText>
    </h:panelGroup> 
</h:panelGroup>