2009-08-05 115 views
1

作为我正在开发的项目的一部分,我们正在从Velocity迁移到JSP。我需要将现有Velocity模板集合转换为JSP。我们可以花几个小时讨论为什么这是决定性的(部分是我的错),哪一个更好,也是阻止管理层走上这条道路的最好方式,但是如果他们致力于完成这项工作,那将浪费时间。从Velocity迁移到JSP

所以,我正在寻找的是一套模式,最佳实践,你有什么,帮助我。全局库文件中有很多Velocity宏,可用于各种模板。我正在考虑将每个宏转换为JSP脚本并将宏转换为Java。然后,我将通过include指令或jsp:include将该文件与所有scriptlet一起包含到每个JSP中。我也在考虑将每个调用转换为一个宏。这些宏具有在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的,而是一个应用程序类。 有太多复杂的例子太多以至于无法展示。

+0

看起来,当你说“移动”你的意思是“迁移”,你正在寻找最好的(最简单的)移植方法。事实并非如此。从Velocity移动到JSP被称为“重写”。因此,最好的方法是正确编写新的JSP代码 - 无脚本。 – ChssPly76 2009-08-05 17:51:31

+0

我有一套Velocity模板文件。我需要把它们变成JSP。 – 2009-08-05 20:25:46

+0

我明白这一点。无论如何,我只是说你会从头开始重写它们。 Velocity宏在JSP世界中没有直接的对应关系; jsp-include是一个相当差的替代品。 Apache Tiles(http://tiles.apache。org)提供了一个更好的方法来通过包含页面组合;但是它仍然不能让你对Velocity宏进行一对一的翻译。 – ChssPly76 2009-08-05 21:24:11

回答

2

将宏转换为JSP标签包含。下面是从sun

shipDate.tag在WEB-INF /标签的标签文件的例子:

<%@ 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} 
+0

这似乎是最合适的。我没有使用过JSP 2.0,所以这些标签文件对我来说是新的。尝试它们会很有趣。 顺便说一句,“hasErrors”实际上是一种方法,而不是一个对象,它需要一个参数,所以我必须为此创建一个定制的定制标记。 – 2009-08-06 16:18:48

+0

您应该为此创建一个JSTL函数,然后它更像$ {fn:hasErrors(objectName)}。他们非常酷。阅读这本书的最佳地点是真正的好书,safari.oreilly.com有免费试用版。 – stevedbrown 2009-08-06 16:21:28

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