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 2

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> в Tomcat server.xml в UTF-8.

    <Connector ... URIEncoding="UTF-8">
    
  • В Glassfish вам нужно добавить <parameter-encoding> к /WEB-INF/glassfish-web.xml:

    <parameter-encoding default-charset="UTF-8" />
    

Что касается "разбора" (на самом деле, "кодирование" - правильный термин) пространства с +, я не уверен, почему вы указал на это, но это просто так, как должны быть закодированы пробелы в строках URL-запросов. Я думаю, что вы ожидали, что это будет %20, но это только то, как должны быть закодированы пробелы в иерархической части URL (часть перед строкой запроса, которая разделена ?).