前端JSP\Tomcat\后端Servlet三者编码一致传递中文却仍然是问号???——解决办法

前端JSP\Tomcat\后端Servlet三者编码一致传递中文却仍然是问号???——解决办法

首先确保不是编码格式不一致的问题后再看本文,解决编码一致问题的办法百度一大堆这里不再赘述。

问题的产生

<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>循环产生页面的要求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值