JSF 管理的 bean 和管理的属性两者都是必要的吗?

9

我是JSF的新手,想问一下:

如果我有一个控制器来处理给定页面的所有工作,还有一个用于保存该页面所有数据的bean,是否需要同时存在两者?

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

在控制器上的注释以及

@ManagedBean(name="myBean")
@SessionScoped
上的注解?
2个回答

18

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

对于每个使用@ManagedBean编写的类,当JSF检测到带有名称的Bean使用时(您可以指定Bean名称,也可以让JSF使用默认名称——类名并将第一个字符改为小写),Bean对象由JSF实现创建。创建的对象放置在指定作用域的Map中。每个作用域都有一个Map,它用于存储具有该作用域的托管bean对象。

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

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


10
我们使用@ManagedBean注解来注册一个Java Bean到JSF框架中。这是<managed-bean>元素的替代品。通常我们不使用name属性,因为它默认为简单类名驼峰式命名。
我们使用@RequestScope和其他范围注解来通过注解显式地指定我们想要的范围。这相当于指定<managed-bean-scope> xml条目。如果您不指定范围,它将默认为@NoneScoped
我们使用@ManagedProperty并在其value属性中指定EL表达式,以使用JSF提供的依赖注入引擎用于JSF工件,例如具有更广泛范围的其他托管bean和EL定义的变量,例如param。我们这样做是为了在其他JSF工件中需要注入的值,最常见的是bean。注入的值在bean的@PostConstruct注释方法中可用。这是<managed-property> xml条目的替代方法。
总之,使用@ManagedBean @RequestScoped来向JSF框架注册bean。在此bean内部使用@ManagedProperty,以便能够在该bean中引用同一或更广泛范围内的其他JSF bean。如果您不需要在创建的bean中引用其他bean,则不需要使用@ManagedProperty注释,因为它纯粹是可选的。

1
谢谢提供信息,但这并没有回答我的问题,现在我对@ManagedProperty有点更加困惑了。 - Mark W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接