Почему амперсанды (&) должны быть закодированы в 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? Должен ли я всегда избегать "&" как &amp; для этих случаев?

Заметьте, пытаясь использовать возможность избежать значений и, похоже, не в состоянии решить проблему.

Ответ 1

Facelets - это технология просмотра на основе XML. Любые символы, которые имеют особое обращение с помощью парсера XML, должны быть экранированы XML, когда намерение представляет их буквально. Это охватывает, среди прочих, < и &. < указывает начало XML-тега, например, <foo>, а & указывает начало XML-объекта, такого как &#38;. < должен быть экранирован как &lt; и & как &amp;.

Отсутствие их в 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 существует также оператор &&, который также должен быть экранирован как &amp;&amp;, но, к счастью, там есть псевдоним для этого оператора, оператор and.

См. также:

Ответ 3

FYI, я попытался написать символ (c) на моей странице JSF. Ошибка была поднята, когда я написал & copy: "копия ссылается, но не объявлена" Когда я написал & copy; Я получил исходную строку.

Я могу отобразить специальный символ, используя нотацию Unicode: ©

Ответ 4

Этот код работал у меня:

<h:outputText value="&amp;copy;" escape="false" />