作为我正在研究的项目的一部分,我们正在从Velocity迁移到JSP。我需要将现有的Velocity模板集转换为JSP。我们可以花几个小时讨论为什么决定这个问题(部分是我的错),哪一个更好,也是最好的方法来阻止管理人员走这条道路,但这会浪费时间,因为他们致力于完成这项工作。
所以,我正在寻找的是一套模式,最佳实践,有什么帮助我。全局库文件中有很多Velocity宏,可用于各种模板。我正在考虑将每个宏转换为JSP scriptlet并将宏转换为Java。然后我会通过include指令或jsp:include将包含所有scriptlet的文件包含到每个JSP中。我还想把每个调用宏转换成一个scriptlet。这些宏的参数是Spring ModelAndView类中定义的bean。
初步测试似乎表明这种方法不起作用。我似乎得到了JSP编译错误。但是,我可能错过了我的错误。
我在OC4J版本10.1.3.4.0上运行此Web应用程序。
这是我必须处理的一个简单示例。这是在VM_global_library.vm文件中:
#macro( showObjectErrors $objectName)
#if ($request.errorSystem.hasErrors($objectName))
<table>
#foreach ($error in $request.errorSystem.getErrors($objectName))
<tr>
<td class="acError">$error</td>
</tr>
#end
</table>
#end
#end
并在其他文件中调用它:
#showObjectErrors( "logonForm" )
请注意,“request”对象不是HttpServletRequest,而是应用程序类。 还有更复杂的例子太多了。
答案 0 :(得分:2)
将宏转换为JSP标记包含。以下是sun
标记文件的示例 WEB-INF / tags下的shipDate.tag:
<%@ attribute name="shipping" required="true" %>
<jsp:useBean id="now" class="java.util.Date" />
<jsp:useBean id="shipDate" class="java.util.Date" />
<c:choose>
<c:when test="${shipping == 'QuickShip'}">
<c:set var="days" value="2" />
</c:when>
<c:when test="${shipping == 'NormalShip'}">
<c:set var="days" value="5" />
</c:when>
<c:when test="${shipping == 'SaverShip'}">
<c:set var="days" value="7" />
</c:when>
</c:choose>
<jsp:setProperty name="shipDate" property="time"
value="${now.time + 86400000 * days}" />
<fmt:formatDate value="${shipDate}" type="date"
dateStyle="full"/>.<br><br>
JSP:
<%@ taglib prefix="sc" tagdir="/WEB-INF/tags" %>
<h3><fmt:message key="ThankYou"/> ${param.cardname}.</h3><br>
<fmt:message key="With"/>
<em><fmt:message key="${param.shipping}"/></em>,
<fmt:message key="ShipDateLC"/>
<sc:shipDate shipping="${param.shipping}" />
您的代码在JSP上应该像这样工作:
#showObjectErrors( "logonForm" )
===>
<%@ taglib prefix="errorLib" tagdir="/WEB-INF/errorLib" %>
...
<errorLib:showObjectErrors objectName="logonForm" />
我假设$ request.errorSystem.hasErrors将是请求上下文中的对象,因此您将使用以下命令检索它:
${errorSystem.hasErrors}
答案 1 :(得分:0)
如果您想以零散的方式做事,您可以使用VelocityTools 2.0中的VelocityViewTag。它可以让你将Velocity代码直接放到你的jsp文件中。
<velocity:view>
#if( $foo ) this is #trickyMacroStuff() for some reason #end
#parse('whatever.vm')
</velocity:view>
Put some ${jstl} here: <fmt:message key="bar"/>
<velocity:view template="sometemplate.vm"/>