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一直在处理中文乱码问题

经验分享 程序员 微信小程序 职场和发展