5

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

4

3 回答 3

6

您可以包含另一个jsp,它将为给定类型进行正确的呈现。例如:

<c:forEach var="o" items="${bigListofObjects}"  >
    <c:import url="render-${o.type}.jsp"/>
</c:forEach>
于 2009-03-29T14:35:49.067 回答
1

您可以为每个类创建一个具有通用方法的接口,以实现以多态方式发出您需要的 HTML/JSP。我对这个建议并没有那么疯狂,因为它以一种糟糕的方式将用户界面泄漏到模型类中。也许另一种解决方法是可以为您发出 UI 的访问者模式。

无论哪种方式,您都必须在出现新类型时添加代码。

我不愿意创建自定义标签库。您必须小心确保样式不会泄漏到其中,从而使 CSS 蒙皮成为不可能。

于 2009-03-29T14:38:48.123 回答
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>
于 2009-03-29T14:38:08.310 回答