0

データ テーブルを持つ JSF アプリケーションがあります。各行には「commandLink」があります。行の commandLink をクリックすると、行データがコンソールに表示される必要があります。

commandLink をクリックするとエラーが発生します。エラーは次のとおりです。

component with duplicate id "dataTable1:col1" found

viewId=/UserHome.xhtml
location=E:\workspaces_eclipse\webService\.metadata\.plugins \org.eclipse.wst.server.core\tmp2\wtpwebapps\JSF_Demo\UserHome.xhtml
phaseId=RENDER_RESPONSE(6)

Caused by:
java.lang.IllegalStateException - component with duplicate id "dataTable1:col1" found
at  org.apache.myfaces.view.facelets.compiler.CheckDuplicateIdFaceletUtils.checkIds(CheckDuplic    ateIdFaceletUtils.java:100)

このエラーは、コンポーネントの ID が同じであることを示していますが、データ テーブルの各要素に異なる「ID」を指定しようとしました。

JSF ファイル「UserHome.xhtml」のソース コードは次のとおりです。

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org /TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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>
    <title>Resource Net 1.0</title>
    <h:outputStylesheet library="css" name="table-style.css"></h:outputStylesheet>
</h:head>
<h:body>
   <div align="center">
   <table width="90%" height="100%" border="0" style="cellspacing:0; border-radius:10px ;box-shadow: 0px 0px 15px 10px #888888">
    <tr>
        <td>
            <h2><div align="center">Resource Net 1.0</div></h2>
        </td>
    </tr>
    <tr>
        <td>                
            2. Generated by Map :
            <h:selectOneMenu value="#{userHomeListener.favCoffee2}">
                <f:selectItems value="#{userHomeListener.allDomains}" />
            </h:selectOneMenu>
        </td>
    </tr>       
    <tr>
        <td>
            <h:dataTable value="#{userHomeListener.documents}" var="doc"
                         binding="#{userHomeListener.documentsTable}"
                          id="dataTable1"                            
                         styleClass="order-table"
                         headerClass="order-table-header"
                         rowClasses="order-table-odd-row,order-table-even-row"
                         border="1">

                <h:column id="col1">
                    <f:facet name="header1">Document ID</f:facet>
                    #{doc.docID}
                </h:column>
                <h:column id="col2">
                    <f:facet name="header2">Document Name</f:facet>
                    #{doc.docName}
                </h:column>
                <h:column  id="col3">
                    <f:facet name="header3">Document Link</f:facet>
                     <h:form id="form1">
                     <h:commandLink id="link" value="#{doc.docLink}" action="#{userHomeListener.getRowData}"></h:commandLink>
                     </h:form>
                </h:column>
                <h:column id="col4">
                    <f:facet name="header4">Upload Date</f:facet>
                    #{doc.uploadDate}
                </h:column>

            </h:dataTable>
            <h:commandButton value="get row data" ></h:commandButton>
        </td>
    </tr>
    </table>

    </div>
</h:body>

私のコードに何か問題がありますか?この問題の解決策を親切に提案してください。

前もって感謝します。

4

1 に答える 1

2

binding属性は、<h:dataTable>ここで容疑者です。Bean のスコープが広すぎる場合、および/またはその属性のゲッター/セッターで「間違ったこと」を行っている場合、この種の問題が発生する可能性があります。

Bean をリクエストスコープに入れたり、別の方法を探したりして、binding完全に取り除くことができれば、この問題は解決するはずです。

binding属性とコマンド リンク アクション メソッドの名前の組み合わせは、getRowData単に現在のテーブル行を取得するために使用していることを示唆しています。これは確かに古い JSF 1.x を使用するときの方法でしたが、新しい JSF 2.x を使用するときはそうではありません。これは、Servlet 3.0 / EL 2.2 対応のコンテナー (Tomcat 7、Glassfish 3 など) を実行している場合に、はるかに優れた方法で簡単に実行できます。

<h:dataTable value="#{userHomeListener.documents}" var="doc">
    <h:column>
        <h:form>
            <h:commandLink value="#{doc.docLink}" action="#{userHomeListener.getRowData(doc)}" />
        </h:form>
    </h:column>
</h:dataTable>

public void getRowData(Document doc) {
    // ...
}

#{doc}ほら、メソッド引数としてストレートを渡すことができます。

以下も参照してください。

于 2012-08-31T11:51:13.390 に答える