2010-02-15 79 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