<h:form> <h:inputText value="#{user.input}"> <f:validator validatorId="validator.InputValidator" /> </h:inputText> <h:commandButton action="someaction" value="submit"> </h:commandButton> <h:messages layout="table"></h:messages> </h:form>
解决方法
首先,如果您仍在使用旧JSP而不是其后继Facelets,那么您需要将页面编码设置为UTF-8.把它放在每个JSP的顶部:
<%@page pageEncoding="UTF-8" %>
或者在web.xml中全局配置它:
<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <page-encoding>UTF-8</page-encoding> </jsp-property-group> </jsp-config>
如果您使用的是Facelets,则无需执行任何操作.它默认使用UTF-8作为响应编码.
其次,如果您从.properties文件中获取消息,则需要了解默认情况下这些文件是使用ISO-8859-1读取的.另见java.util.Properties
javadoc:
.. the input/output stream is encoded in ISO 8859-1 character encoding. Characters that cannot be directly represented in this encoding can be written using Unicode escapes ; only a single ‘u’ character is allowed in an escape sequence. The
native2ascii
tool can be used to convert property files to and from other character encodings.
因此,您需要在Unicode escape sequences之前记下ISO-8859-1范围之外的字符.代替
some.dutch.text = Één van de wijken van Curaçao heet Saliña.
你需要写
some.dutch.text = \u00c9\u00e9n van de wijken van Cura\u00e7ao heet Sali\u00f1a.
这可以通过使用native2ascii工具自动完成.
作为一个完全不同的替代方案,您可以使用自定义Control
为JSF提供自定义ResourceBundle
实现,该自定义Control
使用UTF-8读取文件.这在this answer和this blog中进行了更详细的扩展.只有在您自己提供验证消息时才会起作用,例如requiredMessage,而不是覆盖JSF默认验证消息.除此之外(即你需要< message-bundle>文件),那么你真的需要使用native2ascii工具.
也可以看看: