1

我在尝试通过 JSF 和 Hibernate 将中文字符串输入并保存到 MySQL 时遇到问题。

实际上,我使用“System.out.print”并检测到出现乱码,在 JSF 输入字段中输入我(我)之后但在保存到数据库之前。以下是部分代码:index.xhtml

<?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">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:panelGrid columns="2">
                <h:outputText value="Input"/>
                <h:inputText value="#{showBean.input}" />
            </h:panelGrid>
            <h:commandLink action="#{showBean.show()}" value="Show"/>

        </h:form>
    </h:body>
</html>

ShowBean.java

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class showBean {
    String input;
    public showBean() {
        input = null;
    }

    public String getInput() {
        return input;
    }

    public void setInput(String input) {
        System.out.println("set input " + input);
        this.input = input;
    }

    public String show(){
        System.out.println("show input " + input);
        return "";
    }
}

控制台输出是:set input ???è??è???????è??è?????? 显示输入 ???è??è?????è??è??????

4

2 回答 2

0

如果您确实在使用 Facelets(默认使用 UTF-8)并且没有使用 PrimeFaces ajax(已知会混淆请求正文编码),那么您的问题有两个原因:

  1. MySQL JDBC 驱动程序字符编码未设置为 UTF-8。这导致数据库中出现乱码。

  2. Eclipse 控制台字符编码未设置为 UTF-8。这导致System.out.

解决方案是:

  1. 向 JDBC 连接添加useUnicode=yes和参数。characterEncoding=UTF-8您可以将其指定为 JDBC URL 中的查询字符串

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

    或作为 JDBC 数据源中的连接属性,与您指定用户名、密码等的方式完全相同。

  2. 通过Window > Preferences > General > Workspace > Text File Encoding告诉 Eclipse 使用 UTF-8 作为控制台编码:

    在此处输入图像描述

也可以看看:

于 2012-12-18T20:25:21.967 回答
0

如果您使用 glassfish,只需将以下代码添加到 glassfish-web.xml

<glassfish-web-app>
   <parameter-encoding default-charset="UTF-8" />
</glassfish-web-app>
于 2014-12-09T09:15:35.753 回答