【问题标题】:How to hold japanese characters in SPRING MVC POJO's field如何在 SPRING MVC POJO 的字段中保存日文字符
【发布时间】:2012-01-30 10:37:46
【问题描述】:

我正在使用构建 Web 应用程序

  1. Spring MVC
  2. Spring 安全性
  3. 休眠
  4. MySQl

我想为我的应用程序添加国际化支持。例如我想使用 Hibernate 将日文字符存储和检索到 mySQL db。

我已将 DB charset 设置为 UTF-8 并将属性添加到 hibernate-cfg.xml

属性名称="hibernate.connection.characterEncoding">UTF-8

我已经完成了简单的 POC,在其中从 java 文件中,我可以用日文字符声明一些字符串变量,并且它们已成功插入数据库,并且日文字符搜索也可以正常工作。

但是当我在 JSP 文件上填写表单时,所有字段值都以 POJO 的形式传递给控制器​​,并且 POJO 字段中的所有日语字符都自动转换为数字字符引用,如下例所述,

CreateUser.jsp

<form:form method="post" commandName="userModel">
    <%@include file="/tp/web/iBusinessException.jsp"%>
    <table width="700" border="0" align="center" cellpadding="4"
        cellspacing="0">
        <tr>
            <td class="tdWscHeading">
                <img
                    src="<%=request.getContextPath()%>/tp/web/console/include/images/iconCreateuser.gif"
                    alt="Task Summary" width="20" height="20" align="absmiddle">
                <spring:message code='label.createuser'></spring:message>
            </td>
        </tr>
    </table>
    <table width="700" border="0" align="center" cellpadding="4"
        cellspacing="1" class="tableWscmain">
        <tr>
            <td width="250" class="tdWscContent fontBold">
                <spring:message code='label.firstname'></spring:message>
                <span class="fontRed"> *</span>
            </td>
            <td class="tdWscContent">
                <form:input path="firstname" cssClass="formINPUT"
                    autocomplete="off" />
                <!-- Error Message if Key is Empty Starts -->

                <span class="error"> <spring:bind path="firstname">
                        <c:if test="${not empty status.errorMessage}">
                            <c:out value="${status.errorMessage}" escapeXml="false" />
                        </c:if>
                    </spring:bind> </span>
                <!-- Error Message if key is Empty Ends -->
            </td>
        </tr>
        <tr>
            <td class="tdWscContent fontBold">
                <spring:message code='label.lastname'></spring:message>
                <span class="fontRed"> *</span>
            </td>
            <td class="tdWscContent">
                <form:input path="lastname" cssClass="formINPUT"
                    autocomplete="off" />
                <!-- Error Message if Key is Empty Starts -->
                <span class="error"> <spring:bind path="lastname">
                        <c:if test="${not empty status.errorMessage}">
                            <c:out value="${status.errorMessage}" escapeXml="false" />
                        </c:if>
                    </spring:bind> </span>
                <!-- Error Message if key is Empty Ends -->
            </td>
        </tr>
        <tr>
            <td class="tdWscContent fontBold">
                <spring:message code='label.username'></spring:message>
                <span class="fontRed"> *</span>
            </td>
            <td class="tdWscContent">
                <form:input path="username" cssClass="formINPUT"
                    autocomplete="off" />
                <!-- Error Message if Key is Empty Starts -->
                <span class="error"> <spring:bind path="username">
                        <c:if test="${not empty status.errorMessage}">
                            <c:out value="${status.errorMessage}" escapeXml="false" />
                        </c:if>
                    </spring:bind> </span>


                <!-- Error Message if key is Empty Ends -->
            </td>
        </tr>
        <tr>
            <td class="tdWscContent fontBold">
                <spring:message code='label.password'></spring:message>
                <span class="fontRed"> *</span>
            </td>
            <td class="tdWscContent">
                <form:password path="password" cssClass="formINPUT"
                    autocomplete="off" showPassword="false" />
                <!-- Error Message if Key is Empty Starts -->
                <span class="error"> <spring:bind path="password">
                        <c:if test="${not empty status.errorMessage}">
                            <c:out value="${status.errorMessage}" escapeXml="false" />
                        </c:if>
                    </spring:bind> </span>
                <!-- Error Message if key is Empty Ends -->
            </td>
        </tr>
        <tr>
            <td class="tdWscContent fontBold">
                <spring:message code='label.email'></spring:message>
                <span class="fontRed"> *</span>
            </td>
            <td class="tdWscContent">
                <form:input path="email" cssClass="formINPUT"
                    autocomplete="off" />
                <!-- Error Message if Key is Empty Starts -->
                <span class="error"> <spring:bind path="email">
                        <c:if test="${not empty status.errorMessage}">
                            <c:out value="${status.errorMessage}" escapeXml="false" />
                        </c:if>
                    </spring:bind> </span>
                <!-- Error Message if key is Empty Ends -->
            </td>
        </tr>

        <tr>
            <td class="tdWscContent fontBold">
                <spring:message code='label.groupname'></spring:message>
                <span class="fontRed"> *</span>
            </td>
            <td class="tdWscContent">
                <select id="groupname" name="groupname">
                    <c:forEach items="${GROUPS_LIST_RESULT}" var="option">
                        <option value='<c:out value="${option.groupname}" />'>
                            <c:out value="${option.groupname}" />
                        </option>
                    </c:forEach>
                </select>
                <!-- Error Message if Key is Empty Starts -->
                <span class="error"> <form:errors path="groupname"></form:errors>
                </span>
                <!-- Error Message if key is Empty Ends -->
            </td>
        </tr>

        <tr align="center">
            <td colspan="2" class="tdWscContent fontBold">
                <input type="submit" name=""
                    value="<spring:message code="label.createuser"></spring:message>">
            </td>
        </tr>
    </table>
