这本来是一个很简单的问题,不过我觉得还是有必要记录下来。
今天在开发博客系统的时候,遇到了参数传递中文乱码的问题。开始我只是直接在web.xml中添加springMVC框架已有的filter来处理,代码都是死的,如下:
<!-- 处理中文乱码 -->
<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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
但是即使是添加了中文处理的问题,还是乱码,于是开始认真起来了,打断点,发现参数从前台传递到后台,以及后台获取到的参数都是正确的,没有乱码。但是mybatis打印出来的log却依然显示两个 ??, 果断查看model的xml文件,这个地方的模糊查询的sql是这样的:
<select id="orderByTime" parameterType="map" resultMap="BlogArticleList">
select * from blog_article a, blog_user u where a.article_user_id = u.user_id
<if test="null != title">
<!-- #{title} 对sql中的 ? 进行替代, 用 ${title} 会完整的将字符串完成替代 -->
and article_title like #{title}
</if>
order by a.article_id ${order} limit #{index}, #{size}
</select>
这个地方的#{title}的格式是在java程序里面处理好了的,即 '%title%'. 问题就出在这个地方.
正确的做法应该是,不在java程序中处理这个字符串,直接传递即可。and article_title like #{title} 应改成: and article_title like '%${title}%'
**注意的是:现在程序已正确,但是mybatis打印出的log显示的参数依然是 ??,可能是mybatis哪个地方的配置的问题吧,不过不影响程序的正确运行