1

作为我正在进行的项目的一部分,我们正在从 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" )

请注意,“请求”对象不是 HttpServletRequest,而是应用程序类。还有很多更复杂的例子无法展示。

4

2 回答 2

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}
于 2009-08-05T17:34:17.783 回答
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"/>
于 2009-08-11T21:10:39.633 回答