首页 > 解决方案 > p:dataTable 与动态列不呈现任何东西

问题描述

我正在使用 PrimceFaces 并想要呈现一个表格,其列数是动态确定的。我在这里找到了一个例子:

https://www.primefaces.org/showcase/ui/data/datatable/columns.xhtml

我认为我正确地实现了它,但表格没有呈现。实际上根本没有渲染任何东西。我调试了程序并确定:

CinemaSeatViewBean.getSeatsForShowList() 

被调用,但方法

CinemaSeatViewBean.getDataTableColumns()

根本没有被调用。

在我的代码下面:

1.) 托管 Bean:

@ManagedBean
@ViewScoped
public class CinemaSeatViewBean implements Serializable {

    private static final long serialVersionUID = 1L;


    private List<SeatForShow> seatsForShowList = new ArrayList<SeatForShow>();
    private List<DataTableColumn> dataTableColumns = new ArrayList<DataTableColumn>();

    @PostConstruct
    public void init() {
        // add SeatForShows
        ExternalContext extContext = FacesContext.getCurrentInstance()
                .getExternalContext();

        Flash flash = extContext.getFlash();
        FilmShow selectedFilmShow = (FilmShow)flash.get(FilmAndCinemaChooserBean.SELECTED_FILM_SHOW);

        int noOfColumns = selectedFilmShow.getNumberOfColumns();

        for (int i = 0; i < noOfColumns; i ++){
            // prepare dynamic columns
            dataTableColumns.add(new DataTableColumn("Seat " + (i+1), "seatNo"));
        }

        for ( SeatForShow seatForShow: selectedFilmShow.getSeatsForShow()){
            seatsForShowList.add(seatForShow);
        }
    }

    public void setDataTableColumns(List<DataTableColumn> dataTableColumns) {
        this.dataTableColumns = dataTableColumns;
    }

    public List<DataTableColumn> getDataTableColumns() {
        return dataTableColumns;
    }

    public List<SeatForShow> getSeatsForShowList() {
        return seatsForShowList;
    }


    public void setSeatsForShowList(List<SeatForShow> seatsForShowList) {
        this.seatsForShowList = seatsForShowList;
    }
}

2.) 小面:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
</h:head>
<h:body>
    <h:form id="seatsFormId">
        <p:dataTable id="seatsTableId" value="#{cinemaSeatViewBean.seatsForShowList}" var="seatForShow">
            <p:columns value="#{dataTableView.dataTableColumns}" var="column" sortBy="#{seatForShow[column.property]}">
                 <f:facet name="header">
                     <h:outputText value="#{column.header}" />
                 </f:facet>
                 <h:outputText value="#{seatForShow[column.property]}" />                      
            </p:columns>
        </p:dataTable>
    </h:form>
</h:body>
</html>

3.) DataTableColumn 类:

public class DataTableColumn implements Serializable{

    private static final long serialVersionUID = 1L;

    private String header;
    private String property;

    public DataTableColumn(String header, String property) {
        this.header = header;
        this.property = property;
    }

    public String getHeader() {
        return header;
    }

    public String getProperty() {
        return property;
    }
}

4.) 我希望我正确启用了 DEVELOPMENT_MODE:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">

<context-param>
    <param-name>primefaces.CLIENT_SIDE_VALIDATION</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>true</param-value>
</context-param>

<context-param>
    <param-name>facelets.REFRESH_PERIOD</param-name>
    <param-value>0</param-value>
</context-param>

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<!-- Map these files with JSF -->
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

<!-- Welcome page -->
<welcome-file-list>
    <welcome-file>selectFilmCinema.xhtml</welcome-file>
</welcome-file-list>

标签: jsfprimefaces

解决方案


除非有错别字,

<p:columns value="#{dataTableView.dataTableColumns}" var="column" sortBy="#{seatForShow[column.property]}">

应该

<p:columns value="#{cinemaSeatViewBean.dataTableColumns}" var="column" sortBy="#{seatForShow[column.property]}">

但是您的 IDE 应该为此警告您,并且我预计也会出现运行时错误(除非 bean 实际存在于您的项目中并且在 getter 中没有做任何事情)。


推荐阅读