关于“Get方式提交中文表单数据,地址栏出现乱码,数据库查询不出”问题解决

今天解决一个模糊搜索的小demo的时候,花了大半天时间,又是一次血的教训。代码翻来覆去,改了个底朝天,最终发现是编码格式的问题。

由于前面进行页面跳转的时候用的是Get方式,为了方便起见,当进行提交带中文模糊检索的表单提交的时候,我用的也是Get方式。这为后面的事情埋下祸根。

表单:

<form class="navbar-form" action="${pageContext.request.contextPath }/goods_search" method="get">
	<input type="text" class="form-control" name="keyword" />
	<button type="submit" class="btn btn-default" aria-label="Left Align">搜索</button>
</form>

又是一阵噼里啪啦,码好代码,测试!我去,怎么搜索列表页面显示为空啊。不得了,赶紧看看代码。既然有显示,路径没问题。测试Servlet,嗯,没问题!测试Service,嗯,也没问题!测试Dao,嗯,还是没问题。jsp页面也没问题,那到底是个什么问题!身为一个优秀的程序员,第一步应该坚持环境有问题的。好吧,一番调之后证明不可能是环境问题,天天用怎么会坏在这里。会不会是代码哪个符号出错了?看了几遍了都没找出来,那就删代码重写吧,反正也不多。呃~,问题依旧存在。

中场休息,吃个饭先。

吃饭回来继续刚。既然常出现的问题都过滤了个遍没问题,那是不是问题出在Get方法?不会吧,就这几行代码。但是,问题就出在这个Get上面!使用 System.out.println(keyword) 控制台输出对请求得到的字符串进行输出,得到三个问号(我仿佛看到了嘲笑+黑人问号脸)。特么的,这种东西传到数据库能查出东西来?难怪我的显示一片白。知道问题出在哪,解决问题就很快了。但是我们要总结!这不?跑博客写起东西来了。

地球人都知道,Get方式是通过地址栏传递数据的。而在地址栏上数据一般会通过URLEncoder进行编码以供传输(网站请求不支持中文,扯淡的设定啊)。
一个中文的“乐”字加到地址栏长这样:keyword=%E4%B9%90

http://localhost:8080/cakeshop/goods_search?keyword=%E4%B9%90

然而呢,由于本人水平有限,在接收请求的时候,没有对传输过来的数据进行解码。在这种情况下,使用request.setCharacterEncoding(“UTF-8”)是绝不会有用的(绝对实测!要不然也不会在这疏忽栽跟斗)。于是在得到请求的同时,加上强制转码。
像这样:

String keyword = new String(request.getParameter("keyword")
					.getBytes("ISO-8859-1"), "UTF-8");

测试下!好的,完美运行!控制台正确输出了,数据库返回数据也有了,一切都这么美好。用URLEncoder.encode(keyword, “UTF-8”)测试下到底是不是URLEncoder搞得鬼,结果得到%E4%B9%90,和上面地址栏的一模一样,有没有!是它跑不了了。

美滋滋。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值