2010-02-15 77 views
4

有無JSP變量${remoteFolder}的JavaScript JSP變量

消除斜線這是值\\文件-SRV \演示

使用jQuery嵌入在這個JSP。

jQuery的解析${remoteFolder}變量作爲\文件srvdemo,即。一個斜槓被刪除。

如何保持這個var的初始值?

編輯:當${remoteFolder}被用在form裏面時,表示確定。

edited2:JSP的

JS部分,斜線剝離出去..

<script> 
     var oScript = document.createElement("script"); 
     oScript.type = "text/javascript"; 
     oScript.text = "var $j = jQuery.noConflict();"; 
     oScript.text+= "$j(document).ready(function(){"; 
     ... 
     oScript.text+= "'script':'<%= request.getContextPath() %>/uploadFile?portletId=${portletId}&remoteFolder=${remoteFolder}',"; 
     ... 
     oScript.text+= "});"; 
     document.body.appendChild(oScript);   
    </script> 

edited3:

${remoteFolder}變種

早期使用,這是一切OK用斜槓 < form enctype =「multipart/form-data」method =「post」target =「uploadFrame」action =「<(%)= request.getContextPath()%>/uploadFile?portletId = $ {portletId} & remoteFolder = $ {remoteFolder}「>

+0

奇怪,SO剝下了一個'\'出來。 – kennytm 2010-02-15 11:42:18

+0

是的,'\'被剝離出來 – sergionni 2010-02-15 11:44:00

回答

5

這裏有兩個問題。

首先,\是JS字符串中的轉義字符。當您想要在JS字符串中表示\時,您需要雙重轉義它:\\。最簡單的方法是使用JSTLfn:replace

var jsVariable = "${fn:replace(javaVariable, '\\', '\\\\')}"; 

其次,您希望將其作爲URL參數發送。 \是URL參數中的非法字符。您需要對其進行網址編碼。最簡單的方法是使用Javascript的escape()函數。

var urlParameter = escape(jsVariable); 

總結了

oScript.text+= "'script':'<%= request.getContextPath() %>/uploadFile?portletId=${portletId}&remoteFolder=${remoteFolder}',"; 

需要由

oScript.text += "'script':" 
    + "'${pageContext.request.contextPath}/uploadFile" 
    + "?portletId=${portletId}" 
    + "&remoteFolder=" + escape("${fn:replace(remoteFolder, '\\', '\\\\')}") 
    + "',"; 

被替換或者,您也可以只使用/,而不是作爲\文件路徑分隔符。這在Windows中也是完美的。您不需要將它們轉義以用於字符串,但是您仍然需要對其進行網址編碼。

oScript.text += "'script':" 
    + "'${pageContext.request.contextPath}/uploadFile" 
    + "?portletId=${portletId}" 
    + "&remoteFolder=" + escape("${remoteFolder}") 
    + "',"; 
+1

問題是,只是替換反斜槓並不夠。如果字符串中有雙引號字符會怎樣?或者是雙字節的Unicode字符?那麼在這種情況下,它是一個文件名,所以也許安全地做一兩個假設。 – Pointy 2010-02-15 13:33:04

+0

BalusC,謝謝你的澄清。我會嘗試這種方式。最初我試圖逃脫,但/ \ f給我符號看起來像廣場,當我在記事本中檢查此字符串。 – sergionni 2010-02-15 13:42:52

1

嘗試設置到$remotefolder \\\\ 文件-SRV \\演示因爲Javascript角將\解釋爲轉義字符,從而需要\\打印\。

+0

它來自後端和表單它的解決好了..,但在jQuery就緒函數它strripped斜槓 – sergionni 2010-02-15 11:48:20

2

這是JavaScript而不是jQuery。在使用額外的反斜槓創建JavaScript字符串文字時,您需要轉義任何想要保留的反斜線。

+0

裏面的形式標籤裏面的動作屬性這個變量包含所有的斜槓好,奇怪.. – sergionni 2010-02-15 11:48:47

+0

您能發佈您的JSP正在生成的相關JavaScript嗎? – 2010-02-15 12:08:02

+0

請參閱「edited2」一節,有一段代碼,其中斜槓意外地被剝離 - 它是jQuery的「uploadify」插件的一部分 – sergionni 2010-02-15 12:20:47

2

我發現我不能,而不必在它的一些關鍵功能我自己的EL函數庫寫一個嚴重的Web應用程序。其中包括一個「jsQuote」(或者「escapeJS」,取決於我的心情)函數,其目的是「保護」擴展的字符串,以便將它們放入Javascript字符串常量中。它類似於fn:escapeXml(),但不是針對HTML語法,而是針對Javascript。通常它要做的是檢查反斜槓,引號字符,換行&其他常用控制字符,然後檢查7位可打印範圍之外的任何字符。有了這樣的功能,你可以隨時安全地做這樣的事情:

<script> 
    // ... 
    var s = 'A string ${yourLib:escapeJS(some.java.bean.property)} constant'; 
    // ... 
</script> 

我真希望這樣的事情將成爲JSTL標準的一部分,但我不抱希望。幸運的是寫起來很簡單。

+0

實際上是一個好主意,考慮到這種情況通常發生在web開發人員身上 – sergionni 2010-02-15 13:48:52