在spring MVC应用程序中为不同的对象类型生成标记

时间:2014-03-06 17:23:59

标签: java spring jsp jstl

在我正在处理的当前项目中,我们有多个对象类型需要不同的表示。

举个例子,假设我们有一个BankApplication超类和两个从超类继承的名为AccountApplication和LoanApplication的子类。它们中的每一个都将在视图中以不同的方式呈现。

当我们到达JSP时,我们有一个任何提到的子类型的应用程序列表。我见过很多代码:

<c:set value="${application.class.name}" var="applicationType" />
<c:choose>
    <c:when test="${applicationType == 'LoanApplication'}">
        <ourLib:displayLoanApplication application="${application}"/>
    </c:when>
    <c:when test="${applicationType == 'AccountApplication'}">
        <ourLib:displayAccountApplication application="${application}"/>
    </c:when>
    ...
</c:choose>

我想知道是否有更好的方法来解决这个问题。我曾考虑让每个类都实现自己的视图,但这听起来和当前的方法一样难看。在类中生成html不仅难看,而且我还必须处理字符串连接和其他我宁愿避免的东西。

我考虑的另一个选择是加载一个jsp / freemarker / velocity模板并从类中吐出html。这将允许我与代码分开编辑模板(好东西)。但我没有看到任何关于此的文档,我甚至不确定这是一个好方法。另外,我真的想在简单的POJO中使用jsp / freemarker / velocity依赖吗?这听起来有点矫枉过正。

根据对象的类型,您建议使用哪些替代/模式来呈现不同的标记?也许我们目前的做法并不像我认为的那么糟糕。

1 个答案:

答案 0 :(得分:1)

您可以做的是根据简单的类名包含模板。像这样你可以很容易地避免在这些地方选择这些块。

我目前正在使用Thymeleaf,但我确定&#34;任何&#34;模板引擎提供了类似的包含功能。

这是Thymeleaf的一个例子

<div th:include"entity/__${currentClass.simpleName}__ :: editor">this will be replaced by a template like 'entity/Task' with the fragment 'editor'</div>

您也可以使用视图模型中的任何可用变量来代替类名。