¿Cómo agregar componentes JSF existentes a mis propios componentes personalizados?

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

  •  19-08-2019
  •  | 
  •  

Pregunta

Tengo una clase de etiqueta que extiende UIComponent y UIOutput. En esta clase, tengo encodeBegin y encodeEnd, que puedo usar mi contextWriter para generar cualquier tipo de etiqueta html que quiera también usando writer.startElement (" div " ;, myComponent) y así sucesivamente.

Mi problema ahora es que necesito insertar, por ejemplo, un en lugar de usar el escritor.startElement. Puedo hacer esto haciendo getChildren (). Add (HtmlCommandButton button = new HtmlCommandButton ()); pero cuando lo hago así, no puedo mostrar el componente donde quiero que aparezcan, como puedo hacerlo con write.startElement.

¿Alguien tiene alguna buena solución sobre cómo puedo aprovechar las etiquetas richfaces, las etiquetas JSF y similares en mi propia biblioteca? En resumen, lo que realmente quiero hacer es dentro de mi encodeBegin:

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

Gracias por adelantado

¿Fue útil?

Solución

No puede usar el ResponseWriter como lo desea. Dos maneras de pensar cómo agregar controles secundarios mediante programación son mediante el atributo enlace ( ver esta respuesta ) o en el lugar donde generalmente se crean los controles (en JSP, es decir, en clase de etiqueta ).

Hay dos formas para que los componentes JSF contengan otros controles: como elementos secundarios o como facetas con nombre. Los componentes siempre controlan cómo representan sus facetas; si van a representar a sus hijos, deben devolver verdadero para getRendersChildren .

Este es un código no probado, pero la secuencia es algo así:

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

Otros consejos

¿No es realmente una respuesta, más una conjetura, pero tal vez podría extender uno de los controles de facelets?

Alternativamente, puede usar facelets directamente, lo que parece ser exactamente lo que quiere, aunque no lo he usado yo mismo. O bien, puede agregar controles de salida UIO donde desea que aparezca HTML y establecer el valor de cada uno en el HTML que desea que aparezca; esto es exactamente lo que f: verbatim hace debajo del capó, o eso parece al mirar el código fuente: )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top