如何在SPRING MVC POJO的字段中保留日语字符


问题内容

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

  1. spring MVC
  2. Spring safety
  3. Hibenate
  4. MySQl

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

我已经将数据库字符集设置为 UTF-8,* 并且还向 hibernate-cfg.xml 添加了属性 *

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

我已经完成了简单的POC,其中可以从java文件中声明一些带有日语字符的字符串变量,并将它们成功插入DB中,并且通过日语字符搜索也可以正常工作。

但是当我在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中输入的日语字符完全相同,并希望将其插入DB并显示在页面上。

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

请帮忙…


问题答案:

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

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

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

请遵循以下步骤。

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

  2. 如果使用任何IDE,请通过将 文本编码 更改 为UTF-8来 配置IDE以支持日语。例如,如果您使用的是Eclipse,则将文本文件编码更改为UTF-8。您可以通过此路径进行更改(“窗口”->“首选项”->“常规”->“工作区”)

  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数据库mysql-ds.xml ),如下所述。

<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>