首次提交时 JSF 的 h:inputText 的字符集错误(仅限)



在下面的表单中,我们尝试将用户的输入返回到JSF的h:inputText或PrimeFaces的p:inputText。当输入非拉丁字符(日语、希伯来语等)时,我们会经历奇怪的行为:

在第一个请求中,我们得到了无法识别的字符集,但在第二个请求中——我们得到了正确的结果。

输入/输出示例(仅限首次运行):

  1. 日语:输入=日输出=æ¥

  2. 希伯来语:输入=Ş输出=×

JSF:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <body>
        <h:form>   
            <h:outputLabel value="Name:"/>                        
            <h:inputText value="#{newTestController.registeredCustomerFirstName}"/>
            <h:commandButton value="Continue" action="#{newTestController.RegisteredNewCustomer(actionEvent)}"/>
        </h:form> 
    </body>
</html>

Backing Bean:

@ManagedBean(name = "newTestController")
@SessionScoped
public class NewTestController {
    private String registeredCustomerFirstName;
    public String getRegisteredCustomerFirstName() {
        return registeredCustomerFirstName;
    }
    public void setRegisteredCustomerFirstName(String registeredCustomerFirstName) {
        this.registeredCustomerFirstName = registeredCustomerFirstName;
    }
    public void RegisteredNewCustomer(ActionEvent actionEvent) throws Exception {
    }
}

如上所述,需要为应用程序服务器定义默认字符集。

对于玻璃鱼:将<parameter-encoding default-charset="UTF-8" />添加到glassfish-web.xml

对于其他应用程序服务器,请参阅BalusC关于此问题的博客。

这与<http://java.net/jira/browse/GLASSFISH-18007>。这个修复是为了防止当我们无条件地将编码设置为UTF-8时出现警告消息,这似乎是我们想要的,但在这种情况下,我们觉得不这样做更安全

我在Mojarra创建了一个相关的问题,<http://java.net/jira/browse/JAVASERVERFACES-2217>。一句话:在应用程序配置中明确设置编码是正确的解决方案。实施已经在做正确的事情。

在配置文件中指定字符集可能不够。请尝试使用p:commandButton而不是h:commandButton。默认情况下,p:commandButton使用ajax,而h:commandButton则执行非ajax提交。

最新更新