Почему амперсанды (&) должны быть закодированы в JSF? Есть ли способ обойти это?
У меня часто есть Javascript на моих страницах JHF XHTML, где есть && в которой я в конечном итоге должен быть закодирован как &&
Например, когда я помещаю следующее в файл страницы JSF XHTML:
I am an & sign
Я получаю сообщение об ошибке:
The entity name must immediately follow the '&' in the entity reference
Один из способов исправить это, по-видимому, состоит в изменении "&" до &
, который я нахожу нежелательным только для написания "&".
Также представляется, что для случаев, когда я использую '&' в Javascript я могу обернуть Javascript в тегах CDATA; когда они завернуты в теги CDATA, я могу написать "&" без необходимости избегать его как &
, что является хорошим обходным путем, чтобы иметь более читаемый код Javascript на моей странице.
Но что происходит, когда я хочу использовать литерал '&' в другом месте на странице, когда он не находится в тегах <script>
, и поэтому не может так легко обернуть код в тегах CDATA? Должен ли я всегда избегать "&" как &
для этих случаев?
Заметьте, пытаясь использовать возможность избежать значений и, похоже, не в состоянии решить проблему.
Ответы
Ответ 1
Facelets - это технология просмотра на основе XML. Любые символы, которые имеют особое обращение с помощью парсера XML, должны быть экранированы XML, когда намерение представляет их буквально. Это охватывает, среди прочих, <
и &
. <
указывает начало XML-тега, например, <foo>
, а &
указывает начало XML-объекта, такого как &
. <
должен быть экранирован как <
и &
как &
.
Отсутствие их в Facelets приведет к следующему исключению для <
javax.faces.view.facelets.FaceletException: Анализ ошибок /test.xhtml: Ошибка Traced [строка: 42] Содержимое элементов должно состоять из хорошо сформированных символьных данных или разметки.
и следующий для &
javax.faces.view.facelets.FaceletException: анализ ошибок /test.xhtml: ошибка. Трассировка [строка: 42] Имя объекта должно немедленно следовать за символом '&' в ссылке на объект.
Это не связано конкретно с JavaScript, это относится ко всему виду, включая "обычный текст". Этими персонажами также являются операторы JavaScript. Невозможно обойти это, просто указать XML. Однако в JavaScript есть еще один способ избежать экранирования или использования блоков CDATA: просто поместите этот JS-код в свой собственный .js
файл, который вы загружаете с помощью <script>
или <h:outputScript>
.
В EL существует также оператор &&
, который также должен быть экранирован как &&
, но, к счастью, там есть псевдоним для этого оператора, оператор and
.
См. также:
Ответ 2
Это потому, что и есть специальные символы в XML: http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
Ответ 3
FYI, я попытался написать символ (c) на моей странице JSF.
Ошибка была поднята, когда я написал & copy: "копия ссылается, но не объявлена"
Когда я написал & copy; Я получил исходную строку.
Я могу отобразить специальный символ, используя нотацию Unicode: ©
Ответ 4
Этот код работал у меня:
<h:outputText value="&copy;" escape="false" />