我有一些用户输入验证的代码
<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>
它工作正常,但如果用户输入无效,我需要显示一些UTF-8消息,
我怎么能这样做?
答案 0 :(得分:18)
我认为您当前的问题是ISO-8859-1范围之外的字符显示为mojibake。这是真的?我想不出提出这个微不足道的问题的另一个原因。是?然后预读:
首先,如果您仍在使用旧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:
..输入/输出流以ISO 8859-1字符编码进行编码。无法在此编码中直接表示的字符可以使用Unicode转义编写;在转义序列中只允许一个'u'字符。
native2ascii
工具可用于将属性文件转换为其他字符编码或从其他字符编码转换。
因此,您需要通过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
工具自动执行此操作。
作为一个完全不同的替代方案,您可以为JSF提供一个自定义ResourceBundle
实现,其自定义Control
使用UTF-8读取文件。在this answer和this blog中详细介绍了这一点。这仅适用于您自己提供验证消息的情况,例如requiredMessage
而不是覆盖JSF默认验证消息。除此之外(即你需要<message-bundle>
个文件),那么你真的需要使用native2ascii
工具。