2009-08-05 6 views
1

Dans le cadre d'un projet sur lequel je travaille, nous migrons de Velocity vers JSP. Je dois transformer l'ensemble des modèles Velocity existants en JSP. Nous pourrions passer des heures à discuter des raisons pour lesquelles cela a été décidé (en partie de ma faute), lequel est le meilleur et le meilleur moyen de dissuader la direction de s'engager dans cette voie, mais ce serait une perte de temps. Donc, ce que je cherche est un ensemble de modèles, de bonnes pratiques, ce que vous avez, pour m'aider. Il y a beaucoup de macros Velocity dans le fichier de la bibliothèque globale qui sont utilisées à travers une variété de modèles. Je pense à convertir chaque macro en scriptlet JSP et à traduire la macro en Java. Ensuite, je voudrais inclure ce fichier avec tous les scriptlets dans chaque JSP soit via la directive include ou jsp: include. Je pensais aussi à convertir chaque appel en macro en scriptlet. Ces macros ont des paramètres définis dans la classe Spring ModelAndView.Migration de Velocity vers les pages JSP

Des tests préliminaires semblent indiquer que cette approche ne fonctionnera pas. Il semble que je reçois des erreurs de compilation JSP. Mais, je pourrais manquer une erreur de ma part. J'utilise cette application Web sur OC4J version 10.1.3.4.0.

Voici un exemple simple de ce que je dois faire. Ceci est dans le fichier 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 

Et il est appelé dans d'autres fichiers comme ceci:

#showObjectErrors("logonForm") 

Notez que l'objet « demande » est pas un HttpServletRequest, mais une classe d'application. Il y a des exemples beaucoup plus complexes qui sont trop nombreux à montrer.

+0

Il semble que lorsque vous dites «en mouvement», vous voulez dire «migrer» et vous cherchez la meilleure approche (la plus facile) de la migration. Ce n'est pas le cas. "Moving" de Velocity à JSP est appelé "réécriture". Par conséquent, la meilleure approche serait d'écrire votre nouveau code JSP, pas de scriptlets. – ChssPly76

+0

J'ai un ensemble de fichiers de modèles Velocity. Je dois les transformer en JSP. –

+0

Je comprends cela. Je dis juste que vous finirez par les réécrire de toutes pièces. Les macros Velocity n'ont aucune correspondance directe dans le monde JSP; jsp-include est une substitution plutôt pauvre. Tuiles Apache (http: //tiles.apache.org) fournissent une approche un peu meilleure de la composition de la page via includes; mais cela ne vous permettra toujours pas de faire une traduction bi-univoque des macros Velocity. – ChssPly76

Répondre

2

Convertit les macros en balises JSP. Voici un exemple d'un fichier d'étiquette de sun

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

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

Votre code devrait fonctionner comme ceci sur la page JSP:

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

Je suppose que $ request.errorSystem.hasErrors serait un objet dans la demande contexte, vous récupérerez avec:

${errorSystem.hasErrors} 
+0

Cela semble être le meilleur ajustement. Je n'ai pas utilisé JSP 2.0 donc ces fichiers de tags sont nouveaux pour moi. Ce sera amusant de les essayer. BTW, "hasErrors" est en fait une méthode, pas un objet, et il nécessite un param, donc je vais devoir créer un tag personnalisé régulier pour cela. –

+0

Vous devriez probablement créer une fonction JSTL, alors c'est plus comme $ {fn: hasErrors (objectName)}. Ils sont plutôt cool. Le meilleur endroit pour lire à ce sujet est vraiment le livre, safari.oreilly.com a des essais gratuits. – stevedbrown

0

Si vous voulez faire les choses de façon fragmentaire, vous pouvez être en mesure d'utiliser la VelocityViewTag dans VelocityTools 2.0. Il vous permettra de mettre du code Velocity directement dans vos fichiers 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"/>