【问题标题】:JSF2 Form to DB special characters handlingJSF2 表单到数据库特殊字符处理
【发布时间】:2012-06-14 08:35:47
【问题描述】:

我有最简单的 JSF2 表单,可以在 MySQL 数据库中插入一个表字段。

我的 facelet 顶部有 <?xml version="1.0" encoding="UTF-8"?>

我的输入类似于<h:inputText value="#{testController.entity.test}" id="test" />

所以我尝试在我的 Jpa2/Hibernate 实体中插入“provà”。然后我坚持它,当我在我的 MySQL 数据库中查找保存的值时......

我找到“provÔ。这是我总是通过尝试和尝试来解决的老编码问题......

你能建议我先检查什么来修复它吗?

我的意思是,我知道这个问题缺乏信息,我只是想看看你问我什么:在你的问题中我会找到答案! :)

【问题讨论】:

  • 不应该在 h:form 属性中编码编码吗? xml 用于 .xml 文件本身

标签: java mysql jsf encoding jsf-2


【解决方案1】:

我的 facelet 顶部有 <?xml version="1.0" encoding="UTF-8"?>

这与问题无关。这只会告诉 XML 解析器在读取 XML 文件内容时使用哪个字符集,然后再将其解析为基于树的层次结构。

您的具体问题可能有 2 个可能的原因:

  1. HTTP 请求字符编码设置不正确。然而,这不是正常情况,因为默认情况下 JSF/Facelets 已经在所有层中使用 UTF-8。但是,只要在 JSF/Facelets 设置正确的字符编码之前,有其他东西访问了 HTTP 请求正文,就会出现此问题。众所周知,PrimeFaces 3.x 可以做到这一点。另见Unicode input retrieved via PrimeFaces input components become corrupted。解决此问题的方法之一是创建一个类似于UTF-8 form submit in JSF is corrupting data 的过滤器。

  2. JDBC 连接字符编码设置不正确。 MySQL JDBC 驱动程序使用客户端平台默认字符编码而不是服务器表字符编码。确保您的 MySQL JDBC URL 如下所示:

    jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
    

【讨论】:

  • 我现在再次尝试使用 h:form acceptcharset="UTF-8"... 什么也没有。我排除了 opt.2,因为我只是在控制器中记录了错误的输入,实际上没有数据库访问。 PrettyFaces 和它有什么关系吗?
  • 我根本不建议使用acceptcharset。这确实不会解决您的问题。是别人提出了错误的建议。如果输入在日志中已经无效,那么它是原因 #1。只需创建该过滤器。
  • 成功了!但是……这该死的丑陋!为什么我必须创建一个过滤器???可能是因为我使用 PrimeFaces 上传过滤器进行文件上传,使用 PrettyFaces 进行 url 重写。在您看来,我如何才能发现原因?
  • 在我的回答的第一个链接中回答了。
【解决方案2】:

尝试将 h:form acceptcharset="UTF-8" 放入您的 xhtml(为我工作):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多