jsf - 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>
解决方案
除非有错别字,
<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 中没有做任何事情)。
推荐阅读
- arm - 如何修复目标和构建机器之间的 GLIBC 版本不匹配?
- web-scraping - 所有的不会用 beautifulsoup 打印
- typescript - 使用 TypeScript 的 Puppeteer - 类型“元素”上不存在属性“点击”
- r - 使用 ShinyApp 处理字符编码问题
- google-apps-script - GMail消息打开时触发插件,无需单击插件按钮并打开插件卡
- c# - 使用 Telerik 库浏览 DB 中的对象时出现 voa_class 相关异常
- android - 使用随机值预初始化的静态变量
- html - 表不会中心?(布尔玛)
- azure - Azure Databricks 与带有专用终结点的 Azure 密钥保管库集成
- flutter - 是否可以在 Flutter Web 和 Flutter App 中实现 Agora Video Call?