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

qno*_*oid 5 jsp java-ee

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

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

<c:forEach var='animal' items='${animals}'>
    //show a different template per animal type
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

老实说,出于明显的原因,我不会考虑为每个bean使用#toJSP。

我很想用一个

public interface Template{

  public String render()
}
Run Code Online (Sandbox Code Playgroud)

每个动物传入构造函数,但是我不确定这些对象应该在哪里创建。我猜它可以在JSP内以<%%>的方式完成,但是出于某种原因,我在犹豫是否使用此表示法。

qno*_*oid 1

所以我最终通过以下方式在 JSP 中使用了可用于 i18n 的“捆绑包”

<fmt:message var="template" key="${animal.class.name}" />
Run Code Online (Sandbox Code Playgroud)

使用template.properties文件

foo.bar.Animal = animal.jsp 
foo.bar.Cat = cat.jsp
foo.bar.Dog = dog.jsp
Run Code Online (Sandbox Code Playgroud)

所以最终的解决方案看起来像这样

<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>
Run Code Online (Sandbox Code Playgroud)

使用如下所示的模板文件

Hello animal ${animal}!
Hello cat ${animal}!
Hello dog ${animal}!
Run Code Online (Sandbox Code Playgroud)