我使用类似的策略在另一个页面中检索其他类的值,它在那里工作得很好,但在下面的情况下,它没有显示值。
你知道吗?
以下是检索数据库值的方法。
public List<ProductBean> getPc() {
int i = 0;
Connection conn = null;
PreparedStatement pstmt = null;
// if(FacesContext.getCurrentInstance().getRenderResponse())
List<ProductBean> pc= new ArrayList<ProductBean>();
try {
conn = getVConnection();
String query = "select * from pictures";
pstmt = conn.prepareStatement(query);
//pstmt.setInt(1,this.id);
rs = pstmt.executeQuery();
while(rs.next())
{
System.out.println(rs.getInt(1));
System.out.println(rs.getString(2));
pc.add(i,newProductBean(rs.getInt(1),rs.getString(2)));
i++;
}
pstmt.close();
rs.close();
conn.close();
}catch (Exception e)
{
e.printStackTrace();
System.out.println("Error Data : " + e.getMessage());
}
return pc;
}
以下是jsf页面
<h:dataTable styleClass="panelGridColums" value="#{tableBean.pc}" var="p" border="1" >
<h:column>
<f:facet name="header">Product no</f:facet>
<h:outputText value="#{p.productNo}"/>
</h:column>
<h:column>
<f:facet name="header">Product name</f:facet>
<h:outputText value="#{p.p2name}"/>
</h:column>
</h:dataTable>
如果您没有看到任何检索到的数据或错误的打印,那么这只意味着pictures
表是空的。或者,您可能打算将其作为products
表。或者你可能没有运行你认为正在运行的代码。
请注意,您在发布的代码中有一个编译错误:
pc.add(i,newProductBean(rs.getInt(1),rs.getString(2)));
但我认为这是在写问题时不小心的打字错误。
与问题无关在getter方法中进行数据库交互是一个非常糟糕的主意。getter在bean的生命周期中可以被调用多次。它应该只归还(预先居住的)财产,而不是做一些本应一次性完成的昂贵的商业工作。将这段代码移到bean构造函数中,最好是以独立类/方法调用的形式。
public TableBean() throws SQLException {
this.pc = productService.list();
}
一切似乎都很好。也许你可以试试下面的一点:
- 用断点标记你的方法,看看该方法是否真的被调用了
- 尝试System.out.println(rs.next()),看看它是否为true并且结果集是否已填充