SpringMVC + thymeleaf + html5 乱码种种坑
概述:
又消费一个下午解决乱码问题:
乱码1 :html网页显示乱码
你可能想到设置
步骤一:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 不行
步骤二:右键选择properties 设置字符编码为UTF-8 还不行
步骤三:设置tomcat请求字符编码 还是不行
步骤四:是时候修理一下thymeleaf的渲染器 这里两个地方都要设置字符编码,不要忘了
@Bean public TemplateEngine templateEngine(TemplateResolver templateResolver){ SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver); return templateEngine; } @Bean public ViewResolver viewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setTemplateEngine(templateEngine); //viewResolver.setCharacterEncoding("UTF-8"); return viewResolver; } @Bean public TemplateResolver templateResolver(){ TemplateResolver templateResolver = new ServletContextTemplateResolver(); templateResolver.setPrefix("/WEB-INF/template/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode("HTML5"); //templateResolver.setCharacterEncoding("UTF-8"); return templateResolver; }
显示问题解决了
第二个乱码: 输入框乱码,就是输入中文,回显保存信息,发现乱码了
步骤一: 设置表单请求头的接受的字符编码 发现不行
<form method="POST" th:object="${spitter}" accept-charset="UTF-8" >
步骤二:spring不是自带字符编码过滤器:
package com.jack.config;
import javax.servlet.Filter;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
/**
* 在Servlet3.0环境中,容器会在类路径中查询实现
* javax.servlet.ServletContainerInitializer 接口的类,如果发现的话,就会用它来配置Servlet容器
* @author Administrator
*
*/
public class SpittrWebAppInitializer
extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
}
/*
* 将DispatchServlet映射到"/"
* (non-Javadoc)
* @see org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer#getRootConfigClasses()
*/
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter c = new CharacterEncodingFilter();
c.setEncoding("UTF-8");
c.setForceRequestEncoding(true);
return new Filter[] {c};
}
}//重写父类的过滤器,设置为UTF-8 ,如果是xml,直接在web.xml 配置就行
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter c = new CharacterEncodingFilter();
c.setEncoding("UTF-8");
c.setForceRequestEncoding(true);
return new Filter[] {c};
}
效果:
总结: http一直在处理中文乱码问题
