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

Mic*_*ael 11 javascript java 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~~~
Run Code Online (Sandbox Code Playgroud)

第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.';  
});
Run Code Online (Sandbox Code Playgroud)

次要更新

我改变了以下几行:

var url = "$articleurl";

$.post(url, myJSONObject, function(result){
~~~snip~~~
Run Code Online (Sandbox Code Playgroud)

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


更新2

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

ser*_*erg 14

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

#[[ 
<script>
    ...
</script>
]]#
Run Code Online (Sandbox Code Playgroud)


Mic*_*ael 9

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

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

jQuery.post(url, myJSONObject, function(result){
~~~snip~~~
Run Code Online (Sandbox Code Playgroud)

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

#set( $D = '$' )
${D}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 反斜杠用于转义实际引用,而不是导致解析错误的东西.将反斜杠视为仅在解析后才适用的东西. (2认同)