2009-08-05 17 views
1

Im Rahmen eines Projekts, an dem ich gerade arbeite, migrieren wir von Velocity zu JSP. Ich muss die vorhandenen Velocity-Vorlagen in JSPs umwandeln. Wir könnten Stunden damit verbringen zu diskutieren, warum dies entschieden wurde (teilweise meine Schuld), welches besser ist und der beste Weg, das Management von diesem Weg abzubringen, aber das wäre Zeitverschwendung, da sie dazu verpflichtet sind, dies zu tun.Migration von Velocity zu JSPs

Also, was ich suche ist eine Reihe von Mustern, Best Practices, was hast du, um mir zu helfen. In der globalen Bibliotheksdatei befinden sich viele Velocity-Makros, die für eine Vielzahl von Vorlagen verwendet werden. Ich denke darüber nach, jedes Makro in ein JSP Scriptlet zu konvertieren und das Makro in Java zu übersetzen. Dann würde ich diese Datei mit allen Scriptlets in jede JSP aufnehmen, entweder über die include-Direktive oder jsp: include. Ich dachte auch darüber nach, jeden Anruf in ein Makro in ein Skriptlet umzuwandeln. Diese Makros haben Parameter, die in der Spring ModelAndView-Klasse definierte Beans sind.

Vorläufige Tests scheinen darauf hinzuweisen, dass dieser Ansatz nicht funktioniert. Ich bekomme anscheinend JSP-Kompilierungsfehler. Aber ich könnte einen Fehler von mir vermissen.

Ich verwende diese Webanwendung auf OC4J Version 10.1.3.4.0.

Hier ist ein einfaches Beispiel für das, was ich zu tun habe. Dies ist in der VM_global_library.vm Datei:

#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 

Und es ist in anderen Dateien wie so genannt:

#showObjectErrors("logonForm") 

Beachten Sie, dass die „Anforderung“ Objekt ist keine HttpServletRequest, sondern eine Anwendungsklasse. Es gibt viel komplexere Beispiele, die zu viel zu zeigen sind.

+0

Es scheint, dass wenn Sie "Umzug" sagen, Sie "migrieren" meinen und Sie nach dem besten (einfachsten) Ansatz für die Migration suchen. Das ist nicht der Fall. Das "Verschieben" von Velocity zu JSP wird "Neuschreiben" genannt. Folgerichtig wäre der beste Ansatz, Ihren neuen JSP-Code richtig zu schreiben - keine Scriptlets. – ChssPly76

+0

Ich habe eine Reihe von Velocity Template-Dateien. Ich muss sie in JSPs verwandeln. –

+0

Ich verstehe das. Ich sage nur, dass du sie am Ende sowieso von Grund auf neu schreiben wirst. Geschwindigkeitsmakros haben keine direkte Übereinstimmung in der JSP-Welt; jsp-include ist eine ziemlich schlechte Substitution. Apache-Kacheln (http: //tiles.apache.org) bieten einen etwas besseren Ansatz für die Seitenkomposition via Includes; aber es wird immer noch nicht zu einer Eins-zu-Eins-Übersetzung von Velocity-Makros führen. – ChssPly76

Antwort

2

Wandeln Sie die Makros in JSP-Tag-Includes um. Hier ist ein Beispiel für eine Tag-Datei von sun

shipDate.tag unter 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> 

Die 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}" /> 

Ihr Code sollte wie folgt auf der JSP arbeiten:

#showObjectErrors("logonForm") 
===> 
<%@ taglib prefix="errorLib" tagdir="/WEB-INF/errorLib" %> 
... 
<errorLib:showObjectErrors objectName="logonForm" /> 

Ich nehme an, $ request.errorSystem.hasErrors wäre ein Objekt in der Anfrage Kontext, so dass Sie es mit abrufen würde:

${errorSystem.hasErrors} 
+0

Das scheint die beste Lösung zu sein. Ich habe JSP 2.0 nicht verwendet, daher sind diese Tag-Dateien neu für mich. Es wird Spaß machen, sie auszuprobieren. BTW, "hasErrors" ist eigentlich eine Methode, kein Objekt, und es erfordert einen Parameter, also muss ich ein reguläres benutzerdefiniertes Tag dafür erstellen. –

+0

Sie sollten wahrscheinlich eine JSTL-Funktion dafür erstellen, dann ist es eher wie $ {fn: hasErrors (objectName)}. Sie sind ziemlich cool. Der beste Ort, um dies zu lesen, ist das Buch wirklich, Safari.oreilly.com hat kostenlose Studien. – stevedbrown

0

Wenn Sie die Dinge in unsystematische Weise tun wollen, können Sie in der Lage sein, die Verwendung des VelocityViewTag in VelocityTools 2.0 zu machen. Sie können den Velocity-Code direkt in Ihre jsp-Dateien einfügen.

<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"/>