HtmlPanelGroup - 绑定 - h:panelGroup树深度

时间:2016-10-04 14:33:42

标签: jsf binding components facelets

我几次面对这个问题,但似乎我不知道如何解决这个问题......如果我使用HtmlPanelGroup作为:

客户:

<h:panelGroup ... binding="#{myBean.myPanelGroup}">
</h:panelGroup>

支持bean:

@ManagedBean(name="myPanelGroup")
@RequestScoped
public class G0 extends HtmlPanelGroup{
  ...
  public void addComp(ActionEvent e){
   HtmlCommandButton commandButton=new HtmlCommandButton();
   commandButton.setValue("aValue");

   G1 g1=new G1();
   g1.addComp(commandButton);

   this.getChildren().add(g1);
}
}

另一个对象:

@FacesComponent(value="myPanel")
public class G1 extends HtmlPanelGroup{
  ...
  @PostConstruct
  public void init(){this.setLayout("block");}
  public void addComp(UIComponent c){this.getChildren().add(c);}//bare button only :(
}

由于某种原因,生成的HTML包含命令按钮,它根本没有被G1(div)包围:P

p.s taglib.xml包含G1配置:

...
    <tag>
    <tag-name>aTag</tag-name>
    <component>
      <component-type>myPanel<component-type>
    </component>
    </tag>
...

修改

h:panelGroup这样的树可能会导致类似的问题:

客户方:

<h:panelGroup ... binding="#{gBean.g}"/>

支持bean:

    public class G extends HtmlPanelGroup{
    ...
    HtmlPanelGroup g0;
    HtmlPanelGroup g1;
    HtmlPanelGroup g2;

    @PostConstruct
    public void init(){
       g0=new HtmlPanelGroup();
       g0.setStyleClass("g0");
       g1=new HtmlPanelGroup();
       g1.setStyleClass("g1");
       g2=new HtmlPanelGroup();
       g2.setStyleClass("g2");

       g0.getChildren().add(g1);
       g1.getChildren().add(g2);
       this.getChildren().add(g0);
    }
    ...
    }

和bean:

    @ManagedBean(name="gBean")
    @RequestScoped
    public class GBean {
      ...
      private G g;
      ...
      @PostConstruct
      public void initGBean(){
      g=new G(); 
    }

    public void addComp(ActionEvent e){
      HtmlCommandButton c=new HtmlCommandButton();
      c.setValue(""+Math.random());

      this.g.getChildren().add(c);
}
     //getters setters
    }

所以我的问题是...... 导致这种情况的原因以及如何解决这个问题或是否有解决方法?

我仍然不确定JSF框架中的div(h:panelGroup)树深度是否有限制?如果不是如何解决它因为它很烦人;还是有更多的替代方式?

由于

1 个答案:

答案 0 :(得分:0)

@PostConstruct似乎不起作用,以防@ManagedBean (如果我错了,请纠正我);如果对象扩展HtmlPanelGroup(请参阅代码段):

public class G extends HtmlPanelGroup{
    ...
    HtmlPanelGroup g0;
    HtmlPanelGroup g1;
    HtmlPanelGroup g2;

    @PostConstruct
    public void init(){
       g0=new HtmlPanelGroup();
       g0.setStyleClass("g0");
       g1=new HtmlPanelGroup();
       g1.setStyleClass("g1");
       g2=new HtmlPanelGroup();
       g2.setStyleClass("g2");

       g0.getChildren().add(g1);
       g1.getChildren().add(g2);
       this.getChildren().add(g0);
    }
    ...
    }

所以要调用方法我决定使用构造函数(参见代码片段)

public class G extends HtmlPanelGroup{
    ...
    HtmlPanelGroup g0;
    HtmlPanelGroup g1;
    HtmlPanelGroup g2;


   public G(){
     this.init();
   }

    public void init(){
       g0=new HtmlPanelGroup();
       g0.setStyleClass("g0");
       g1=new HtmlPanelGroup();
       g1.setStyleClass("g1");
       g2=new HtmlPanelGroup();
       g2.setStyleClass("g2");

       g0.getChildren().add(g1);
       g1.getChildren().add(g2);
       this.getChildren().add(g0);
    }
    ...
    }

...如果是jsf所谓的支持bean ,可以使用某种常见的POJO方式;

P.S。我还在这里工作,所以请随意评论提示:)

干杯