在我正在处理的当前项目中,我们有多个对象类型需要不同的表示。
举个例子,假设我们有一个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依赖吗?这听起来有点矫枉过正。
根据对象的类型,您建议使用哪些替代/模式来呈现不同的标记?也许我们目前的做法并不像我认为的那么糟糕。
答案 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>
您也可以使用视图模型中的任何可用变量来代替类名。