h:dataTable的奇怪行为

时间:2011-06-15 07:15:33

标签: jsf jsf-2

我使用类似的策略来检索另一个页面中的值与其他类,它在那里工作正常但在下面的情况下它没有显示值。

请问好吗?

以下是检索数据库值的方法。

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 page

<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>

2 个答案:

答案 0 :(得分:1)

如果您没有看到检索到的数据或错误的任何打印,那么它只是意味着pictures表为空。或许你打算将它作为products表。或许你没有运行你认为正在运行的代码。

请注意,您在发布的代码中出现了编译错误:

pc.add(i,newProductBean(rs.getInt(1),rs.getString(2)));

但是在构思这个问题时我会认为这是一个粗心的错字。


无关问题,在getter方法中执行数据库交互作业是一个非常糟糕的主意。在bean的生命中可以多次调用getter。它应该单独归还(预先填充)的财产,而不是做一些应该一次完成的昂贵的业务工作。将该段代码移动到bean构造函数中,最好是独立的类/方法调用。

public TableBean() throws SQLException {
    this.pc = productService.list();
}

答案 1 :(得分:1)

一切似乎都很好。 也许您可以尝试以下几点之一:

  1. 使用断点标记您的方法,看看是否真的调用了该方法
  2. 尝试使用System.out.println(rs.next())查看是否为真且结果集已填满。