Ошибка синтаксического анализа XHTML: содержимое элементов должно состоять из правильно сформированных символьных данных или разметки

В качестве расширения этого вопроса я пытаюсь вставить Javascript в <h:commandButton />"s onclick собственность как action уже рендеринг таблицы AJAX.

Что я хочу сделать: получить выбранные элементы в списке и превратить их в параметры для использования в JSF FileServlet, т.е. para2=value1&param=value2&param=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 + "&amp;";
            }
        } 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. < должен быть экранирован как &lt;,

Так что, по сути,

for (var i = 0; i < length; i++) {

должен стать

for (var i = 0; i &lt; 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>
...
Другие вопросы по тегам