Пользовательские компоненты JSF ResponseWriter - PullRequest
3 голосов
/ 16 марта 2009

Я знаю о методах startElement, endElement и writeAttribute в ResponseWriter. Моя проблема в том, что я хочу, например, вывести h: commandLink, объявив его как HtmlCommandLink link = new HtmlCommandLink();.

Как я могу вывести другие компоненты UIC, как это, в моем собственном компоненте? Я мог бы также захотеть использовать некоторые компоненты RichFaces Ajax в своих компонентах, так что надеюсь, что смогу избежать всего этого с нуля.

Edit: я пытаюсь создать свою собственную библиотеку тегов со следующим тегом <myTags:commentTree>. У каждого комментария есть кнопка ответа, при нажатии на кнопку ответа я создаю форму ответа под комментарием. После этого я хотел бы вывести, например, компонент richfaces <a4j:commandButton>. Это должно быть сделано внутри моего собственного файла тегов java, который я назвал CommentsTreeUI.java.

Обычно я выводю все свои элементы, которые отображают формы и кнопки, с помощью writer.startElement("input", myComponent); writer.writeAttribute("type", "button", null);, но если бы я мог вместо этого, например, startElement("a4j:commandbutton", myComponent), это помогло бы моему ALOT, так как он имеет все встроенные функции AJAX и т. Д.

Есть какие-нибудь подсказки?

Ответы [ 3 ]

2 голосов
/ 20 марта 2009

Эта проблема была решена путем добавления новых компонентов с помощью

HtmlCommandButton button = new HtmlCommandButton();
button.encodeAll(context);
1 голос
/ 16 марта 2009

Вы можете сделать что-то вроде этого:

HtmlCommandLink link = new HtmlCommandLink();
getChildren().add(link);

Это зависит от того, что вы хотите сделать с дочерними компонентами, хотя, если вы хотите, чтобы они были окружены пользовательским HTML (например, в списке HTML), вам понадобится что-то более сложное.

0 голосов
/ 17 марта 2009

Один из подходов к созданию составных элементов управления - использовать атрибут binding , чтобы связать тег с вашим собственным кодом:

<f:view>
    <h:form>
        <h:panelGroup binding="#{compositeControlBean.panelGrid}" />
    </h:form>
</f:view>

Конфигурация компонента в Face-config.xml :

<managed-bean>
    <managed-bean-name>compositeControlBean</managed-bean-name>
    <managed-bean-class>
        composite.CompositeControlBean
    </managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Код компонента:

/**
 * Configure this bean in request scope as "compositeControlBean".
 */
public class CompositeControlBean {

  private transient UIComponent panelGrid;

  public UIComponent getPanelGrid() {
    if (panelGrid == null) {
      panelGrid = createCompositePanel();
    }
    return panelGrid;
  }

  public void setPanelGrid(UIComponent panelGrid) {
    this.panelGrid = panelGrid;
  }

  private UIComponent createCompositePanel() {
    initContextMemebers();

    UIComponent commandLink = createCommandLink();

    String id = view.createUniqueId();
    UIComponent panelGrid = application
        .createComponent("javax.faces.HtmlPanelGroup");
    panelGrid.setId(id);
    panelGrid.setRendererType("javax.faces.Group");

    panelGrid.getChildren().add(commandLink);

    return panelGrid;
  }

  private UIComponent createCommandLink() {
    // create control
    String id = view.createUniqueId();
    UIComponent commandLink = application
        .createComponent("javax.faces.HtmlCommandLink");
    commandLink.setId(id);
    commandLink.setRendererType("javax.faces.Link");
    // set attributes (bind to printHello method)
    Map<String, Object> attributes = commandLink
        .getAttributes();
    MethodExpression action = expressionFactory
        .createMethodExpression(elContext,
            "#{compositeControlBean.printHello}",
            String.class, new Class<?>[0]);
    attributes.put("value", "print hello");
    attributes.put("actionExpression", action);
    return commandLink;
  }

  private transient FacesContext context;
  private transient Application application;
  private transient ELContext elContext;
  private transient ExpressionFactory expressionFactory;
  private transient UIViewRoot view;

  private void initContextMemebers() {
    context = FacesContext.getCurrentInstance();
    application = context.getApplication();
    elContext = context.getELContext();
    expressionFactory = application.getExpressionFactory();
    view = context.getViewRoot();
  }

  public String printHello() {
    System.out.println("Hello");
    return null;
  }

}
...