2009-03-29 5 views
5

どのようにして、さまざまなタイプのjspでオブジェクトのリストを適切にレンダリングできますか?たとえば、これらの異なるオブジェクトを指定された順序でレンダリングする必要があります。instanceofのないクラスのタイプに基づいたJSPでのカスタムレンダリング

一つの方法は、一般的なタイプの変数またはinstanceofはを使用することができるが文はそれらすべてを管理する場合には、/ビッグスイッチを有することを意味する:

<c:forEach var="o" items="${bigListofObjects}" > 
    <c:choose> 
     <c:when test='${o.type=="simple"}' > 
     <!-- render simple --> 
     </c:when> 
     <c:when test='${o.type=="complex"}' > 
     <!-- render complex --> 
     </c:when> 
     <!-- etc etc ... --> 
    </c:choose> 
</c:forEach> 

私は各クラスにrender()メソッドを追加することができますが、それはビューをコードの残りの部分と混合することを意味します。

後で別のタイプをレンダリングするとどうなりますか?カスタムjspタグでできることはありますか?

答えて

6

特定のタイプの正しいレンダリングを行う別のjspを含めることができます。例えば:

<c:forEach var="t" items="${listOfTypes}"> 
    <c:forEach var="o" items="${bigListofObjects}"> 
     <if test='${o.type==t}'> 
      <!-- render --> 
     </c:if> 
    </c:forEach> 
</c:forEach> 
0

あなたはタイプのリストのリストを反復処理をすることを、外側のforeachループを持つことができます多態的な方法で必要なHTML/JSP。私はこの提案について夢中になっていません。ユーザーインターフェイスをモデルクラスに悪い形で漏らすからです。おそらく別の方法は、あなたのためにUIを出すことができるVisitorパターンでしょう。

どちらの方法でも、新しいタイプが登場したときにコードを追加する必要があります。

私はカスタムタグライブラリを作成することを嫌うでしょう。 CSSのスキニングを不可能にするために、スタイルがそれに漏れないように注意する必要があります。

1

あなたが放出されることを実現するために、各クラスのための一般的な方法とのインタフェースを作成することができます。

<c:forEach var="o" items="${bigListofObjects}" > 
    <c:import url="render-${o.type}.jsp"/> 
</c:forEach> 
関連する問題