2

我想在我的 bean 中动态创建控件。我正在使用 JSF 2.0

HtmlOutputTag objHtmlOutputTag = new HtmlOutputTag();

现在我应该设置哪个属性HtmlOutputTag来设置内容HtmlOutputTag

4

2 回答 2

6

HtmlOutputTag代表一个标签,而不是一个组件。而是使用HtmlOutputText. 然后,您可以设置该value属性,就像在 JSF 页面中的真实组件中所做的那样。如果您需要它是 aValueExpression而不是 raw value,那么您需要使用ExpressionFactory#createValueExpression(). 这是一个启动示例:

HtmlOutputText text = new HtmlOutputText();
text.setValueExpression("value", createValueExpression("#{bean.property}", String.class));

这里的便捷方法createValueExpression()如下所示:

private static ValueExpression createValueExpression(String valueExpression, Class<?> valueType) {
    FacesContext context = FacesContext.getCurrentInstance();
    return context.getApplication().getExpressionFactory()
        .createValueExpression(context.getELContext(), valueExpression, valueType);
}

将它隐藏在某个实用程序类中很远,这样您就不需要一次又一次地重复所有代码;)valueType参数显然应该代表属性的实际类型。

JSF 页面中的最终结果应如下所示:

<h:outputText value="#{bean.property}" />

也就是说,根据功能需求,确实可能有更好、更清洁的方法来解决功能需求。如果您愿意,您可以详细说明一下,以便我们在必要时提出更好的方法。

于 2010-03-13T22:34:19.463 回答
1

往常一样,我的建议是不要动态添加/删除组件。以另一种方式解决您的问题:

  • 切换组件的可见性
  • 重新绑定属于某个组件的数据

动态添加/删除组件始终是麻烦的根源,您可能可以通过另一种更简单的方式来完成它。

outputText组件易于使用:

<h:outputText value="#{BackingBean.myProperty}"/>

myProperty并且你在你的支持 bean 中定义了一个 getter/setter 。如果您真的想以编程方式执行此操作(除非您有强有力的论据,否则我不鼓励这样做),这里有一个动态表的示例。

于 2010-03-13T20:16:50.473 回答