Wie vorhandene JSF-Komponenten auf meine eigenen benutzerdefinierten Komponenten hinzufügen?

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

  •  19-08-2019
  •  | 
  •  

Frage

Ich habe einen Tag Klasse, die UIComponent und UIOutput erstreckt. Auch möchte ich jeden irgendwie HTML-Tag verwenden kann writer.startElement unter Verwendung von ( „div“, myComponent) usw. In dieser Klasse habe ich encodeBegin und encodeEnd, die ich meinen contextWriter ausgeben.

Jetzt Mein Problem ist, dass ich zum Beispiel einfügen muß ein, anstatt die writer.startElement zu verwenden. Ich kann dies getan, indem getChildren tun () hinzufügen (HtmlCommandButton Taste = new HtmlCommandButton ()). aber wenn es so tun, kann ich nicht ausgeben scheinen die Komponente, wo ich sie erscheinen soll, wie kann ich mit write.startElement.

Hat jemand eine gute Lösungen, wie ich die Vorteile von Richfaces-Tags, JSF-Tags und ähnliche in meinem eigenen taglibrary nehmen kann? Kurz gesagt, was möchte ich wirklich in meinem encodeBegin zu tun:

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

Danke von vorab

War es hilfreich?

Lösung

Sie können nicht die ResponseWriter verwenden, wie Sie möchten. Zwei Möglichkeiten, die ich mir vorstellen kann, wie Kind hinzuzufügen, steuert programmatisch sind entweder über die Bindung Attribut ( diese Antwort ) oder in dem Ort, wo in der Regel Kontrollen (in JSPs erstellt bekommen, das heißt in dem -Tag Klasse ).

Es gibt zwei Möglichkeiten für JSF-Komponenten andere Steuerelemente enthalten: als Kinder oder als benannte Facetten. Komponenten immer kontrollieren, wie sie ihre Facetten machen; wenn sie ihre Kinder zu machen, müssen sie return true getRendersChildren .

Dies ist ungetestet Code, aber die Sequenz geht in etwa so:

  @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");
  }

Andere Tipps

Nicht wirklich eine Antwort, eher eine Vermutung, aber vielleicht könnten Sie eine der facelets Kontrollen erweitern?

Alternativ kann entweder die Verwendung Facelets direkt - das ist genau zu sein scheint, was Sie wirklich wollen, obwohl ich es selbst nicht benutzt habe. Oder Sie könnten hinzufügen UIOutput steuert, wo Sie HTML angezeigt werden sollen und setzen Sie den Wert von jeweils die HTML Sie angezeigt werden sollen - das ist genau das, was f: wörtlich tut unter der Haube, so scheint es aus der Betrachtung des Quellcodes: - )

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top