JSF2 h: outputLink не будет кодировать должным образом
Использование Mojarra 2.1.7
Код
<h:outputLink value="index.jsf">Login page
<f:param name="test" value="! åöä"></f:param>
</h:outputLink>
Вывод: индекс.в JSF?тест=%21+åöä
Некоторые символы были экранированы, но другие нет. очевидно, очень трудно справиться.
Почему это так и знает ли кто-нибудь хороший способ справиться с этим?
Http://docs.oracle.com/javase/6/docs/api/java/net/URLEncoder.html
, по-видимому, используется, так как он анализирует пространство с помощью +.
Все остальные символы небезопасны и сначала преобразуются на один или больше байтов, использующих какую-то схему кодирования. Затем каждый байт представляется 3-символьной строкой "%xy", где xy-двузначная шестнадцатеричная представление байта. Рекомендуемая схема кодирования для использования: УТФ-8. Однако по соображениям совместимости, если кодировка не является указывается, затем используется кодировка платформы по умолчанию.
Благодарен за ответы
1 ответ:
Не путаете ли вы сгенерированный JSF HTML-код с тем, что вы видите в строке состояния или адресной строке браузера? Конечно, он уже полностью закодирован URL в сгенерированном HTML-коде. Я только что сделал быстрый тест и в соответствии с View Source в браузере он сгенерировал (предполагая, что вы не изменили кодировку ответа по умолчанию JSF2/Facelets UTF-8) следующий фрагмент HTML:
<a href="index.jsf?test=%21+%C3%A5%C3%B6%C3%A4">Login page</a>
Но действительно, Chrome и Firefox показывают
index.jsf?test=%21+åöä
в строке состояния браузера, когда вы наведите указатель мыши на ссылку, а также в адресной строке при нажатии на ссылку. Это просто особенность браузера, которая является совершенно другим вопросом.Я не уверен, в чем конкретно заключается ваша проблема, поскольку вы ничего не сказали об этом, но то, как вы задали вопрос, создает у меня впечатление, что URL-адрес запроса неправильно расшифрован соответствующим сервлетконтейнером, и поэтому вы получили mojibake при обращении к параметру запроса.
Как вы могли бы теперь догадались, это должно быть решена в servletcontainer сторону. Также неясно, какой из них вы используете, поэтому вот несколько примеров для Tomcat и Glassfish:
В Tomcat вам нужно установить атрибут
URIEncoding
элемента<Connector>
в Tomcatserver.xml
вUTF-8
.<Connector ... URIEncoding="UTF-8">
В Glassfish вам нужно добавить
<parameter-encoding>
к/WEB-INF/glassfish-web.xml
:<parameter-encoding default-charset="UTF-8" />
Что касается "разбора" (на самом деле, "кодирование" - правильный термин) пространства с
+
, я не уверен, почему вы указал на это, но это просто так, как должны быть закодированы пробелы в строках URL-запросов. Я думаю, что вы ожидали, что это будет%20
, но это только то, как должны быть закодированы пробелы в иерархической части URL (часть перед строкой запроса, которая разделена?
).