Velocity – 使用jQuery时如何避免ParseErrorException?

我正在尝试在网页上的某些JavaScript中添加jQuerypost。 整个页面由几个Velocity模板构成。 一切都很好,直到我尝试添加jQuerypost,现在我得到:

org.apache.velocity.exception.ParseErrorException: Encountered "," at line 282, column 24 of /WEB-INF/velocity/www/comments.vm Was expecting one of: "(" ...  ...  ... ~~~snip~~~ 

第282行是$.post(...而第24列似乎是第一个“,”字符。最初我在这一行上有JSON,但是我把它移动到了(我的想法是var myJSONObject ...行)与无效JSON相关的错误(行开头的选项卡给出了误导性的列号)。

 var myJSONObject = {"body": "", "action": "postcomment", "submitted": "true", "ajax": "true"}; myJSONObject.body = $("body").val(); $.post("$!{articleurl}", myJSONObject, function(result){ btn.textContent='Comment sent successfully.'; }); 

次要更新

我改变了以下几行:

 var url = "$articleurl"; $.post(url, myJSONObject, function(result){ ~~~snip~~~ 

解析exception仍然集中在第一个“ ”。 我假设问题是Velocity认为它应该能够解析$ .post – 事实上,它是jQuery。 我在其他Velocity VM模板中使用了jQuery而没有任何问题。 有没有办法让Velocity在解析时忽略某些行/语句?


更新2

我找到了关于在Velocity中转义引用的链接 ,但它没有解决我的问题。 在$.post之前添加“ \ ”给出了完全相同的错误,但是该列是一个额外的,因为在行的开头添加了字符。

你可以用#[[ ... ]]#包装你的javascript,它告诉Velocity不要解析封闭的块(Velocity 1.7中的新function)

 #[[  ]]# 

好的,似乎有两个解决方案:

首先,使用jQuery我们可以避免使用全局别名$而是直接使用jQuery对象:

 jQuery.post(url, myJSONObject, function(result){ ~~~snip~~~ 

在我的情况下,上述工作很棒。 但我怀疑在其他情况下(非jQuery)这可能是不可能的。 在这种情况下,我们可以在有效的Velocity引用中“隐藏”我们的角色,如下所示:

 #set( $D = '$' ) ${D} 

资料来源: http : //velocity.apache.org/engine/devel/user-guide.html#escapinginvalidvtlreferences

我仍然想知道为什么反斜杠逃脱不起作用,但上面至少会让我再次移动。 🙂

我认为这是版本1.6.x中的一个错误 ,因为它在1.7中工作正常(如果没有,请告诉我,我测试了很多次..),根据参考, $只有在它生效时生效然后是a-zA-Z 。 我想尝试调试真正发生的事情,但是翻译代码是由Java CC工具生成的,很难识别逻辑……

你必须用你的javascript代码创建一个js文件,并将你的js文件导入你的vm代码

我无法让它与任何其他修复工作一起使用,例如在速度中逃避“$”。 我通过使用jQuery加载外部js文件而不是直接在速度上编写jQuery来实现它。 至少为我工作,希望它能帮助别人:)

/比约恩