2009-07-14 13 views
4

Cat(s)とDog(s)のような標準的な多態性を持つAnimal(s)のリストがあるとします。異なる種類のオブジェクトに対して異なるJSPビューを表示する方法

リスト内のそれぞれについて異なるJSPビューを表示する最良の方法は何ですか?

<c:forEach var='animal' items='${animals}'> 
    //show a different template per animal type 
</c:forEach> 

各豆に#toJSPを付けることは正直なところ、私は明らかな理由から考慮しないものです。

私は、しかし、私は、これらのオブジェクトを作成しなければならない場所がわからないんだけど、しかし、コンストラクタに渡された各動物と

public interface Template{ 

    public String render() 
} 

を使用するので誘惑しています。私はそれが< %%>のJSP内で実行できると思いますが、何らかの理由でこの表記を使用することを躊躇しています。

+0

Damn。答えは "JSPが完全に嫌な"のように見えます。クールではありません。 – aaaidan

答えて

1

だから私はtemplate.propertiesファイル

foo.bar.Animal = animal.jsp 
foo.bar.Cat = cat.jsp 
foo.bar.Dog = dog.jsp 

だから、最終的な解決策を次のよう

<fmt:message var="template" key="${animal.class.name}" /> 

にJSPで国際化のために利用可能な「バンドル」を使用して終了このようになります

<c:forEach var='animal' items='${animals}'> 
    <span> 
     <c:set var="animal" scope="request" value="${animal}"/> 
     <fmt:message var="template" key="${animal.class.name}" /> 
     <jsp:include page="${template}" /> 
    </span> 
</c:forEach> 

テンプレートこのようなファイル

Hello animal ${animal}! 
Hello cat ${animal}! 
Hello dog ${animal}! 
0

getMyJspPage()という文字列を返すAnimalの抽象メソッドを宣言します。

猫と犬は、あなたが含むことができる別のJSPページまたはJSPフラグメントへの参照を返すことができます。

1

あなたは属性として、現在の動物を取り、非常によく正しいビューにJSPで

1

残念なことに、継承とポリモーフィズムdoesntの仕事を決定するためにそれを使用するカスタムタグを使用することができます。

最も簡単、最も保守性ソリューションは、ちょうど

<c:choose> 
    <c:when test="${animal.type == 'Cat'}"> 
     <my:renderCat cat="${animal}"/> 
    </c:when> 
    <c:when test="${animal.type == 'Dog'}"> 
     <my:renderDog Dog="${animal}"/> 
    </c:when> 
    ... 
</c:choose> 

の多くを行うと、属性として、それぞれ特定の動物を取る(renderDog.tag、renderCat.tagのような)タグファイルを持っている、としてきましたそれらを呼び出す。少なくともディスパッチとレンダリングは分離しています。

関連する問題