【问题标题】:Pass Parameter to ViewScoped Bean将参数传递给 ViewScoped Bean
【发布时间】:2011-06-02 19:24:05
【问题描述】:

我将把一个页面(Facelet)中的参数传递给一个作用域为 View Scope 的托管 Bean。

我尝试这样做:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class Mybean {
  private int id;


  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }    
}

首页:

  <h:body>            
    <h:form>
      <h:commandLink value="click" action="index">
        <f:setPropertyActionListener target="#{mybean.id}" value="20"/>
      </h:commandLink>
    </h:form>
  </h:body>

第二页:

  <h:body>
    param value #{param.id}
    <br />
    bean value #{mybean.id}
    <br />

    <h:messages/>
  </h:body>

但它没有显示 20

【问题讨论】:

    标签: java jsf jsf-2 javabeans


    【解决方案1】:

    @ViewScoped bean 只停留在用户正在观看的视图中。

    一旦用户切换到另一个视图 - bean 将被销毁并从头开始创建。 因此,如果您想在一页以上使用同一个 bean - 请使用 @SessionScoped bean。

    另一种方法是在Java中创建一个Singleton类,一个bean会更新这个类中的值,而另一个bean会从中提取值。

    【讨论】:

    • 你说得对,我也可以改成RequestScope对吧?
    • 单例类将像 ApplicationScoped bean 一样保留值!我的意思是所有访问者的价值都是一样的,不是吗?
    • 你是对的!因此,如果它适用于许多用户,您可以使用会话范围 bean 来存储值