4

有 JSP 变量${remoteFolder}

它的值是\\file-srv\demo

使用嵌入在这个 JSP 中的 jQuery。

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

如何保持这个变量的初始值?

编辑:当${remoteFolder}form标签内使用时,它解决了。

编辑2:

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>

编辑3:

var的早期使用,${remoteFolder}斜杠没问题 < form enctype="multipart/form-data" method="post" target="uploadFrame" action="<%= request.getContextPath() %>/uploadFile?portletId= ${portletId}&remoteFolder=${remoteFolder}">

4

4 回答 4

5

这里有两个问题。

首先,\是 JS 字符串中的转义字符。当你想\在 JS 字符串中表示 a 时,你需要对它进行双重转义:\\. 最简单的方法是为此使用JSTL fn:replace

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

其次,您希望将其作为 URL 参数发送。\是 URL 参数中的非法字符。您需要对其进行 URL 编码。最简单的方法是escape()为此使用 Javascript 的函数。

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}")
    + "',";
于 2010-02-15T13:30:06.567 回答
2

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

于 2010-02-15T11:41:42.287 回答
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 标准的一部分,但我不抱希望。幸运的是,它真的很容易写。

于 2010-02-15T13:31:01.057 回答
1

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

于 2010-02-15T11:41:09.230 回答