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

HtmlOutputTag objHtmlOutputTag = new HtmlOutputTag();

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

有帮助吗?

解决方案

HtmlOutputTag 代表一个标签,而不是一个组件。而是使用 HtmlOutputText. 。然后,您只需设置 value 属性,就像您在 JSF 页面中的真实组件中所做的那样。如果你需要它成为 ValueExpression 而不是原始的 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}" />

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

其他提示

作为 通常, ,我的建议是不要动态添加/删除组件。另一种方式解决你的问题:

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

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

outputText 组件易于使用:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top