2010-03-19 138 views
3

我使用Spring MVC + Hibernate应用程序,使用MySQL(ver.5.0.51a)和InnoDB引擎。Spring MVC + Hibernate编码问题

当我使用西里尔文字符发送表单时出现问题。因此,数据库包含未知编码中的无意义字符。

所有JSP页面,使用UTF-8创建的数据库(+表和字段)。 Hibernate配置还包含将编码设置为UTF-8的属性。

我已经通过创建使用UTF-8编码请求内容的过滤器来解决此问题。 示范代码:

… 
encoding = "UTF-8"; 
request.setCharacterEncoding(encoding); 
chain.doFilter(request, response); 
… 

但它明显减慢的应用程序。

有趣的是,直接从应用程序执行插入查询(即从Eclipse作为Java应用程序运行)是完美的。

UPD。

据我所知,使用过滤器是我的情况下唯一的工作解决方案。

我不知道标准的CharacterEncodingFilter。现在使用它,效果很好!

<filter> 
    <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name> 
    <url-pattern>*</url-pattern> 
</filter-mapping> 
+0

像这样改变请求对象中的字符编码应该*不*对应用程序的速度有明显影响。还有什么其他的必须进行 – 2010-03-19 01:17:55

+0

你有没有可能声明'doFilter()'方法是'syncrhonized'? – Bozho 2010-03-19 06:24:37

回答

3

你的JSP文件必须在两个方面是UTF-8:

  • <%@page pageEncoding="UTF-8" %>
  • 他们的内容 - right-click > properties在日食,使他们的编码UTF-8中(可以拒绝转换,所以当前内容,改变编码,然后将其粘贴回)

然后弹簧具有这种情况下的CharacterEncodingFilter,它不应该有任何显著绩效Ë击:

<filter> 
    <filter-name>CharacterEncodingFilter</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> 

其实,没有过滤器应具有显著的性能影响,除非其doFilter()方法声明​​。

+0

@Bozko。我在页眉和页面都使用了UTF-8。 doFilter()方法不包含关键字«synchronized»。看起来减速只是我的主观看法。 CharacterEncodingFilter工作正常!谢谢。 – 0x2D9A3 2010-03-19 10:10:19

+0

-1表示“如果这不起作用”。如果你的页面不是'ISO-8859-1'(在浏览器端),你必须使用'CharacterEncodingFilter'来正确处理非us-ascii输入(除非你的servlet容器违反了servlet规范,比如Jetty)。 – axtavt 2010-03-19 14:13:34

+0

@axtavt我修复了那个微小的细节。 – Bozho 2010-03-19 14:40:36

2

这是你的价格做了正确的编码转换:UTF-8(要求) - > UTF-16(爪哇) - > UTF-8(DB)。

我会很惊讶,但如果它(改造)花费超过百分之几的整体请求时间。如果确实如此,有什么事情做错了恕我直言。

所有JSP页面...创建使用UTF-8

请问您的集装箱集UTF-8编码的页面? (请参阅生成的页面属性)。如果是这样,你不需要设置过滤器,浏览器会以UTF-8格式提交表单。

+0

浏览器在提交表单时通常不会发送编码,而servlet容器假定它是“ISO-8859-1”,所以在这种情况下过滤器是唯一正确的解决方案。 – axtavt 2010-03-19 00:52:21

+0

生成的页面包含行 但是,正如我所提到的,没有过滤器没有成功。 如果您认为转型过程比较先进,那么在这种情况下更好的解决方案是什么? – 0x2D9A3 2010-03-19 01:36:02

+0

浏览器发送编码 - 与页面原始编码相同,或UTF-8。否则,我们非拉丁裔人会如何提交可怜的多字节表单? :D – 2010-03-20 00:45:38