快速创建JSF自定义组件的方法

时间:2010-04-27 07:13:37

标签: jsf components facelets

我知道有两种创建自定义JSF组件的方法: 1.原生JSF方式:创建JSF组件类,标签等。 2. Facelets方法:在xhtml文件中定义组件,然后在facelets taglib中创建适当的decrption。

目前,我正在开展一个项目,其中不幸地介绍了facelets。另一方面,创建自定义组件标准JSF方式似乎是一个痛苦的屁股。

是否有第三方库允许以类似于facelets的方式创建自定义组件,但不需要使用非标准渲染器?

1 个答案:

答案 0 :(得分:3)

您可以使用(例如)jsp:includef:subview进行有限数量的模板化。

或者,您可以扩展UIComponent覆盖所选方法,然后使用binding属性通过现有标记和托管bean提供它。这仍然需要对组件开发(以及此选择的后果)的相当详细的理解,但可以显着减少文件/代码量。

这种做法有点像黑客,但短期内可能还行。您不会对要分发的组件库或需要长期维护的组件执行此操作。

新组件:

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

提供实例的bean:

/**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修复。