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