使用Spring MVC编码问题

时间:2010-06-02 14:10:34

标签: spring spring-mvc

我有一个创建用户的演示Web应用程序。当我尝试以其他语言(如法语)插入数据时,字符编码不正确。控制器上的代码是:

@SuppressWarnings("unchecked")
    @RequestMapping(value = "/user/create.htm", params={"id"}, method = RequestMethod.GET)
    public String edit(@RequestParam("id") Long id, ModelMap model) {
        System.out.println("id is " + id);
        User user = userService.get(id);

        model.put("user", user);
        return "user/create";
    }

    @RequestMapping(value = "/user/create.htm", method = RequestMethod.POST)
    public String save(@ModelAttribute("user") User user, BindingResult result) {

        System.out.println(user.getFirstName());
        System.out.println(user.getLastName());


        validator.validate(user, result);
        if(result.hasErrors()) {
            return "user/create"; 
        }

        userService.save(user);
        return "redirect:list.htm";
    }

我的web.xml是:

...

    <filter>
        <filter-name>encoding-filter</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>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>

    </filter>

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

...

,页面是:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

...

<form:form method="post" commandName="user">

...

<form:input path="firstName" cssErrorClass="form-error-field"/>

...

当我在名字中输入一些法语字符时,system.out.println的输出是????+?????或类似的东西。

我看到其他人用CharacterEncodingFilter修复此问题,但这似乎不起作用。

非常感谢。

编辑过滤器值。

6 个答案:

答案 0 :(得分:11)

尝试将CharacterEncodingFilter作为web.xml中的第一个过滤器。

我意识到这个问题有点陈旧,但我遇到了同样的问题,并且移动了CharacterEncodingFilter为我修复了它。

答案 1 :(得分:7)

如果这仍然无效并且您使用Tomcat作为应用程序服务器,请尝试在<Connector>中的每个server.xml元素上设置以下选项:

<Connector URIEncoding="UTF-8" ...>
    ...
</Connector>

这对我有用。其他应用程序服务器可能有类似的选项,因此您可能需要检查服务器文档。

答案 2 :(得分:2)

也许我错过了一些东西,但如果你的JSP中的页面编码是“UTF-8”,那么你的CharacterEncodingFilter中的编码不应该是UTF-8而不是ISO-8859-7吗?

答案 3 :(得分:1)

您需要在表单中添加accept-charset =“UTF-8”。

答案 4 :(得分:0)

System.out.println()的输出取决于控制台编码,因此它不是调试编码问题的好方法。

要检查您的值是否已正确解码,您应该在另一个页面上显示它。实际上,在表单验证失败的情况下已经完成,因此如果验证错误后字段中的值保持不变,则系统可以正常工作。

答案 5 :(得分:0)

有两件事可以提供帮助:

  1. setenv.sh文件中添加JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8"
  2. 在启动tomcat进程的脚本中,设置LANG环境:export LANG='utf-8'
  3. 然后可以通过检查默认字符集来测试它:Charset.defaultCharset()