h:dataTable 显示正确的数字但空白行
h:dataTable displays the correct number but blank rows
我的 JSF 应用程序运行异常,我请求同事帮助我确定解决方案。
应用程序通过Facade+DAO从数据库中获取数据类,通过调试和println我可以声明对象集合是正确的(在下面的例子中,集合包含5个对象及其attributes),但是将这个collection传到Primefaces页面时,dataTable没有显示属性,明明行数是正确的,但是没有显示属性,如图。
我研究了其他帖子,但描述的错误与我的不同:
after filtering Empty rows blank rows displayed while paging in the datatable using Primefaces
primefaces datatable is showing blank rows. Showing the same number of rows as the records in backed list
由于托管 bean 正确地重新发布了集合,我认为应该显示问题(即在 JSF 页面上),并试图找到可能的错误位置,我创建了一个页面而不使用 Primefaces 或Facelets,只是纯 JSF 组件,但故障依然存在。基本代码如下所示:
以下是代码片段:
简单页面
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<link href="scripts/teste.css" rel="stylesheet" type="text/css" media="all" />
</h:head>
<h:body>
<h:form>
<h:dataTable value="#{coletaMB.coletas}" var="coleta"
styleClass="order-table"
headerClass="order-table-header"
rowClasses="order-table-odd-row,order-table-even-row">
<h:column>
<f:facet name="header">Nr. Setor</f:facet>
<h:outputText value="#{coleta.setor.numero}"/>
---- #{coleta.setor.numero} ----
</h:column>
</h:dataTable>
</h:form>
使用这个简单的代码,页面如下所示:
托管 bean
@ManagedBean(name="coletaMB")
@SessionScoped
public class ColetaMB{
@ManagedProperty(name="coleta", value="#{coleta}")
private Coleta coleta;
@ManagedProperty(name="coletaFacade", value="#{coletaFacade}")
private ColetaFacade coletaFacade;
private List<Coleta> coletas;
public List<Coleta> getColetas(){
if(coletas == null){
coletas = getListColetas();
}
return coletas;
}
private List<Coleta> getListColetas(){
coletas = new ArrayList<Coleta>();
try {
coletas = coletaFacade.getColetas();
return coletas;
} catch (DAOException e) {
(...)
}
}
(...)
}
Coleta.java
public class Coleta {
private int ano;
private Setor setor;
private int mes;
private int semana;
private int numeroEntrevista;
(*)getters and setter
}
Setor.java
public class Setor {
private Agencia agencia;
private String numero;
private String upa;
(*)getters and setters
}
Agencia.java
public class Agencia {
private int idAgencia;
private String nome;
(*)getters and setters
}
门面
public List<Coleta> getColetas() throws DAOException {
return dao.getColetas();
}
DAO
@Value("#{queries.sql01}")
private String sql01;
public List<Coleta> getColetas() throws DAOException {
try{
RowMapper<Coleta> mapper = getRowMapper();
return getJdbcTemplate().query(sql01, mapper);
} catch (DataAccessException de) {
de.printStackTrace();
throw new DAOException(de.getMessage());
}
}
private RowMapper<Coleta> getRowMapper() {
return new RowMapper<Coleta>() {
public Coleta mapRow(ResultSet rs, int rowNum) throws SQLException {
Agencia ag = new Agencia();
ag.setIdAgencia(rs.getInt(1));
ag.setNome(rs.getString(2));
Setor s = new Setor();
s.setAgencia(ag);
s.setUpa(rs.getString(3));
s.setNumero(rs.getString(4));
Coleta c = new Coleta();
c.setSetor(s);
c.setAno(rs.getInt(5));
c.setMes(rs.getInt(6));
c.setSemana(rs.getInt(7));
c.setNumeroEntrevista(rs.getInt(8));
return c;
}
};
}
在getListColetas
中,我插入了一个println来验证集合是完整的,即每个对象'coleta'都有对象'setor'和每个'setor'有对象 'agencia'。但是,根据在 JSF 页面上使用 'empty' 的建议,
<h:outputText value="#{empty coleta} - #{empty coleta.setor} - #{empty coleta.setor.numero}"/>
return 是 false - true - true
,我不知道为什么。
我的完整应用程序使用了以下库和依赖项(Spring 仅用于 DI 和 DAO 类):
解决:在dataTable标签中,我把属性var="coleta"
改成了var="c"
,像这样:
<h:dataTable value="#{coletaMB.coletas}" var="c"
styleClass="order-table"
headerClass="order-table-header"
rowClasses="order-table-odd-row,order-table-even-row">
<h:column>
<f:facet name="header">Nr. Setor</f:facet>
<h:outputText value="#{c.setor.numero}"/>
---- #{c.setor.numero} ----
</h:column>
</h:dataTable>
我想 JSF 与 ColetaMB 中的 @ManagedProperty
'coleta' 冲突,尽管我知道 var 属性特定于传递给的不同集合对象数据表。
我的 JSF 应用程序运行异常,我请求同事帮助我确定解决方案。
应用程序通过Facade+DAO从数据库中获取数据类,通过调试和println我可以声明对象集合是正确的(在下面的例子中,集合包含5个对象及其attributes),但是将这个collection传到Primefaces页面时,dataTable没有显示属性,明明行数是正确的,但是没有显示属性,如图。
我研究了其他帖子,但描述的错误与我的不同:
after filtering Empty rows blank rows displayed while paging in the datatable using Primefaces
primefaces datatable is showing blank rows. Showing the same number of rows as the records in backed list
由于托管 bean 正确地重新发布了集合,我认为应该显示问题(即在 JSF 页面上),并试图找到可能的错误位置,我创建了一个页面而不使用 Primefaces 或Facelets,只是纯 JSF 组件,但故障依然存在。基本代码如下所示:
以下是代码片段:
简单页面
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <link href="scripts/teste.css" rel="stylesheet" type="text/css" media="all" /> </h:head> <h:body> <h:form> <h:dataTable value="#{coletaMB.coletas}" var="coleta" styleClass="order-table" headerClass="order-table-header" rowClasses="order-table-odd-row,order-table-even-row"> <h:column> <f:facet name="header">Nr. Setor</f:facet> <h:outputText value="#{coleta.setor.numero}"/> ---- #{coleta.setor.numero} ---- </h:column> </h:dataTable> </h:form>
使用这个简单的代码,页面如下所示:
托管 bean
@ManagedBean(name="coletaMB") @SessionScoped public class ColetaMB{ @ManagedProperty(name="coleta", value="#{coleta}") private Coleta coleta; @ManagedProperty(name="coletaFacade", value="#{coletaFacade}") private ColetaFacade coletaFacade; private List<Coleta> coletas; public List<Coleta> getColetas(){ if(coletas == null){ coletas = getListColetas(); } return coletas; } private List<Coleta> getListColetas(){ coletas = new ArrayList<Coleta>(); try { coletas = coletaFacade.getColetas(); return coletas; } catch (DAOException e) { (...) } } (...) }
Coleta.java
public class Coleta { private int ano; private Setor setor; private int mes; private int semana; private int numeroEntrevista; (*)getters and setter }
Setor.java
public class Setor { private Agencia agencia; private String numero; private String upa; (*)getters and setters }
Agencia.java
public class Agencia { private int idAgencia; private String nome; (*)getters and setters }
门面
public List<Coleta> getColetas() throws DAOException { return dao.getColetas(); }
DAO
@Value("#{queries.sql01}") private String sql01; public List<Coleta> getColetas() throws DAOException { try{ RowMapper<Coleta> mapper = getRowMapper(); return getJdbcTemplate().query(sql01, mapper); } catch (DataAccessException de) { de.printStackTrace(); throw new DAOException(de.getMessage()); } } private RowMapper<Coleta> getRowMapper() { return new RowMapper<Coleta>() { public Coleta mapRow(ResultSet rs, int rowNum) throws SQLException { Agencia ag = new Agencia(); ag.setIdAgencia(rs.getInt(1)); ag.setNome(rs.getString(2)); Setor s = new Setor(); s.setAgencia(ag); s.setUpa(rs.getString(3)); s.setNumero(rs.getString(4)); Coleta c = new Coleta(); c.setSetor(s); c.setAno(rs.getInt(5)); c.setMes(rs.getInt(6)); c.setSemana(rs.getInt(7)); c.setNumeroEntrevista(rs.getInt(8)); return c; } }; }
在getListColetas
中,我插入了一个println来验证集合是完整的,即每个对象'coleta'都有对象'setor'和每个'setor'有对象 'agencia'。但是,根据在 JSF 页面上使用 'empty' 的建议,
<h:outputText value="#{empty coleta} - #{empty coleta.setor} - #{empty coleta.setor.numero}"/>
return 是 false - true - true
,我不知道为什么。
我的完整应用程序使用了以下库和依赖项(Spring 仅用于 DI 和 DAO 类):
解决:在dataTable标签中,我把属性var="coleta"
改成了var="c"
,像这样:
<h:dataTable value="#{coletaMB.coletas}" var="c"
styleClass="order-table"
headerClass="order-table-header"
rowClasses="order-table-odd-row,order-table-even-row">
<h:column>
<f:facet name="header">Nr. Setor</f:facet>
<h:outputText value="#{c.setor.numero}"/>
---- #{c.setor.numero} ----
</h:column>
</h:dataTable>
我想 JSF 与 ColetaMB 中的 @ManagedProperty
'coleta' 冲突,尽管我知道 var 属性特定于传递给的不同集合对象数据表。