9

我是 JSF 的新手,我想知道:

如果我有一个控制器来处理给定页面的所有工作,并且有一个 bean 来保存所述页面的所有数据,是否有必要同时拥有

@ManagedProperty(value="#{myBean}") 

控制器上的注释和

@ManagedBean(name="myBean")
@SessionScoped

表单bean上的注释?

4

2 回答 2

16

JSF 中的托管 bean 用于存储网页的状态。JSF 实现负责创建和丢弃 bean 对象(因此命名为托管 bean)。

对于您编写的每个类@ManagedBean,bean 对象由 JSF 实现创建,当它检测到使用名称的 bean 时(您可以指定 bean 名称或将其留给 JSF 以使用默认名称类第一个字符的名称更改为小写)。创建的对象放置在指定范围的映射中。每个作用域都有一个映射,用于存储指定了该作用域的 bean 对象。

现在,如果您需要控制器中这些 bean 的值,则必须使用 ManagedProperty 注释将其注入。请注意,您需要为控制器提供 managedProperty 的 setter 方法。

因此,要回答您的问题,需要 managedBean 注释来告诉 JSF 实现管理 bean 实例并将值存储在特定于会话范围的表中。并且需要 ManagedProperty 注释来使用存储在当前会话中的那个 bean,以便您可以访问它的所有值。

于 2013-12-06T10:55:10.363 回答
9

我们使用@ManagedBean注解向 JSF 框架注册一个 java bean。这是 faces-config.xml<managed-bean>元素的替代品。我们通常不使用name属性,因为它已经默认为一个简单的类名骆驼大小写。

我们使用@RequestScope和其他范围注解通过注解明确指定我们想要的范围。这相当于指定<managed-bean-scope>xml 条目。如果您不指定范围,它将默认为@NoneScoped.

我们@ManagedProperty在其属性中使用并指定一个 EL 表达式,value以便将 JSF 提供的依赖注入引擎用于 JSF 工件,例如具有更广泛范围的其他托管 bean 和 EL 定义的变量(如param. 如果我们需要其他 JSF 工件(最典型的是 bean)中的注入值,我们会这样做。注入的值在 bean 的@PostConstruct-annotated 方法中可用。这是<managed-property>xml 条目的替代方法。

把它们加起来。用于@ManagedBean @RequestScoped向 JSF 框架注册 bean。在此 bean 内部使用@ManagedProperty可以在此 bean 中引用具有相同或更广泛范围的其他 JSF bean。如果您不需要在创建的 bean 中引用其他 bean,则不需要使用@ManagedProperty注释,因为它纯粹是可选的。

于 2013-12-06T10:41:11.947 回答