Eclipse Formatting在JavaScript脚本中打破EL表达式

时间:2012-11-28 14:00:49

标签: javascript eclipse jsp formatting el

哇,标题很满嘴。让我解释。我有一个.jsp页面,在此页面上是一个JavaScript <script ..>元素,在JavaScript中有一个EL表达式(${..})。代码如下所示:

<script type="text/javascript">
  jQuery(document).ready(function() {
    var HOST_ID = ${host.id};
    ...
  });
</script>

问题:
Eclipse JavaScript格式化程序默认会在多行上展开${host.id}。我猜测EL表达式以某种方式被解释为JavaScript对象。无论如何,标签最终会看起来像这样:

var HOST_ID = $
{
  host.id
}
;

=&GT;这实际上打破了代码!

如果拆分多行,则不再将标记识别为有效的EL表达式,并且执行JavaScript代码将停止抛出异常。

我知道如何使用标记(// @formatter:offon)关闭Java格式化程序中的格式化adhoc,但Eclipse中的JavaScript格式化程序没有这样的选项。


修复此问题的唯一方法(阅读解决方法)是强制JavaScript格式化程序从不扩展对象。但这在两个方面存在问题:

  • 不扩展对象可能非常混乱,导致代码非常难以理解。
  • 在Eclipse JavaScript格式化程序中,通过多行扩展对象是默认

这意味着如果我的团队中的任何成员意外地自动格式化包含所描述的构造的.jsp文件,则代码将默默地中断。它仍然看起来像有效的JS,并传递构建等,但在执行时它将无法工作。


有没有人对此有任何解决方案?最好的解决方案是以某种方式禁用使用Java格式化程序中使用的标记进行格式化(此解决方案无需执行公司/团队范围的格式化程序标准,或希望没有人会意外按Shift + Ctrl + F)。

2 个答案:

答案 0 :(得分:1)

我写这篇文章时接受的解决方案建议将EL表达式用单引号括起来作为问题的解决方案。如果您决定这样做并且EL表达式中的值是布尔值,请非常小心,因为该值现在是Javascript中的字符串,并且条件比较可能无法按预期工作...

假设您有一个布尔变量host.isActive,值为true。

var HOST_IS_ACTIVE1 = ${host.isActive}; // var type is boolean in Javascript

if (HOST_IS_ACTIVE1 == true) {
  // this code will be executed
}

if (HOST_IS_ACTIVE1 == 'true') {
  // this code will not be executed
}

var HOST_IS_ACTIVE2 = '${host.isActive}'; // var type is string in Javascript

if (HOST_IS_ACTIVE2 == true) {
  // this code will NOT be executed
}

if (HOST_IS_ACTIVE2 == 'true') {
  // this code will be executed
}

答案 1 :(得分:0)

显然可以在单引号中包装EL表达式。这将使它们看起来像JavaScript中的字符串,但它们仍将被评估为EL表达式。

如此改变

var HOST_ID = ${host.id};

var HOST_ID = '${host.id}';

实际上是诀窍。 Eclipse JavaScript格式化程序现在将表达式视为字符串,不会扩展它。问题解决了。