3

我想知道如何创建“组件范围的”bean,或者可以说,“复合组件内的局部变量”,它们对复合组件的实例是私有的,并且只要该实例存在就一直存在。

以下是更多详细信息,并通过示例进行说明:

假设有一个“计算器”组件——允许用户输入数学表达式并计算其值的东西。可选地,它还绘制相关函数。

我可以制作一个复合组件,它具有:

  • 用于接受数学表达式的文本框
  • “评估”和“绘图”两个按钮
  • 绘制函数的另一个嵌套组件

它显然是一个独立的功能;所以想要使用它的人可能会说 <math:expressionEvaluator />

但显然,实现将需要一个 java 对象 - 评估表达式的东西,计算绘图点的东西等 - 我想它可以是一个 bean - 仅针对此组件的实例,而不是视图范围或在组件的所有实例之间共享的请求范围的 bean。

如何创建这样的 bean?复合组件甚至可能吗?

4

2 回答 2

1

没有“每个组件实例”范围。但是你仍然可以达到你想要的效果。

使用 ViewScoped bean 进行评估和绘图 - 这些函数是“无状态的”,因此由您的输入提供。

您的输入将由用户提供的 bean 支持 - 就像文本框或日历小部件需要一个绑定到用户提供的 bean 的输入框一样。这包含您的“无状态”视图范围 bean 所作用的数据。

如果您真的想保留组件中包含的所有内容,我想您可以使用 ViewScoped bean 来支持输入,该 bean 包含由输入 id 键入的映射。不确定这是否可行。

于 2010-06-09T04:16:57.307 回答
0

或者,您也可以构建一个基于 Java 的自定义 UIComponent。尽管这些在 JSF 1.x 中需要大量的“移动部件”,但在 JSF 2.0 和 Facelets 中,它们实际上并没有那么多工作要做。

通常,在构建基于 Java 的自定义 UIComponents 方面应该是适度的,因为对于大多数用例来说,复合组件更容易和更直接。但是,基于 Java 的 UIComponents 仍然有它们的用途,并且进行实际计算可能就是这样的用途。

于 2011-02-13T13:44:19.123 回答