JSPX прерывается, когда javascript имеет тег XML внутри строки javascript (Tomcat версии 7.0.53 и выше) - PullRequest
0 голосов
/ 31 марта 2020

Проблему можно выявить, запустив следующую страницу jspx в Tomcat 7.0.53 и более поздних версиях (7.0.52 и более ранние версии подойдут).

<tags:xhtmlbasic xmlns:tags="urn:jsptagdir:/WEB-INF/tags"
                 xmlns:jsp="http://java.sun.com/JSP/Page"
                 xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"
                 xmlns="http://www.w3.org/1999/xhtml">
  <jsp:directive.page contentType="text/html" />
  <head>
    <title>JSPX - XHTML Basic Example</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"><!-- DONT COLLAPSE --></script>
    <script type="text/javascript">
    $(document).ready(function() {
       var options = [];
       var values = ["zero", "one", "two"];
       $.each(values, function(index) {
         // The following line breaks in version 7.0.53 and onwards
         options.push('<option value="' + index + '">' + values[index] + '</option>');
       });
       $("#opt").html(options.join(''));
       $("#opt").change(function() {
         $("#target").html($(this).val());
       });
    });
    </script>
  </head>
  <body>
    <h1>See the Problem</h1>
    <h2>Number goes here: <span id="target"></span></h2>
    <select id="opt">
    </select>
  </body>
</tags:xhtmlbasic>

Хотя это можно исправить, поместив тег CDATA вокруг рассматриваемая строка выглядит следующим образом:

<![CDATA[options.push('<option value="' + index + '">' + values[index] + '</option>');]]>

У нас есть большое существующее приложение, и везде найти такие проблемы было бы сложно. Это еще более усложняется использованием библиотек тегов jsp, где, если у вас есть директивы JSP внутри вашей области javascript, они должны быть вне каких-либо блоков CDATA, которые могут быстро стать громоздкими и трудными для понимания

например

<![CDATA[var somejavascript = "here";]]>
<c:if value="someboolean>alert("foo");</c:if>
<![CDATA[var somemorejavascript = "there";]]>

Итак, мои вопросы:

  1. Есть ли лучший подход к решению этой проблемы?
  2. Является ли это подлинным недостатком в текущая реализация Tomcat библиотек Jasper, о которых нужно сообщить и исправить?
...