JavaScript удаляет косую черту из переменной JSP - PullRequest
4 голосов
/ 15 февраля 2010

Есть переменная JSP ${remoteFolder}

Это значение \\ file-srv \ demo

Используйте jQuery, встроенный в этот JSP.

jQuery разрешает переменную ${remoteFolder} как \ file-srvdemo , т.е. одна косая черта удалена.

Как сохранить начальное значение этой переменной?

отредактировано : когда ${remoteFolder} используется внутри тега form, оно разрешено OK.

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, все было нормально с косой чертой / uploadFile? portletId = $ {portletId} & remoteFolder = $ {remoteFolder}" >

Ответы [ 4 ]

5 голосов
/ 15 февраля 2010

Здесь есть две проблемы.

Во-первых, \ - это escape-символ в строках 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}")
    + "',";
2 голосов
/ 15 февраля 2010

Я считаю, что не могу написать серьезное веб-приложение, не имея своей собственной библиотеки EL-функций с некоторыми критическими функциями. Среди них есть функция «jsQuote» (или «escapeJS», в зависимости от того, в каком я настроении), цель которой - «защитить» раскрытые строки, чтобы их можно было вставить в строковые константы JavaScript. Это аналог fn:escapeXml(), но вместо целевого синтаксиса HTML он нацелен на Javascript. Как правило, он должен проверять наличие обратной косой черты, символов кавычек, новой строки и других общих управляющих символов, а затем любых символов, выходящих за пределы 7-битного диапазона печати. С такой функцией вы всегда можете безопасно сделать что-то вроде этого:

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

Мне бы очень хотелось, чтобы это стало частью стандарта JSTL, но я не надеюсь. К счастью, это действительно легко написать.

2 голосов
/ 15 февраля 2010

Это скорее JavaScript, чем jQuery. При создании строковых литералов JavaScript с использованием дополнительной обратной косой черты вам нужно будет избегать обратной косой черты, которую вы хотите сохранить.

1 голос
/ 15 февраля 2010

Попробуйте установить $remotefolder в \\\\ file-srv \\ demo , так как javascripts интерпретирует \ как escape-символ, и, таким образом, нужно \\ напечатать \.

...