كيفية إضافة مكونات JSF القائمة لبلدي المكونات المخصصة الخاصة؟

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

  •  19-08-2019
  •  | 
  •  

سؤال

ولدي فئة العلامة التي تمتد UIComponent وUIOutput. في هذه الفئة لدي encodeBegin وencodeEnd التي يمكنني استخدام بلدي contextWriter لإخراج أي علامة HTML كيندا أريد أيضا باستخدام writer.startElement ( "شعبة"، myComponent) وهلم جرا.

ومشكلتي الآن هي أنني بحاجة لادخال على سبيل المثال بدلا من استخدام writer.startElement. يمكنني الحصول على هذا عمله عن طريق القيام getChildren () إضافة (زر HtmlCommandButton = HtmlCommandButton الجديدة ())؛ ولكن عندما تفعل مثل ذلك I يبدو غير قادر على إخراج المكون حيث أريد لها أن تظهر، مثل أستطيع مع write.startElement.

هل هناك أي حلول جيدة في كيف يمكن الاستفادة من الأكواد richfaces، والعلامات مساهمة في المشروع وما شابه ذلك في بلدي taglibrary الخاصة؟ باختصار ما يمكن أن تريد حقا القيام به هو داخل بلدي encodeBegin:

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

والشكر بواسطة مسبقا

هل كانت مفيدة؟

المحلول

وأنت لا يمكن استخدام <م> ResponseWriter كما يحلو لك. طريقتان أستطيع أن أفكر في كيفية إضافة الطفل تسيطر على برمجيا إما عن طريق <م> ملزمة السمة (<لأ href = "https://stackoverflow.com/questions/650838/jsf-responsewriter-custom-components / 652333 # 652333 "> نرى هذه الإجابة ) أو في المكان الذي الضوابط عادة الحصول على خلق (في وحدات JSP، وهذا هو في في العلامة الطبقة ).

وهناك طريقتان لمكونات JSF لاحتواء عناصر التحكم الأخرى: مثل الأطفال أو جوانب اسمه. عناصر التحكم دائما كيف تجعل جوانبها. إذا أريد لها أن تجعل أطفالهم، ويجب أن يعود ينطبق على <لأ href = "http://java.sun.com/javaee/5/docs/api/javax/faces/component/UIComponent.html#getRendersChildren ()" يختلط = "نوفولو noreferrer"> getRendersChildren .

وهذا هو قانون غير مجربة، ولكن تسلسل غني عن شيء مثل هذا:

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

نصائح أخرى

وليس في الواقع جوابا، أكثر من تخمين، ولكن ربما كنت قد تمتد أحد عناصر تحكم facelets؟

وبدلا من ذلك، إما استخدام facelets مباشرة - والتي يبدو أن بالضبط ما تريد حقا على الرغم من أنني لم تستخدم ذلك بنفسي. أو يمكنك إضافة UIOutput تسيطر على المكان الذي تريد HTML لتظهر وتعيين قيمة كل لHTML تريده أن يظهر - وهذا هو بالضبط ما و: هل حرفيا تحت غطاء محرك السيارة، أو هكذا يبدو من النظر إلى شفرة المصدر: - )

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top