如何为不同类型的对象显示不同的JSP视图

如何为不同类型的对象显示不同的JSP视图,jsp,jakarta-ee,Jsp,Jakarta Ee,假设我有一个具有标准多态性行为的动物列表,比如猫和狗 为列表中的每个视图显示不同JSP视图的最佳方法是什么 <c:forEach var='animal' items='${animals}'> //show a different template per animal type </c:forEach> 在构造函数中传递每个动物后,我不确定应该在哪里创建这些对象。我想它可以在JSP内部以一种方式完成,但出于某种原因,我不太愿意使用这种表示法。在Animal上

假设我有一个具有标准多态性行为的动物列表,比如猫和狗

为列表中的每个视图显示不同JSP视图的最佳方法是什么

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

在构造函数中传递每个动物后,我不确定应该在哪里创建这些对象。我想它可以在JSP内部以一种方式完成,但出于某种原因,我不太愿意使用这种表示法。

在Animal上声明一个抽象方法,该方法返回一个字符串,名为getMyJspPage()


然后猫和狗可以返回对不同jsp页面或jsp片段的引用,您可以包括这些内容。

您可以使用一个自定义标记,该标记将当前动物作为属性,并使用它来确定正确的视图。

不幸的是,继承和多态性在jsp中不能很好地工作

最简单、最易维护的解决方案就是只做大量的工作

<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),该文件将每个特定动物作为属性,并调用它们。至少它保持了分派和呈现的分离。

因此我最终使用了JSP中i18n可用的“bundle”,方法如下

<fmt:message var="template" key="${animal.class.name}" />
所以最终的解决方案是这样的

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

该死看起来答案是“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}!