【问题标题】:Primefaces datatable doesn't work properly with ViewScoped or RequestScoped beanPrimefaces 数据表不适用于 ViewScoped 或 RequestScoped bean
【发布时间】:2012-04-14 02:48:59
【问题描述】:

我编写了一个 JSF 2 页面,用于可视化来自数据库的数据。
当我将 Primefaces 数据表与 ViewScoped 或 RequestScoped bean 一起使用从数据库中获取值时,它无法正常工作 - 不会排序并且不会分页。例如:

@ManagedBean
@ViewScoped
public class MyBean implements Serializable {

    private List<Animal> animals;

    public List<Animal> getAnimals() {
        if(animals == null) {
            animals = DataBaseConnector.getLastAnimals();
        }
        return animals;
    }
}

当我使用 SessionScoped 更改 ViewScoped 时,它运行良好,但我想将它与 RequestScope 和 ViewScope 一起使用。 当我使用相同的 bean 添加静态值时,如下所示:

@ManagedBean
@ViewScoped 
public class MyBean implements Serializable {

    private List<Animal> animals = new ArrayList<Animal>() {{
        add(new Animal("John", 7, new Timestamp(2436343516841235621L)));
        add(new Animal("Holly ", 15, new Timestamp(52343332153212142L)));
        add(new Animal("Betty", 3, new Timestamp(2346236232151232L)));
    }};

    public List<Animal> getAnimals() {
        return animals;
    }
}

它工作正常 - 它排序和分页。 我可以使用 Primefaces 数据表和 RequestScoped bean 从数据库中获取值吗?

【问题讨论】:

  • 我在您的代码 sn-ps 之间看到的唯一区别是,在第一个代码中,您从数据库中获取值,而在另一个代码中,您在实例化类时初始化它们。与 bean 的范围无关,因为它在两个样本中是相同的。获取值的方式与 primefaces 无关。
  • 我遇到了和你一样的问题,让 primefaces 数据表排序和分页与视图一起工作,你也可以发布你的 html 吗?可能有一些东西导致分页/排序不起作用。您使用的是哪个版本的 PF?

标签: java jsf primefaces


【解决方案1】:

如果您将视图范围 bean 的属性绑定到标记处理程序的属性,则可能会发生这种情况,这将导致在每个 HTTP 请求上重新创建视图范围 bean。标签处理程序是 JSTL 标签,如 &lt;c:if&gt;&lt;c:forEach&gt; 等,以及不具有 rendered 属性的 Facelets UI 标签,如 &lt;ui:include&gt;&lt;ui:composition&gt; 等,以及 JSF 核心组件,如 &lt;f:attribute&gt;、@ 987654329@ 等。您需要确保不将视图范围 bean 的属性绑定到这些标记处理程序。您需要寻找 JSF UI 组件方法,或者将这些属性拆分为不同的、请求范围的 bean。

另见:


与具体问题无关,虽然 getter 中的延迟加载绝对不会形成问题,但最好在后备 bean 的(后)构造期间这样做。虽然类名DataBaseConnector 和静态方法调用并没有给我强烈的感觉,你正在以正确的方式做数据库。

【讨论】:

  • 感谢您的回答。类 DataBaseConnector 包含一个静态 DataSource,它与 glassfish 的连接池相关联。因此我使用静态方法和类。喜欢here。错了吗?
  • 没关系。您只是缺少 DAO 层。
【解决方案2】:

可以,但最好有说明

 animals = DataBaseConnector.getLastAnimals();

在一个用@PostConstruct 注释的方法中。

我仍然认为最好的选择是在您的情况下使用 View scoped bean。 我以前做过,效果很好。

【讨论】:

    【解决方案3】:

    这里对所涉及的类进行一些描述会有所帮助。

    @Named
    @ViewScoped
    public class MyBean implements Serializable {
    
        private List<Animal> animals = null;
    
        public List<Animal> getAnimals() {
            if(animals == null) {
                animals = (new MyBean()).getLastAnimals();
            }
            return animals;
        }
    }
    

    如果您使用 DatabaseConnector 的源更新您的问题,您将得到您想要的答案。可能您需要在 DatabaseConnector 中创建一个 MyBean 实例。组合,在那个 DatabaseConnector 中有一个 MyBean。

    Dollars to donuts DatabaseConnector 目前与 MyBean 没有“has-a”关系(组合)。或者,如果是,则 DatabaseConnector.getLastAnimals() 方法没有使用它。

    【讨论】:

      猜你喜欢
      • 2013-09-30
      • 2012-08-27
      • 2013-12-13
      • 1970-01-01
      • 2012-04-07
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      相关资源
      最近更新 更多