假设我有一个具有标准多态行为的动物列表,例如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; 中完成,但由于某种原因,我对使用这种表示法犹豫不决。
答案 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片段的引用。