Velocity - 如何在使用jQuery时避免ParseErrorException?

时间:2011-07-26 10:01:49

标签: java javascript jquery json velocity

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

org.apache.velocity.exception.ParseErrorException: Encountered "," at line 282, column 24 of /WEB-INF/velocity/www/comments.vm
Was expecting one of:
    "(" ...
    <RPAREN> ...
    <ESCAPE_DIRECTIVE> ...
~~~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~~~

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


更新2

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

5 个答案:

答案 0 :(得分:14)

你可以用#[[ ... ]]#包装你的javascript,告诉Velocity不要解析所附的块(Velocity 1.7中的新内容)

#[[ 
<script>
    ...
</script>
]]#

答案 1 :(得分:9)

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

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

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

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

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

你必须用你的javascript代码创建一个js文件 并将您的js文件导入您的虚拟代码

答案 4 :(得分:-1)

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

/的Björn