JSF托管bean和托管属性都是必要的吗?

时间:2013-12-06 10:10:56

标签: jsf managed-bean managed-property

我是JSF的新手并且想知道:

如果我有一个控制器来处理给定页面的所有工作,而一个bean包含所述页面的所有数据,那么是否必须同时拥有

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

控制器上的注释和

@ManagedBean(name="myBean")
@SessionScoped

表单bean上的注释?

2 个答案:

答案 0 :(得分:13)

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

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

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

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

答案 1 :(得分:8)

我们使用@ManagedBean注释来注册带有JSF框架的java bean。这是faces-config.xml <managed-bean>元素的替代品。我们通常不使用name属性,因为它已默认为简单的类名称驼峰。

我们使用@RequestScope和其他范围注释通过注释显式指定我们想要的范围。这相当于指定<managed-bean-scope> xml条目。如果您未指定范围,则默认为@NoneScoped

我们使用@ManagedProperty并在其value属性中指定EL表达式,以便为JSF工件使用JSF提供的依赖注入引擎,例如具有更广范围的其他托管bean和EL定义的变量,如{{ 1}}。我们这样做是为了我们需要在其他JSF工件中注入的值,最常见的是bean。注入的值在bean的param - 带注释的方法中可用。这是@PostConstruct xml条目的替代方法。

总结一下。使用<managed-property>向JSF框架注册bean。在此bean中使用@ManagedBean @RequestScoped能够引用此bean中具有相同或更广范围的其他JSF bean。如果您不需要在创建的bean中引用其他bean,则不需要使用@ManagedProperty注释,因为它纯粹是可选的。