NewFile.jsp的我的代码:
<% String haha="关于"; %> <a href="NewFile1.jsp?name=<%=haha %>">添加用户</a>
NewFile1.jsp:
<%=request.getParameter("name") %>
在eclipse内置浏览器上运行NewFile.jsp:
瞎咕咚了半天,结果发现这不是我代码的问题。
我将我的URL放在别的浏览器上试了试,发现根本不会报错,很忧伤....亏我一直在改代码,结果不是我的锅。
so,怎么解决呢↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
总结一番我自己的理解。
在jsp中会出现两种编码错误。一种是页面编码错误,一种是数据编码错误。
页面编码错误:
最典型的是jsp文件中的 pageEncoding和charset:设置的都是该页面的编码!并不是传递数据的编码!
(注:这里说的传递数据不是任何参数,指的是用来通过request\response\超链接\forward等传到各种页面的数据)
pageEncoding和charset的区别在于:
前者是告诉编译器要根据什么编码方式解码,后者是告诉浏览器你要用什么编码去显示界面。
例如很简单的demo.jsp,在这里将pageEncoding,charset都设置成UTF-8:
<body>哈哈哈 </body>
请求运行demo.jsp,首先因为我们的pageEncoding=UTF-8,所以编译器知道要用这个编码方式去解码(翻译我们写的东西),然后由于charset=utf-8,所以我们看到的界面是中文不乱码。显示“哈哈哈”。
数据传递中的编码错误:
request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码; response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码;传递数据,一般都是通过request\response。
1、request带参数传递(接收数据)
例如超参数:
<a href="NewFile1.jsp?name=<%=haha %>">添加用户</a>
例如forward动作元素:
<jsp:forward page='welcom.jsp'> <jsp:param value="<%=username %>" name="cuser"/> </jsp:forward>
还有最常见的表单:
<form action="LoginServlet" method="post"> 用户名:<input name="username"><br> 密码:<input name="passward"><br> <input type="submit" value="登录"> </form>
解决request参数传递乱码问题,首先要分清楚这个request是以什么方式发出的?get?post?还是其它?
如果是post发出的,在被接受文件中加入:
request.setCharacterEncoding("utf-8");
即可,注意!该代码只适合处理post方式出现的乱码!有很多百度知道的回答、博客都没分这个!误人子弟...
如果是get就比较麻烦,例如超参数传递就是get方式传递的。由于每个人使用的tomcat版本不一样,同样的代码有的人运行就不报错,解决方式就是网上说烂的修改各种配置文件:get方式处理乱码的方法
2、response带参数传递(发送数据)
例如响应跳转:
response.setHeader("refresh","3;url=welcom.jsp?user="+username);
还有重定向:(最好不要用重定向传参,由于其会触发两次request,可能你需要的值的request不是你希望的那个)
response.sendRedirect("NewFile1.jsp?name=zho文");
无论是哪个,都会出现:
可以看到,这个可以直接通过地址栏去修改数据的,即相当于url的请求方式(get方式)。
一般response很少会出现编码错误的。所以,只要解决了被接受页面的request的get方式接受数据的编码错误,就可以了。
一般response出现编码错误,往往是我们的浏览器编码和我们的服务器不匹配造成的。这时候我们才需要更改我们的response的编码去匹配浏览器。(大部分时候不需要这么做)
response.setCharacterEncoding("utf-8”);
参考:request、response乱码、jsp流程的编码、转码