向客户端发送数据
getOutputStream()
getWriter()
**字节流发送数据的中文乱码问题
服务器端指定了用utf-8来发送数据,浏览器在接受数据时,如果不指定将使用默认的平台码GBK,编解码不一致导致乱码。
解决方案;
response.setHeader("Content-Type", "text/html;charset=utf-8");// 通知浏览器使用utf-8打开服务器发送过去的数据
esponse.getOutputStream().write("中国".getBytes("utf-8"));// 指定编码为utf-8
**字符流发送数据的中文乱码问题
利用字符流发送数据,底层还是要转成字节。服务器端如果不手动指定,服务器默认会使用iso8859-1码表,由于里面没有中文汉字,所以服务器端发送给客户端就是一堆乱码(显示???),客户端不管使用什么码表都无法转成正常的字符。
* 服务器会根据getCharacterEncoding()方法返回的编码来发送数据,如果没有指定,该方法默认返回iso8859-1
* 解决方案:
第一步,需要指定服务器发送数据使用utf-8
response.setCharacterEncoding("utf-8"); //通知服务器使用utf-8来发送响应实体中数据
第二步:需要指定浏览器在接收数据时也使用同一个编码来打开数据
response.setHeader("Content-Type", "text/html;charset=utf-8");
等价于<==>
response.setContentType("text/html;charset=utf-8");
* 在通知浏览器使用什么编码接受服务器发送的数据时,服务器很智能,会使用相同的编码来发送数据,所以指定服务器以什么编码发送数据的代码可以省略不写
**总结:不管是字符流还是字节流,解决乱码问题,可以用一行代码搞定:
response.setContentType("text/html;charset=xxx");
**getOutputStream()和getWriter() 这两个方法是互斥的, 在一次请求当中调用了其中的一个, 就不能再调用另一个!!!
**在调用完getOutputStream()或getWriter()方法之后,不需要手动去关闭流,服务器会自动帮我们去关闭!!!
**这个两个方法获取到的流并不是指向客户端的流,而是指向response缓冲区的流,通过流将数据写入response缓冲区,service方法执行结束,请求回到服务器,由服务器将数据组织成响应消息打给浏览器!!