</form:form>

我的控制器

@RequestMapping(value = USERADMINISTRATION_NAMESPACE + "/createUser.do", method = RequestMethod.POST)
public ModelAndView submitCreateUserPage(
        @ModelAttribute("userModel") User user, BindingResult result

) throws UserAlreadyExistsException {
    String password = "";
    password = user.getPassword();

/* Here , password i am getting like **&#164;** ,  */
/* I want exactly same Japanese characters as entered by user */
}

我的应用程序中没有使用任何字符编码过滤器。

从 jsp 到 controller ,会自动转换成上面这样的数字.. 我想要用户在 jsp 中输入的完全相同的日文字符,并希望将相同的日文字符插入数据库并显示在页面上。

我将所有用户输入字段的值作为 POJO 从 JSP 传递到控制器。

请帮忙...

【问题讨论】:

    标签: spring-mvc internationalization pojo


    【解决方案1】:

    最后,我成功地在基于 Spring MVC 的应用程序中实现了国际化支持......

    我按照以下步骤使用 Spring MVC、Hibernate、MYSQL 或 Oracle 数据库以及 Jboss 或 webLogic 作为应用程序服务器将国际化支持整合到我的 Web 应用程序中。

    假设我们要添加对日语的国际化支持。即用户应该能够在 Web 表单中输入日语字符,并且应该以与用户输入的格式相同的格式保存,并且应该在网页上以相同的语言显示.

    按照以下步骤操作。

    1. 确保在操作系统中安装了日语支持(特定于区域的安装)。如果没有,请安装它。

    2. 如果您使用任何 IDE,请通过将 文本编码更改为 UTF-8 来配置 IDE 以支持日语。例如,如果您使用的是我的 Eclipse,则将文本文件编码更改为 UTF-8。您可以通过此路径进行更改(Window->Preference->General->Workspace)

    3. 将 Spring 框架内置的字符编码过滤器作为过滤器链 (web.xml) 中的第一个过滤器,以确保它在请求处理期间首先运行并在响应处理期间最后运行

    web.xml

    <filter>  
        <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <!-- set forceEncoding to true if you want to override encoding of servlet -->
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value> 
    </init-param>
    

    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    4 通过在 JSP 顶部添加以下代码,将 JSP 页面编码设置为 UTF-8。

    <%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    

    5 通过将以下属性添加到 hibernate-cfg.xml 将 Hibernate 连接编码方案设置为 UTF-8

    <property name="hibernate.connection.characterEncoding">UTF-8</property>
    

    注意:如果使用 JBoss 应用服务器,请确保您已将 characterEncoding=UTF-8 附加到数据库服务配置文件中的 connection-url (例如 mysql-ds.xml 用于 mySQL 数据库)如下所述。

    <datasources>
    
    <local-tx-datasource>
    
        <jndi-name>WSCDS</jndi-name>
    
       <connection-url>
       jdbc:mysql://{ipaddress}:{port}/{database_name}?characterEncoding=UTF-8
       </connection-url>
    
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    
    <user-name>{username}</user-name>
    
    <password>{password}</password>  
    
    <metadata>
    
       <type-mapping>mySQL</type-mapping>
    
    </metadata>
    

    【讨论】:

      【解决方案2】:

      您需要使用字符编码过滤器。 Spring 框架有一个内置的字符编码过滤器。 (见here) 只需将其放在您的 web.xml 中:

      <filter>
          <filter-name>encodingFilter</filter-name>
          <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
          <init-param>
              <param-name>encoding</param-name>
              <param-value>UTF-8</param-value>
          </init-param>
          <init-param>
              <!-- set forceEncoding to true if you want to override encoding of servlet -->
              <param-name>forceEncoding</param-name>
              <param-value>true</param-value> 
          </init-param>
      </filter>
      

      将此过滤器放在过滤器链的第一位,以确保它在请求处理期间首先运行,在响应处理期间最后运行。

      【讨论】:

        【解决方案3】:

        您已经提到,您没有使用任何字符过滤器。请尝试在web.xml 中添加一个。据我所知,这是能够正确处理 UTF-8 的必要条件。

        【讨论】:

          猜你喜欢
          • 2012-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-25
          • 1970-01-01
          • 2011-04-11
          相关资源
          最近更新 更多