0

2D配列をページ内のテーブルとして表示しようとしています。これは車輪の再発明のように聞こえますが、処理する必要のあるオブジェクトは、特定の方法(常に同じ)でレンダリングする必要があるカスタムタイプの2D配列です。

トリッキーな部分は、この2D配列の一部のインデックスにnull値が含まれる可能性があることです。そのような場合、特定の「使用できない」セルをレンダリングする必要があります。テーブル構造(yes ...<table> <tr>および)は、設計チーム<td>によってすでに定義されており、クライアントによって受け入れられています。


使用しようとしまし<c:forEach/>たが、JSTLタグとJSFタグの管理順序が原因で、うまく機能させることができませんでした。JSFタグが処理されるとき、古い値や欠落しているコンポーネントを含むいくつかの問題があります。

配列(@ViewScopedBeanの属性)は<c:forEach/>、配列の作成を強制した場合でも、呼び出されたときに常にnullになります。

public MyObject[][] getMatrix() {
    if(loadedMatrix == null)
        initializeMatrix();
    return loadedMatrix.getTable();
}

このinitializeMatrix()メソッドは、データベースから対応するデータを取得し、2D配列を作成するロジックを呼び出し、作成loadedMatrix後にそれを参照します(これはすべて機能し、例外やエラーはありません)。initializeMatrix終了しても、まだloadedMatrixですnull

<c:forEach/>何をレンダリングするかを知るためにテーブルのインデックスを管理する必要があるため(オブジェクトがnullの場合、可用性フラグがfalseに設定されているか、正常にレンダリングできるかどうか)、ネストされたオプションを選択しましたが、今のところは最も安全な解決策は、カスタムコンポーネントを作成することです。


私の質問は、レンダリングしているインデックスを認識しながら、2D配列のコンテンツをテーブルとしてレンダリングするためにどのような代替手段が必要かということです。

前もって感謝します

4

1 に答える 1

3

ui:repeat代わりに使用できますc:forEach。サンプルを試してみましたが、うまくいきました。c:foreachはタグハンドラーです。ビュースコープのBeanでタグハンドラーを使用しない理由について詳しくは、@BalusCの次の投稿をご覧ください。

JSF2フェイスレットのJSTL...意味がありますか?

<table>
<ui:repeat value="#{sampleBean.twodarray}" var="firstLevel" varStatus=#{vs}>
    <tr>
    <ui:repeat value="#{firstLevel}" var="secondLevel" rendered="#{!empty  firstLevel}">
        <td>#{vs.index} - #{secondLevel}</td>
    </ui:repeat>
    <h:panelGroup rendered="#{empty firstLevel}">
        <td colspan="3">empty</td>
    </h:panelGroup>
    </tr>
</ui:repeat>
</table>
于 2013-01-08T15:54:11.123 に答える