【问题标题】:Custom rendering in JSP based on type of class without instanceofJSP中基于类类型的自定义渲染,没有instanceof
【发布时间】:2010-10-16 05:36:08
【问题描述】:

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

【问题讨论】:

    标签: java jsp jstl jsp-tags


    【解决方案1】:

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

    <c:forEach var="o" items="${bigListofObjects}"  >
        <c:import url="render-${o.type}.jsp"/>
    </c:forEach>
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        你可以有一个外部的 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>
        

        【讨论】:

          猜你喜欢
          • 2019-04-20
          • 2021-11-10
          • 2019-11-02
          • 1970-01-01
          • 2021-07-04
          • 1970-01-01
          • 1970-01-01
          • 2016-03-15
          • 1970-01-01
          相关资源
          最近更新 更多