Comment ajouter des composants JSF existants à mes propres composants personnalisés?

StackOverflow https://stackoverflow.com/questions/654284

  •  19-08-2019
  •  | 
  •  

Question

J'ai une classe de balises qui étend UIComponent et UIOutput. Dans cette classe, j'ai encodeBegin et encodeEnd que je peux utiliser avec contextWriter pour générer n'importe quelle balise HTML que je veux aussi en utilisant writer.startElement ("div", myComponent), etc.

Mon problème maintenant est que je dois insérer par exemple un au lieu d'utiliser writer.startElement. Je peux y arriver en faisant getChildren (). Add (HtmlCommandButton button = new HtmlCommandButton ()); mais en le faisant comme ça, je ne peux pas sembler sortir le composant où je veux qu’il apparaisse, comme je le peux avec write.startElement.

Quelqu'un at-il de bonnes solutions pour tirer parti des balises richfaces, JSF et similaires dans ma propre bibliothèque de balises? En bref, ce que je voudrais vraiment faire, c’est dans mon encodeBegin:

writer.startElement("a4j:commandButton", myComponent);
writer.writeAttribite("action", "#{Handler.myAction}", null);
writer.endElement("a4j:commandButton");

Merci d'avance

Était-ce utile?

La solution

Vous ne pouvez pas utiliser ResponseWriter comme vous le souhaitez. Pour ajouter des contrôles enfants par programmation, je peux penser à l'aide de l'attribut binding ( voir cette réponse ) ou à l'endroit où les contrôles sont généralement créés (dans les JSP, c'est-à-dire dans le classe de balises ).

Les composants JSF peuvent contenir d'autres contrôles de deux manières: en tant qu'enfants ou en tant que facettes nommées. Les composants contrôlent toujours la manière dont ils rendent leurs facettes; s'ils doivent rendre leurs enfants, ils doivent renvoyer true pour getRendersChildren .

Il s'agit d'un code non testé, mais la séquence ressemble à ceci:

  @Override
  public boolean getRendersChildren() {
    return true;
  }

  @Override
  public void encodeBegin(FacesContext context)
      throws IOException {
    // should really delegate to a renderer, but this is only demo code
    ResponseWriter writer = context.getResponseWriter();
    writer.startElement("span", this);
    String styleClass = getStyleClass();
    writer
        .writeAttribute("class", styleClass, "styleClass");

    UIComponent headerComponent = getFacet("header");
    if (headerComponent != null) {
      headerComponent.encodeAll(context);
    }

    writer.startElement("hr", null);
  }

  @Override
  public void encodeChildren(FacesContext context)
      throws IOException {
    ResponseWriter writer = context.getResponseWriter();
    for (UIComponent kid : getChildren()) {
      kid.encodeAll(context);
      writer.startElement("br", null);
    }
  }

  @Override
  public void encodeEnd(FacesContext context)
      throws IOException {
    ResponseWriter writer = context.getResponseWriter();
    writer.endElement("span");
  }

Autres conseils

Ce n’est pas vraiment une réponse, mais une supposition, mais vous pourriez peut-être étendre l’un des contrôles de facelets?

Vous pouvez également utiliser directement des facelets - ce qui semble être exactement ce que vous voulez vraiment, même si je ne l'ai pas utilisé moi-même. Ou vous pouvez ajouter des contrôles UIOutput à l'endroit où vous voulez que le HTML apparaisse et définir la valeur de chacun pour le HTML que vous souhaitez voir apparaître - c'est exactement ce que f: verbatim fait sous le capot, ou du moins semble-t-il en regardant le code source: - )

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top