JavaScript从JSP变量中删除斜杠

时间:2010-02-15 11:37:05

标签: javascript jsp variables escaping slash

拥有JSP变量${remoteFolder}

它的价值是 \\ file-srv \ demo

使用此JSP中嵌入的jQuery。

jQuery将${remoteFolder}变量解析为 \ file-srvdemo ,即。删除了一个斜杠。

如何保留此var的初始值?

已修改:在${remoteFolder}代码中使用form时,已解决该问题。

edited2:

JS的一部分JSP,斜杠被剥离了..

  <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} var,用斜杠都可以     &LT; form enctype =“multipart / form-data”method =“post”target =“uploadFrame”action =“&lt;%= request.getContextPath()%&gt; / uploadFile?portletId = $ {portletId}&amp; remoteFolder = $ { remoteFolder}“&GT;

4 个答案:

答案 0 :(得分:5)

这里有两个问题。

首先,\是JS字符串中的转义字符。如果要在JS字符串中表示\,则需要对其进行双重转义:\\。最简单的方法是使用JSTL fn:replace

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

其次,您希望将其作为URL参数发送。 \是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中也很完美。您无需转义它们以便在字符串中使用,但您仍然需要对其进行URL编码。

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

答案 1 :(得分:2)

那是JavaScript而不是jQuery。在使用额外的反斜杠创建JavaScript字符串文字时,您需要转义要保留的任何反斜杠。

答案 2 :(得分:2)

我发现如果没有自己的EL函数库并且其中包含一些关键函数,我就无法编写一个严肃的Web应用程序。其中包括“jsQuote”(或“escapeJS”,取决于我所处的心情)功能,其目的是“保护”扩展的字符串,以便将它们放入Javascript字符串常量中。它类似于fn:escapeXml(),但它不是针对HTML语法,而是以Javascript为目标。一般来说,它必须检查反斜杠,引号字符,换行符和&amp;其他常用控制字符,然后是7位可打印范围之外的任何字符。有了这样的功能,你总能安全地做这样的事情:

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

我真的希望这样的事情能成为JSTL标准的一部分,但我没有希望。幸运的是,写起来真的很容易。

答案 3 :(得分:1)

尝试将$remotefolder设置为 \\\\ file-srv \\ demo ,因为javascripts会将\解释为转义字符,因此需要\\打印\。