Не удается прочитать акцентированный символ из строки запроса
Я устанавливаю значение из queryString в свойство managedBean с помощью <f:viewParam>
. Если я печатаю значение свойства, оно нормально работает для нормального символа. Но когда queryString содержит акцентированные символы, после установки значения в свойстве managedBean, если я печатаю значение этого свойства, акцентированные символы не отображаются должным образом.
Ниже приведен фрагмент кода.xhtml:
<f:metadata>
<f:viewParam id="requestString" name="requestString" value="#{aproveOrDenyController.requestString}" />
</f:metadata>
ManagedBean:
@ManagedBean(name = "aproveOrDenyController")
@ViewScoped
public class AproveOrDenyController extends BaseWebController implements Serializable
{
private String requestString;
public final String getRequestString() {
return requestString;
}
public final void setRequestString(String requestString) {
this.requestString = requestString;
System.out.println(this.requestString);
}
}
Если строка запроса содержит...&requestString=abcdefgh&....., то она печатает abcdefgh
правильно. Но если строка запроса содержит...&requestString=SociétéGéniale&.., то она печатает SociétéGéniale
, Но я хочу SociétéGéniale
, Любой указатель будет очень полезен для меня.
Edit-1 сгенерированная ошибка:
19:52:49,594 ERROR [org.jboss.as.server] JBAS015956: Caught exception during boot: org.jboss.as.controller.persistence.ConfigurationPersistenceException: JBAS014676: Failed to parse configuration
at org.jboss.as.controller.persistence.XmlConfigurationPersister.load(XmlConfigurationPersister.java:141) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.ServerService.boot(ServerService.java:266) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.controller.AbstractControllerService$1.run(AbstractControllerService.java:155) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_10]
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[8,5]
Message: JBAS014789: Unexpected element '{urn:jboss:domain:1.2}extensions' encountered
at org.jboss.as.controller.parsing.ParseUtils.unexpectedElement(ParseUtils.java:85) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.parsing.StandaloneXml.readServerElement_1_1(StandaloneXml.java:351) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.parsing.StandaloneXml.readElement(StandaloneXml.java:127) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.parsing.StandaloneXml.readElement(StandaloneXml.java:100) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.staxmapper.XMLMapperImpl.processNested(XMLMapperImpl.java:110) [staxmapper-1.1.0.Final.jar:1.1.0.Final]
at org.jboss.staxmapper.XMLMapperImpl.parseDocument(XMLMapperImpl.java:69) [staxmapper-1.1.0.Final.jar:1.1.0.Final]
at org.jboss.as.controller.persistence.XmlConfigurationPersister.load(XmlConfigurationPersister.java:133) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
... 3 more
2 ответа
Декодирование строк запроса URI управляется контейнером сервлетов (Tomcat, JBoss, Glassfish и т. Д.). Это часто имеет значение по умолчанию ISO-8859-1. Вам необходимо настроить набор символов для декодирования строки запроса в контейнере сервлетов так, чтобы он использовался JSF/Facelets для кодирования ответов и запросов POST, что по умолчанию является UTF-8. В вашем случае кодировка строки запроса, по-видимому, использует стандарт по умолчанию ISO-8859-1. é
символ существует в кодировке UTF-8 двух байтов 0xC3
а также 0xA9
которые в свою очередь представляют в ISO-8859-1 кодировку символов Ã
а также ©
именно персонажи, которых вы видите. Это подтверждает, что ISO-8859-1 неправильно использовался вместо UTF-8.
Поскольку вы используете JBoss AS, вам нужно добавить следующую запись в <server>
из JBoss' /standalone/configuration/standalone.xml
между <extensions>
а также <management>
в:
<system-properties>
<property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true" />
</system-properties>
Это проинструктирует JBoss использовать ServletRequest#getCharacterEncoding()
декодировать строку запроса вместо кодировки по умолчанию ISO-8859-1. Если это все еще не работает (что может случиться, когда вы используете PrimeFaces), то вам нужно в дополнение к вышеупомянутой записи конфигурации явно установить кодировку символов в UTF-8, а также использовать фильтр сервлета. На эту часть дан ответ в решении 1 ввода Unicode, полученного через компоненты ввода PrimeFaces, повреждены.
Другой возможной причиной является то, что выходной адресат, где System.out.println()
заканчивает тем, что не использует UTF-8 для представления напечатанных символов. Это, в свою очередь, совершенно не связано с JSF и контейнером сервлетов. Вы также ничего не сказали о контексте System.out.println()
работает, поэтому здесь сложно дать подходящий ответ. Но если бы это был, например, Eclipse, то вы могли бы настроить его, установив Window > Preferences > General > Workspace > Encoding для текстовых файлов в UTF-8.
Смотрите также:
В дополнение к предыдущему ответу вы можете попробовать добавить:
<system-properties>
<property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/>
<property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true" />
</system-properties>
в файл конфигурации standalone.xml.