代码之家  ›  专栏  ›  技术社区  ›  Gary Kephart

从Velocity迁移到JSP

  •  1
  • Gary Kephart  · 技术社区  · 16 年前

    作为我正在进行的一个项目的一部分,我们正在从Velocity迁移到JSP。我需要将现有的速度模板集转换为JSP。我们可以花几个小时讨论为什么决定这样做(部分是我的错),哪一个更好,哪一个是最好的方法来劝阻管理层不要走这条路,但那将是浪费时间,因为他们承诺要这样做。

    所以,我要寻找的是一组模式,最佳实践,以及你所拥有的,来帮助我。在全局库文件中有很多Velocity宏,这些宏用于各种模板。我正在考虑将每个宏转换为JSP脚本,并将宏翻译成Java。然后,我将通过include指令或jsp:include将包含所有脚本的文件包含到每个jsp中。我也在考虑将每个调用转换成一个宏,然后转换成一个脚本。这些宏的参数是在SpringModelandView类中定义的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,而是一个应用程序类。 有很多更复杂的例子太多了,无法展示。

    2 回复  |  直到 16 年前
        1
  •  2
  •   stevedbrown    16 年前

    将宏转换为JSP标记includes。以下是来自 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}
    
        2
  •  0
  •   Nathan Bubna    16 年前

    如果你想以零碎的方式做一些事情,你也许可以利用velocitytools 2.0中的velocityviewtag。它将允许您将速度代码直接放入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"/>
    
    推荐文章