Ошибка синтаксического анализа XHTML: содержимое элементов должно состоять из правильно сформированных символьных данных или разметки
В качестве расширения этого вопроса я пытаюсь вставить Javascript в <h:commandButton />
"s onclick
собственность как action
уже рендеринг таблицы AJAX.
Что я хочу сделать: получить выбранные элементы в списке и превратить их в параметры для использования в JSF FileServlet
, т.е. para2=value1¶m=value2¶m=value3
Вот что у меня есть:
<script type ="text/javascript">
function myScript() {
var box = document.getElementbyId('myForm:box');
var length = box.options.length;
var paramstring = "";
for (var i = 0; i < length; i++) {
if (i != (length - 1) {
if (box.options[i].selected) {
paramstring = paramstring + "param=" + box.options[i].value + "&";
}
} else {
paramstring = paramstring + "param=" + box.options[i].value;
}
}
if (document.getElementById('myForm:checkbox').checked) {
window.location='fileServlet? + paramstring;
}
}
</script>
Что я получаю при загрузке страницы:javax.servlet.ServletException: Error Parsing /page.xhtml: Error Traced[line:15] The content of elements must consist of well-formed character data or markup.
Что не вызывает исключения:
<script type ="text/javascript">
function myScript() {
var box = document.getElementbyId('myForm:box');
var length = box.options.length;
var paramstring = "";
if (document.getElementById('myForm:checkbox').checked) {
window.location='fileServlet? + paramstring;
}
}
</script>
Как только я добавлю в for (var i = 0; i < length; i++)
или даже for (var i = 0; i < 10; i++)
страница не загружается. Почему это не нравится цикл for?
4 ответа
Facelets - это технология представления на основе XML, которая использует XHTML+XML для генерации вывода HTML. XML имеет пять специальных символов, которые обрабатываются синтаксическим анализатором XML:
<
начало тега.>
конец тега."
начало и конец значения атрибута.'
альтернативное начало и конец значения атрибута.&
начало объекта (который заканчивается;
).
В случае <
, синтаксический анализатор XML неявно ищет имя тега и конечный тег >
, Однако в вашем конкретном случае вы использовали <
как оператор JavaScript, а не как сущность XML. Это полностью объясняет полученную ошибку разбора XML:
Содержимое элементов должно состоять из правильно сформированных символьных данных или разметки.
По сути, вы пишете код JavaScript в неправильном месте, XML-документ вместо JS-файла, поэтому вы должны соответственно экранировать все специальные символы XML. <
должен быть экранирован как <
,
Так что, по сути,
for (var i = 0; i < length; i++) {
должен стать
for (var i = 0; i < length; i++) {
чтобы сделать его XML-допустимым.
Однако это затрудняет чтение и поддержку кода JavaScript. Как сказано в отличном документе Mozilla Developer Network, пишущем JavaScript для XHTML, вы должны поместить код JavaScript в блок символьных данных (CDATA). Таким образом, в терминах JSF это будет:
<h:outputScript>
<![CDATA[
// ...
]]>
</h:outputScript>
Синтаксический анализатор XML будет интерпретировать содержимое блока как "простые ванильные" символьные данные, а не как XML, и, следовательно, интерпретировать специальные символы XML "как есть".
Но гораздо лучше просто поместить код JS в собственный файл JS, который вы включаете <script src>
или, в терминах JSF, <h:outputScript>
,
<h:outputScript name="functions.js" target="head" />
Таким образом, вам не нужно беспокоиться о специальных символах XML в вашем коде JS.
Смотрите также:
Я наткнулся на этот пост сегодня, так как столкнулся с той же проблемой, и у меня была та же проблема с javascript, не работающим с тегами CDATA, перечисленными выше. Я исправил теги CDATA, чтобы они выглядели так:
<script type="text/javascript">
//<![CDATA[
your javascript code here
//]]>
</script>
Тогда все работало отлично!
Иногда вам понадобится это:
/*<![CDATA[*/
/*]]>*/
и не только это:
<![CDATA[
]]>
У меня остался конфликт git в моем workspace.xml, т.е.
<<<<———————HEAD
что вызвало ошибку неизвестного тега. Немного раздражает то, что он не называет файл.
Я решил это, преобразовав JSP из XHTML в HTML, сделав это в начале:
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
...