首先确保不是编码格式不一致的问题后再看本文,解决编码一致问题的办法百度一大堆这里不再赘述。
问题的产生
<c:url value="/PartsServlet" var="factoryUrl">
<c:param name="method" value="findByFactory"/>
<c:param name="factory" value="父亲"/>
</c:url>
这个url标签会自动对参数进行url编码
你传递的“父亲”这个汉字会变成url码,直接${factoryUrl}调用即可
最后拼接的格式如下:
/项目名/PartsServlet?method=findByFactoryfactory
=%E5%BE%B7%E5%9B%BD%E9%A9%AC%E7%89%8C
原因
排除编码不一致导致的问题之后,用上述方法传递中文参数后,可以按F12找到Network,点击下方的All能看到你请求的具体URL,针对这种问题传过去的中文参数应该已经变成了URL码。
例如%E5%BE%B7%E5%9B%BD%E9%A9%AC%E7%89%8C
这是四个汉字,控制台会打印????四个问号
这是由于前面的url标签传给Tomcat的值是%E5%BE%B7,
可是传过去的百分号(%)
!!!并没有转义!!!
解决办法
**
1-简单情况
如果页面不是<c:forEach>循环产生的
直接使用Javascript进行url编码**两次**后
在后台进行一次解码就能得到中文了
代码如下:
<script>
//转码"父亲"
$(function () {
var fac = "父亲";
var fact=encodeURI(encodeURI(fac));
var a = document.getElementById("aaa");
//**设置id="aaa"的href属性值**
a.href = '/warehouse/PartsServlet?method=findByFactory&factory='+fact;
});
</script>
//html
<a id="aaa" >父亲</a>
后台servlet解码
String factory=req.getParameter("factory");
factory=URLDecoder.decode(factory, "utf-8");
这个时候你再去看URL,就会发现汉字变成了:
%25E5%25BE%25B7%25E5%259B%25BD%25E9%25A9%25AC%25E7%2589%258C
前面全部多了个**%25**,说明转义了,这样后台就能解码了!!!
2-复杂情况
页面是<c:forEach>循环产生的
由于JavaScript的性质,是在页面加载完成之后运行,所有对于循环产生的表格页面,上述方法设置的a标签的href属性只有第一个对象能拥有,后面的都无法点击
解决办法:给循环产生的页面id设置成与遍历条件一样的动态取值即可
由于本人前端技术实在是不行,所以是在servlet里面讲传给页面的
list列表里面追加了一个无关的参数,这样就能保证每个a标签的id
不一样了,所以调用JavaScript之后拼凑的url也就不一样了,能满
足更复杂的要求。
//设置不同的id
for (Parts parts:pb.getBeanList()) {
parts.setCircleId(CommonUtils.uuid());
}
前端页面
<a id="${parts.circleId}" >${parts.factory }</a>
id就变成动态的了,能满足<c:forEach>循环产生页面的要求