Проблему можно выявить, запустив следующую страницу 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";]]>
Итак, мои вопросы:
- Есть ли лучший подход к решению этой проблемы?
- Является ли это подлинным недостатком в текущая реализация Tomcat библиотек Jasper, о которых нужно сообщить и исправить?