gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:40:29 25 4
gpt4 key购买 nike

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

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

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

最佳答案

您可以使用(例如)jsp:include 进行有限数量的模板化和 f:subview .

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

这种方法有点 hack,但对于短期的东西来说可能没问题。对于要分发的组件库或需要长期维护的组件,您不会这样做。

新组件:

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

注意:不要为 View 中的多个标记重复使用单个 bean 属性,否则它们将引用相同的对象实例。

将新组件添加到 View :

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

注意:可定义的属性没有改变。它们由 TLD 修复。

关于jsf - 快速创建 JSF 自定义组件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2719368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com