Быстрый способ создания пользовательского компонента JSF - PullRequest
3 голосов
/ 27 апреля 2010

Мне известны два способа создания пользовательских компонентов JSF: 1. Собственный способ JSF: создание класса компонента JSF, тега и т. Д. 2. Путь Facelets: определение компонента в файле xhtml, а затем создание соответствующего расшифровки в файле taglets библиотеки Facelets.

В настоящее время я работаю над проектом, в котором о внедрении фейлетов, к сожалению, не может быть и речи. С другой стороны, создание пользовательских компонентов стандартным способом JSF кажется болью в заднице.

Может быть, есть какая-нибудь сторонняя библиотека, которая позволяет создавать пользовательские компоненты способом, похожим на facelets, но не влечет за собой необходимость использования нестандартного средства визуализации?

1 Ответ

3 голосов
/ 29 апреля 2010

Вы можете использовать ограниченное количество шаблонов, используя (например) jsp: include и f: subview .

Кроме того, вы можете расширить UIComponent , переопределяя выбранные методы, а затем предоставить его через существующий тег и управляемый компонент с помощью атрибута binding. Это все еще требует достаточно подробного понимания разработки компонентов (и последствий этого выбора), но может значительно сократить количество файлов / объем кода.

Этот подход немного хакерский, но он может подойти для краткосрочных вещей. Вы не будете делать это для библиотек компонентов, которые вы хотите распространять, или для компонентов, требующих длительного обслуживания.

Новый компонент:

public class QuickComponent extends HtmlOutputText {
  @Override public void encodeAll(FacesContext context) throws IOException {
    ResponseWriter writer = context.getResponseWriter();
    writer.writeText("I'm not really a HtmlOutputText", null);
    for (UIComponent kid : getChildren()) {
      if (kid instanceof UIParameter) {
        UIParameter param = (UIParameter) kid;
        writer.startElement("br", this);
        writer.endElement("br");
        writer.writeText(param.getName() + "=" + param.getValue(), null);
      }
    }
  }
}

Бин, предоставляющий экземпляр:

/**Request-scope managed bean defined in faces-config.xml*/
public class QuickComponentProviderBean {
  private QuickComponent quick;

  public void setQuick(QuickComponent quick) {
    this.quick = quick;
  }

  public QuickComponent getQuick() {
    if (quick == null) {
      quick = new QuickComponent();
    }
    return quick;
  }
}

Примечание: не используйте повторно одно свойство bean-компонента для нескольких тегов в ваших представлениях, иначе они будут ссылаться на один и тот же экземпляр объекта.

Добавление нового компонента в представление:

<h:outputText binding="#{quickComponentProviderBean.quick}">
  <f:param name="Hello" value="World" />
</h:outputText>

Примечание: атрибуты, которые можно определить, не изменились. Они исправлены TLD.

...