2009-07-14 4 views
4

Angenommen, ich habe eine Liste von Tier (en) mit polymorphem Standardverhalten wie Katze (n) und Hund (e).So zeigen Sie eine andere JSP-Ansicht für verschiedene Objekttypen an

Was ist der beste Ansatz, um für jede einzelne in der Liste eine andere JSP-Ansicht anzuzeigen?

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

Um ehrlich zu sein, eine #toJSP für jede Bohne zu haben, würde ich aus offensichtlichen Gründen nicht berücksichtigen.

Ich bin jedoch der Verwendung eines in den Konstruktor übergeben

public interface Template{ 

    public String render() 
} 

mit jedem Tier

versucht, aber sollte ich bin mir nicht sicher, wo diese Objekte erstellt werden. Ich denke, es kann innerhalb der JSP in einem < %%> getan werden, aber ich bin zögerlich mit dieser Notation aus irgendeinem Grund.

+0

Verdammt. Sieht aus, als wäre die Antwort "JSP ist total scheiße". Nicht cool. – aaaidan

Antwort

1

So landete ich das "Bündel" mit bis die

für i18n in JSP in der folgenden Art und Weise zur Verfügung stehen
<fmt:message var="template" key="${animal.class.name}" /> 

mit template.properties Datei

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

So ist die endgültige Lösung würde so aussehen

<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> 

Mit Vorlage Dateien, die so aussehen

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

Deklarieren Sie eine abstrakte Methode für Animal, die eine Zeichenfolge namens getMyJspPage() zurückgibt.

Dann können Katzen und Hunde einen Verweis auf eine andere JSP-Seite oder JSP-Fragment, die Sie einschließen können, zurückgeben.

1

Sie können einen benutzerdefinierten Tag verwenden, das das aktuelle Tier als Attribut nimmt und verwendet sie die korrekte Ansicht doesnt

1

Leider Vererbung und Polymorphismus in jsps Arbeit sehr gut zu bestimmen.

Die einfachste und wartbare Lösung wurde

<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> 

und haben Tag-Dateien viel genau das zu tun (wie renderDog.tag, renderCat.tag), die jedes spezifische Tier als Attribut nimmt, und ruf sie an. zumindest hält es die Disposition und das Rendering getrennt.

Verwandte Themen