Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建JSF自定义组件的快速方法_Jsf_Components_Facelets - Fatal编程技术网

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

创建JSF自定义组件的快速方法,jsf,components,facelets,Jsf,Components,Facelets,我知道创建自定义JSF组件的两种方法: 1.原生JSF方式:创建JSF组件类、标记等。 2.Facelets方式:在xhtml文件中定义组件,然后在Facelets taglib中创建适当的decrption 目前,我正在从事一个项目,不幸的是,引入facelets是不可能的。另一方面,以标准JSF方式创建自定义组件似乎是一件麻烦事 是否有第三方库允许以类似于facelets的方式创建自定义组件,但不需要使用非标准渲染器?您可以使用(例如)和执行有限数量的模板化 或者,您可以扩展覆盖所选方法,然

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

目前,我正在从事一个项目,不幸的是,引入facelets是不可能的。另一方面,以标准JSF方式创建自定义组件似乎是一件麻烦事


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

您可以使用(例如)和执行有限数量的模板化

或者,您可以扩展覆盖所选方法,然后使用
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修复的。

@Boz:不要想,因为“facelets是不可能的”,用JSF2.0和facelets创建组件实际上是小菜一碟。令人头痛的问题听起来像JSF 1.x,因为它非常冗长/不透明;)1.0/1.1还是1.2?在1.2中创建组件有点不同。