我知道有两种创建自定义JSF组件的方法: 1.原生JSF方式:创建JSF组件类,标签等。 2. Facelets方法:在xhtml文件中定义组件,然后在facelets taglib中创建适当的decrption。
目前,我正在开展一个项目,其中不幸地介绍了facelets。另一方面,创建自定义组件标准JSF方式似乎是一个痛苦的屁股。
是否有第三方库允许以类似于facelets的方式创建自定义组件,但不需要使用非标准渲染器?
答案 0 :(得分:3)
您可以使用(例如)jsp:include和f: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修复。