JSP中的自定义呈现基于没有instanceof的类的类型

时间:2009-03-29 14:25:48

标签: java jsp jstl jsp-tags

如何在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标签做些什么吗?

3 个答案:

答案 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>