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

时间:2009-07-14 14:55:39

标签: jsp java-ee

假设我有一个具有标准多态行为的动物列表,例如Cat(s)和Dog(s)。

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

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

老实说,为每个bean提供#toJSP是我不会考虑的原因。

我很想使用

public interface Template{

  public String render()
}

每个Animal都在构造函数中传递,但是我不确定应该在哪里创建这些对象。我想它可以在JSP中的&lt; %%&gt; 中完成,但由于某种原因,我对使用这种表示法犹豫不决。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

最简单,最易维护的解决方案就是做很多事情

<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),它将每个特定的动物作为属性,并呼叫它们。至少它保持调度,并且渲染分离。

答案 2 :(得分:1)

所以我最终使用&#34;捆绑&#34;可以通过以下方式在JSP中用于i18n

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

使用 template.properties 文件

foo.bar.Animal = animal.jsp 
foo.bar.Cat = cat.jsp
foo.bar.Dog = dog.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}!

答案 3 :(得分:0)

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

然后猫和狗可以返回对您可以包含的不同jsp页面或jsp片段的引用。