第一次使用mysql结合struts2和spring开发,接二连三碰到中文乱码异常问题。
理想下整个过程全部使用utf-8,中间不用转换编码。
首先,mysql数据库字符集全部设成utf-8,没有问题。
然后,struts.xml配置文件中加入
- <constant name="struts.i18n.encoding" value="UTF-8"></constant>
jsp页面加入
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
spring数据源配置(注意url)
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
- <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
- <property name="url" value="jdbc:mysql://localhost:3306/bysj?useUnicode=true&characterEncoding=utf-8"/>
- <property name="username" value="root"/>
- <property name="password" value="123"/>
- </bean>
一开始我url后面没有加编码,导致出现了一个诡异的问题:使用spring的jdbctemplate执行不带中文的sql语句没有问题,执行带中文的sql语句查不到数据,而将这条sql语句直接在数据库中执行却也完全没问题。
另外保险起见在web.xml中再加个经典的字符编码过滤器
- <filter>
- <filter-name>encodingFilter</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>encodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
最后tomcat中server.xml也要配置(URIEncoding="UTF-8"是添加上去的)。
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" URIEncoding="UTF-8"/>
搞定!