0

次のJSF dataTableを手伝ってくれる人はいますか? ここでは、データベース テーブルからデータを取得し、dataTable バインディングを使用しましたが、行が画面に 3 回表示される理由はわかりませんが、バインディングを削除すると、1 回だけ表示されます。


<h:dataTable binding="#{threadController.dataTable}" var="category" value="#{threadController.queryCategories}" border="1" cellpadding="2" cellspacing="0">
  <h:column>
  <img src="../../images/directory.jpg" alt="Forum Icon" />
  </h:column>
  <h:column>
  <h:form>
  <h:commandLink value="#{category.cname}" action="#{threadController.categoryDateItem}" />
  </h:form>
  </h:column>

// defined globally
private HtmlDataTable dataTable;
private HtmlInputHidden dataItemId = new HtmlInputHidden();


public String categoryDateItem() {
            category = (Category) dataTable.getRowData();
            System.out.println("category action by select: "+category.getCname());
            dataItemId.setValue(category.getId());
            return "editItem"; // Navigation case.
 }

@SuppressWarnings("unchecked")
public ArrayList<Category> getQueryCategories(){    

    return (ArrayList<Category>)HibernateUtil.getSession().createCriteria(Category.class).list();   

}

出力:

            myText   myText   myText
4

2 に答える 2

2

このコンポーネントを Bean value="#{threadController.queryCategories}" にバインドするバインディング式。したがって、dataTable タグを使用してデータを取得するには、value 属性で十分です。

于 2009-01-12T04:57:39.550 に答える
0

バインディング = コンポーネント バッキング Bean

値= データ モデル バッキング Bean

したがって、Value と Binding が正しく設定されています (少なくとも、私が確認できる限り)。問題は、getQueryCategories() でデータベースから取得したリストをキャッシュしていないことが原因である可能性があります。

その dataTable をレンダリングするプロセスで getQueryCategories() がどのくらいの頻度で呼び出されるかはまったくわかりません。そのため、次のようにすることをお勧めします。

// Somewhere near the top of the handler class.. create a cache variable:
private ArrayList<Category> qCategories = null;

// now for getQueryCategories
public ArrayList<Category> getQueryCategories(){    
      if ( qCategories == null ) {  // qCategories should be a member of the handler
           qCategories = (ArrayList<Category>)HibernateUtil.getSession().createCriteria(Category.class).list();   
      }

      return qCategories
}

この種のキャッシュは、リクエスト スコープのセッションであるハンドラーを持つ JSF アプリで非常に役立ちます。これもまた、JSF が dataTable の「値」式を評価する頻度を実際に知ることができないためです。

于 2009-01-19T01:00:51.417 に答える