如何在jsp中正确呈现具有不同类型的对象列表?比方说,我必须按指定的顺序渲染这些不同的对象。
一种方法可能是使用公共类型变量或instanceof,但这意味着有一个大的switch / if语句来管理它们:
<c:forEach var="o" items="${bigListofObjects}" >
<c:choose>
<c:when test='${o.type=="simple"}' >
<!-- render simple -->
</c:when>
<c:when test='${o.type=="complex"}' >
<!-- render complex -->
</c:when>
<!-- etc etc ... -->
</c:choose>
</c:forEach>
我可以为每个类添加一个render()方法,但这意味着将视图与其余代码混合。
如果我想稍后渲染另一种类型会怎样?我可以用自定义jsp标签做些什么吗?
答案 0 :(得分:6)
您可以包含另一个jsp,它可以为给定类型执行正确的渲染。例如:
<c:forEach var="o" items="${bigListofObjects}" >
<c:import url="render-${o.type}.jsp"/>
</c:forEach>
答案 1 :(得分:1)
您可以为每个类创建一个具有通用方法的接口,以实现以多态方式发出所需的HTML / JSP。我对这个建议并不那么疯狂,因为它以一种糟糕的方式将用户界面泄漏到模型类中。也许另一种方法是访问者模式可以为你发布UI。
无论哪种方式,您都必须在出现新类型时添加代码。
我不愿意创建自定义标记库。您必须小心确保样式不会泄漏到其中,从而无法进行CSS蒙皮。
答案 2 :(得分:0)
你可以有一个外部的forEach循环,它遍历一系列类型列表:
<c:forEach var="t" items="${listOfTypes}">
<c:forEach var="o" items="${bigListofObjects}">
<if test='${o.type==t}'>
<!-- render -->
</c:if>
</c:forEach>
</c:forEach>