Переход с Velocity на JSP

В рамках проекта, над которым я работаю, мы переходим с Velocity на JSP. Мне нужно превратить набор существующих шаблонов Velocity в JSP. Мы могли бы часами обсуждать, почему было принято такое решение (частично по моей вине), какой из них лучше и как лучше всего отговорить руководство от этого пути, но это было бы пустой тратой времени, поскольку они привержены тому, чтобы это было сделано.

Итак, я ищу набор шаблонов, лучших практик, что у вас есть, чтобы помочь мне. В файле глобальной библиотеки есть много макросов Velocity, которые используются в различных шаблонах. Я думаю о преобразовании каждого макроса в сценарий JSP и переводе макроса на Java. Затем я включил бы этот файл со всеми скриптлетами в каждый JSP либо с помощью директивы include, либо с помощью jsp:include. Я также думал о преобразовании каждого вызова макроса в скриптлет. Эти макросы имеют параметры, которые являются bean-компонентами, определенными в классе Spring ModelAndView.

Предварительные тесты показывают, что этот подход не сработает. Кажется, я получаю ошибки компиляции JSP. Но я мог бы пропустить ошибку с моей стороны.

Я запускаю это веб-приложение на OC4J версии 10.1.3.4.0.

Вот простой пример того, с чем мне приходится иметь дело. Это находится в файле 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, а класс приложения. Есть гораздо более сложные примеры, которые слишком много, чтобы показать.


person Gary Kephart    schedule 05.08.2009    source источник
comment
Кажется, что когда вы говорите о перемещении, вы имеете в виду миграцию и ищете лучший (самый простой) подход к миграции. Это не так. Переход от Velocity к JSP называется переписыванием. Следовательно, лучшим подходом было бы правильное написание нового JSP-кода, а не скриптлетов.   -  person ChssPly76    schedule 05.08.2009
comment
У меня есть набор файлов шаблонов Velocity. Мне нужно превратить их в JSP.   -  person Gary Kephart    schedule 06.08.2009
comment
Я это понимаю. Я просто говорю, что в конечном итоге вы все равно будете переписывать их с нуля. Макросы скорости не имеют прямого соответствия в мире JSP; jsp-include — довольно плохая замена. Плитки Apache (tiles.apache.org) обеспечивают несколько лучший подход к компоновке страниц с помощью включений; но он по-прежнему не позволит вам выполнять однозначный перевод макросов Velocity.   -  person ChssPly76    schedule 06.08.2009


Ответы (2)


Преобразование макросов в тег JSP включает в себя. Вот пример файла тега из sun.

shipDate.tag в разделе WEB-INF/tags:

<%@ 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}
person stevedbrown    schedule 05.08.2009
comment
Это кажется лучшим вариантом. Я не использовал JSP 2.0, поэтому эти файлы тегов для меня новые. Будет интересно попробовать их. Кстати, hasErrors на самом деле является методом, а не объектом, и для него требуется параметр, поэтому мне придется создать для него обычный настраиваемый тег. - person Gary Kephart; 06.08.2009
comment
Вероятно, для этого вам следует создать функцию JSTL, тогда она больше похожа на ${fn:hasErrors(objectName)}. Они довольно крутые. Лучшее место, где можно прочитать об этом, — книга oreily, на safari.oreilly.com есть бесплатные пробные версии. - person stevedbrown; 06.08.2009

Если вы хотите делать что-то по частям, вы можете использовать VelocityViewTag в VelocityTools 2.0. Это позволит вам поместить код 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"/>
person Nathan Bubna    schedule 11.08.2009