乱码问题

HttpServletResponse有两种向浏览器发送数据的方法,分别是:

getOutputStream

Returns a ServletOutputStream suitable writing binary data in the response.
返回一个可以写入二进制数据的OutputStream流。

先贴上我们的代码(因为没用到doPost所以我给它删了,因为看的比较舒服):

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String data="你好,世界";
        OutputStream outputStream = response.getOutputStream();
        byte[] dataByteArr = data.getBytes("UTF-8");
        outputStream.write(dataByteArr);
    }
}

运行后的结果不尽人意:
在这里插入图片描述
这里就涉及到了乱码的问题,之后会演示如何解决乱码问题。

getWriter

Returns a PrintWriter object that can send character text to the client.
返回一个能够向客户端发送字符文本的PrintWriter对象。
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String data="你好,世界";
        PrintWriter out = response.getWriter();
        out.write(data);
    }
}

运行后也显示乱码。
在这里插入图片描述

解决乱码问题

产生乱码的原因是因为服务器端与客户端的编码格式不同,中文在某些编码中无法正常显示,一般常用到的能正常显示中文的有utf-8、gbk。

所以,解决乱码问题我们只需要修改服务器端与客户端的编码格式即可。

在这里插入图片描述
idea的右下角可以查看idea当前的编码格式,我们使用的是utf-8所以,在代码片段中输入中文能正常显示,如果我将他换成"ISO-8859-1"这个编码格式,那么,中国两个字就会显示乱码:
在这里插入图片描述
之后你再转回utf-8编码格式,你会发现这"??“并不会变回中国,仍旧是”??"。

到这里我们的服务器端的编码格式就设置好了,之后就要设置客户端的编码格式了。
/* 这个方法用来解决getOutputStream方法的乱码问题 */

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setHeader("content-type", "text/html;charset=UTF-8");
    }
}

/* setHeader是HttpRervletResponse的设置响应头的方法,content-type是
响应头属性,在这里我们可以告诉浏览器回送数据的类型。*/

/*ps:如果不了解http协议,应该去学习一下,不然学习javaEE会很艰难 */

到这里有些人可能会奇怪,不是服务器端和客户端的编码格式不都是已经设置成相同数据格式了吗,为什么getWriter还是乱码?

  因为服务器在向客户端发送数据的时候中间会以其他编码格式向客户端发送数据,这
时候你的数据又一次的经过了处理,就像之前我演示的"utf-8=>iso-8859-1=>utf-8 "
在这个过程,数据已经损坏了,所以即使你的客户端是以utf-8这个编码格式显示数据,
却也不会显示出你所希望的数据了。

PS:getOutputStream之所以不会出现这种情况是因为我们是以二进制流传输的数据,
就是这一句代码"byte[] dataByteArr = data.getBytes("UTF-8");"

所以我们需要告诉服务器:将字符以utf-8的编码格式输出到客户端浏览器

response.setCharacterEncoding("UTF-8");

总结:所以我觉得在编写Servlet的内容时应该养成先设置编码格式的好习惯,不要在写好很多内容之后,运行结果发现出现乱码,这个时候会让人心烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值