Java + Spring MVC + Tomcat + Velocity + MySql и как все это дело подружить с русским языком
Столкнулся я тут как-то с проблемой, чтобы мой проект поддерживал русский язык. Дело то вроде и не хитрое казалось бы, но надо учесть все подводные камни.
Теорию пожалуй опущу, по этому поводу есть отличная статья, которая мне очень помогла в решении проблемы.
Итак, есть у нас некий проект, использующий все вышеупомянутые технологии. Как же все-таки подружить его с русским языком.
Начнем с того, что в первую очередь переведем нашу базу MySQL в кодировку UTF-8, и проверим что-бы все таблицы были в этой кодировке.
Есть такое дело. Далее переводим собственно сами web-файлы в кодировку UTF-8. В данном случае в eclipse (Window -> Preferences)
Дальше прописываем конфиги для request'ов и respons'ов для velocity в Dispatcher-сервлете спринга
<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath"> <value>/</value> </property> <property name="velocityProperties"> <props> <prop key="input.encoding">UTF-8</prop> <prop key="output.encoding">UTF-8</prop> </props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <property name="prefix"> <value>/WEB-INF/velocity/</value> </property> <property name="suffix"> <value>.vm</value> </property> <property name="contentType" value="text/html; charset=UTF-8"/> <property name="dateToolAttribute"><value>dateTool</value></property> </bean>И последний штрих - надо написать фильтр и подключить его в web.ini
package com.ellexdev.sunbay; import java.io.*; import javax.servlet.*; /** * FormEncodingSetterFilter * * @author Eugene Matyushkin */ public class FormEncodingSetterFilter implements Filter{ private static final String FILTERABLE_CONTENT_TYPE=
"application/x-www-form-urlencoded"; private static final String ENCODING_DEFAULT = "UTF-8"; private static final String ENCODING_INIT_PARAM_NAME = "encoding"; private String encoding; public void destroy(){ } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException{ String contentType = req.getContentType(); if (contentType != null && contentType.startsWith(FILTERABLE_CONTENT_TYPE)) req.setCharacterEncoding(encoding); chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException{ encoding = config.getInitParameter(ENCODING_INIT_PARAM_NAME); if (encoding == null) encoding = ENCODING_DEFAULT; } }
<filter> <filter-name>FormEncodingSetterFilter</filter-name> <filter-class>com.ellexdev.sunbay.FormEncodingSetterFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>FormEncodingSetterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>и вуаля... наши байты превращаются... байты превращаются... превращаются байты... в необходимые нам русские символы!
Большое спасибо. Очень помогло