当前位置: 首页 > 知识库问答 >
问题:

JSF2/Primefaces数据表排序不适用于ViewScope bean

诸葛乐逸
2023-03-14

我想将排序添加到PrimeFaces 3.3数据表并创建了以下ViewScoped bean,它存储列表,因此不会一直从EJB中获取:

@Named
@ViewScoped
public class CustomerList implements Serializable {

    private static final long serialVersionUID = 6168621124401208753L;

    @EJB 
    CustomerEJB customerBean;

    List<Customer> allCustomers = null;

    public void loadCustomerList() {
        allCustomers = customerBean.findAll();
    }

    public List<Customer> getList() {
        if (allCustomers == null) {
            loadCustomerList();
        }
        return allCustomers;
    }

}

这是使用bean的视图:

<ui:composition template="/WEB-INF/templates/template.xhtml">

  <ui:define name="content">

        <h:form id="customerList">

          <p:dataTable id="customer" var="customer"
            value="#{customerList.list}" sortBy="#{customer.id}"
            paginator="true" rows="10" paginatorAlwaysVisible="false"
            paginatorPosition="top">
            <p:column sortBy="#{customer.id}">
              <f:facet name="header">
                <h:outputText value="#{msg.customerIdLabel}" />
              </f:facet>
              <h:outputText value="#{customer.id}" />
            </p:column>
            <p:column sortBy="#{customer.lastName}">
              <f:facet name="header">
                <h:outputText value="#{msg.customerLastNameLabel}" />
              </f:facet>
              <h:outputText value="#{customer.lastName}" />
            </p:column>

问题是,我可以单击列标题进行排序,但表仍然未排序,即使初始排序不起作用。当您在getList()方法中设置断点时,我可以看到在处理请求期间多次从EJB中提取列表。只要视图在ViewScope中处于活动状态,不应该存储bean吗?

共有3个答案

莘光华
2023-03-14

您需要使用这个注释Bean组合:

对于@ManagedBean,您需要使用@ViewScoped

对于@Named (CDI),您需要使用@ConversationScoped

华升
2023-03-14

CDI中不支持@ViewScoped,因此,如果需要在CDI中使用@viewsoped,您应该

  • 使用seam faces或MyFaces CODI模块。只需将其中一个添加到类路径中,@ViewScoped将在CDI中工作。MyFaces CODI对@ViewScope
  • 的支持更加坚实
  • 使用MyFaces CODI的@viewAccessScope,它是Apache在CDI之上编写的一个扩展,只需下载它并使用@ViewAccessScoped注释,而不是@ViewScoped>/code>
  • 使用CDI<code>@ConversationScope<code>并使其长时间运行。有关更多信息,请参见此处

不幸的是,seam3解决方案存在内存泄漏问题,因此不要使用seam3来解决此特殊问题,更好的解决方案是CODI@ViewAccessScoped

请参阅: 使用ViewScoped豆进行内存泄漏?

仲孙经赋
2023-03-14

首先,与您的问题没有直接关系,但是:您永远不应该将您的业务方法放入组件getter中(即使使用空检查,我认为这是一种不好的做法)。改用@PostConstruct注释:

@PostConstruct
public void loadCustomerList() {
    allCustomers = customerBean.findAll();
}

public List<Customer> getList() {
    return allCustomers;
}

每次构造ViewScoped bean时,都会调用loadCustomerList。此外,检查导入的范围注释:

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

最后,您的类应该是这样的:

@ViewScoped
@ManagedBean
public class CustomerList implements Serializable {
    ...
}
 类似资料:
  • 当xhtml运行时,数据表会显示出来,但只有一列显示为可用于排序(即,标题中有向上/向下箭头图标)。 dataTable有两个问题: 只有一列(年份)显示为可用于排序。(Year是Car类中“int”类型的属性,而其他三列是String类型,因此问题的一个方面是String字段忽略了sortby=“#{Car.xxx}”标记。) 年份列实际上是不可排序的。点击年份标题的向上/向下箭头没有效果。当点

  • 我目前正在使用带有Spring Data commons 1.9.1和Spring JPA 1.7.1的JpaSort。我需要使用QueryDSL,因为JPA不允许为空值定义排序。 这是我的存储库 我在我的控制器中这样做: 这就是我对JPA的看法: 这是我为QueryDSL更改的内容: 然而,似乎什么都没有得到整理。我已经启用了调试日志记录,我看到了这一点: 如果我将其更改为: 然后,按我的“数据

  • 我开始在我的项目中使用primefaces,我马上就遇到了问题。我有一个列表,其中包含一些我用实体管理器从数据库中获取的东西,我在primefaces数据表的视图中显示了它。在我的后台bean中,我有:List getList(),在这里我使用实体管理器从数据库中检索记录,并立即返回。。 和myService: 我的豆子: 视图: 这种方式primefaces排序不起作用,我在堆栈上的某个地方读到

  • 在我的应用程序中,我使用全局过滤器搜索Primefaces数据表中的记录,并在同一数据表上应用了DataExporter。 当我搜索任何记录并进行导出时,它会返回给我一个完整的数据列表,而不是过滤列表。 我的开发环境是:java 6.0、Primefaces 3.2、JSF2.1、GlassFish Server 3.1.2、Netbeans 7.1.1 登记在我的dataTable和dataEx

  • 我正在用PrimeFaces3.5、JasperReports5.2和JSF2.x开发一个应用程序。我的旧应用程序中有一些报告页面是由JasperReports4.5和JSF1.2编写的。所有这些报表页都在旧应用程序中工作。我试图在我的新应用程序中转移那些报告页。在新的应用程序中一切正常,但报告不能导出,我没有得到任何错误。我是不是漏掉了什么? 下面是我的代码,它在我的旧JSF1.2应用程序中工作

  • 我使用的是PrimeFaces 2.2和JSF 2.0.3。 我有一个包含以下数据表的xhtml视图: ..具有以下背衬豆: 注意母亲姓名列上的“commandLink”和出生日期列上的“sortBy”。 我遇到了一个奇怪的问题,似乎仅限于IE,如果我按DOB对数据进行排序,然后分页到最后一页并单击表中最后一条记录的commandLink,它会触发两个action事件。第一个事件正确地报告了我单击