JSF中的ManagedProperty标记

时间:2015-11-09 18:39:02

标签: java jsf-2

在这个例子中,为什么需要@ManagedBean注释?在setPalyBean()方法中,它接收一个参数并将其设置为私有变量" playerBean"。这就像非JSF世界中的常规Java类设计。如果删除了@ManagedBean,它会不会一样?

@Named
@SessionScoped
public class PlayersBean {

  private String playerName;
  private String playerSurname;

  public PlayersBean() {
    playerName = "Rafael";
    playerSurname = "Nadal";
  }

//getters and setters
}

@ManagedBean 
@ViewScoped
public class ProfileBean {

  @ManagedProperty("#{playersBean}")
  private PlayersBean playersBean;
  private String greetings;

  public ProfileBean() {     
  }   

  public void setPlayersBean(PlayersBean playersBean) {
    this.playersBean = playersBean;
  }                
}

1 个答案:

答案 0 :(得分:0)

这些是规则:

  1. @ManagedBean - 如果您:

    需要
    • 想要从旧式JSF
    • 视图中访问您的bean
    • 希望容器能够管理在bean中注入任何东西,在旧式JSF中
    • 希望容器管理bean的生命周期......
    • 想要将bean命名为与标准类名不同的名称。默认命名约定是将类名转换为标准java,因此您将拥有一个名为proileBean的bean。如果您想通过其他名称来说明该bean,例如profile,则需要使用此注释
  2. 如果您希望容器自动将任何内容注入到bean中,则需要
  3. @ManagedProperty和相关的setter。他们是规则。它归结为注射如何发生 - 反射。

  4. 没有注释会有效吗?不 - 没有那个注释(并且取决于你的JSF版本; 2.2允许所有类型的东西),容器不知道你的bean并且不会被提示采取行动

    您可以省去麻烦并采用CDI惯例:

    1. @ManagedBean替换为@Named(仅当您需要访问页面中的bean时才需要此注释,否则,这是不必要的 - CDI上下文中的每个bean都是自动管理的)

    2. @ManagedProperty替换为@Inject。使用此注释,您可以完全抛弃setter和getter。您也不必担心要注入或注入的bean的范围。

    3. 将当前@ViewScoped替换为javax.faces.view.ViewScoped

    4. 中的{}