JSP入门:中文乱码

初学JSP,创建了两个页面jspForward.jsp与login.jsp

jspForward.jsp里使用了请求转发标志,是一个中转页面:

<jsp:forward page="login.jsp">

<jsp:param name="userName" value="张三" />

</jsp:forward>

login.jsp则是一个简单的表单用以获取从jspForward.jsp传来的param:

<form>

<input name="name" type="text" value="<%=request.getParameter("userName") %>"/>

</form>

结果访问jspForward.jsp自动跳转之后,login.jsp获得的用户名乱码

最终在尝试了多重方法之后发现,在jspForward.jsp(也就是请求传递参数的jsp)里设置request.setCharacterEncoding("UTF-8");

login.jsp获得的用户名才正常显示为“张三”

百度搜索也搜索不到原理。 毕竟这是一个入门级的小标签。 在以后也许根本都用不着。

不过我还是自己认真研究分析了一下:

感觉  jsp:param  传递参数的方式与  URL?param=value  的形式差不多,但是jsp:param传递的参数并不会跟后者一样在URL显示出来。

所以后者解决乱码既可以在传递参数的页面设置,也可以在接收参数的页面设置request.setCharacterEncoding("UTF-8");

而jsp:param解决乱码却只能跟我刚刚说的一样,只能在传递参数的页面设置,也许是使用jsp:param传递参数在传递的过程中改变了其request对象的性质,却依然保留着request的命名,所以在login.jsp(也就是已经获取参数的jsp中)中虽然你已经获取了这个名为request,但实质上已经变质的东西。所以这个时候设置request.setCharacterEncoding("UTF-8")已经无意义了(因为这是未变质前的方法),但是你仍然能获取到这个值(也就是说request.getParameter("userName")),尽管它显示为乱码。所以你需要在传递值之前也就是在jspForward.jsp设置request.setCharacterEncoding("UTF-8");这个时候才能成功改变你传的值的编码,这样的话,尽管jsp:param在传递过程中已经变质,但实际上内容已经改变了。所以在login.jsp中也能正常显示。

当然,以上内容纯属自己的猜想,我并不清楚其真正的原理,不喜勿喷。不过这里提到的解决方法是有效无疑的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章