2012-11-28 36 views
4

哇,標題相當滿口。讓我解釋。我有一個.jsp頁面,在這個頁面上是一個JavaScript <script ..>元素,在JavaScript裏面有一個EL表達式(${..})。代碼如下所示:Eclipse格式化在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 
} 
; 

=>這實際上打破了代碼!

如果拆分多行,標籤不再被識別爲有效的EL表達式,並且JavaScript代碼的執行將停止拋出異常。

我知道關於使用標籤(// @formatter:offon)關閉Java格式化程序中的格式化adhoc的方法,但Eclipse中的JavaScript格式化程序沒有這種選項。


修復(閱讀解決方法),這是對JavaScript格式化強制從未擴大對象的唯一方法。但這在兩個方面有問題:

  • 不擴展對象可能非常混亂,導致代碼非常不可讀。
  • 在Eclipse JavaScript格式化程序中,多行擴展對象是默認

這意味着,如果我的團隊的任何成員偶然自動格式化包含所描述的構造的.jsp文件,則代碼將無聲無息地破壞。它仍然看起來像有效的JS,並傳遞構建等,但在執行時它不會工作。


有沒有人有任何解決方案呢?最好的解決方案是以某種方式禁用格式化,比如Java格式化程序中使用的標記(此解決方案無需執行公司/團隊範圍的格式標準或希望沒有人會意外地按Shift + Ctrl + F)。

+0

這不是JSTL。那是EL。 JavaScript也不是一個scriptlet。我修正了錯誤的術語。要了解JSTL究竟是什麼,請閱讀http://stackoverflow.com/tags/jstl/info要了解scriptlet的真實含義,請閱讀http://stackoverflow.com/tags/scriptlet/info – BalusC

+0

謝謝。在一個環境中使用JSP/Java/Struts2/JavaScript時,我被所有不同的標籤大量混淆...... :) – fgysin

回答

1

顯然有可能將EL表達式換成單引號。這將使得它們在JavaScript中看起來像一個字符串,但它們仍將被評估爲EL表達式。

因此改變

var HOST_ID = ${host.id}; 

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

實際上做的伎倆。 Eclipse JavaScript格式化程序現在將該表達式視爲一個字符串,並且不會將其展開。問題解決了。

+0

這不是一個完整的解決方案,因爲EL標籤的輸出並不總是一個字符串。如果您有一個JSON字符串作爲EL標記的輸出,並且您想將JSON字符串作爲Javascript對象讀取,則將它們括在單引號中會使您的功能陷入混亂。 – Nishanth

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 
}