一:Reponse对象的概念
当客户端发送http请求时,服务器端会对每一次请求,创建request对象和response对象。
response对象包括三个部分:响应头、响应状态码以及响应体
二:response对象案例分析
1:向客户端输出中文数据
1 package com.hlcui.servlet; 2 3 import java.io.IOException; 4 import java.io.OutputStream; 5 import java.io.PrintWriter; 6 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 public class ServletDemo6 extends HttpServlet { 13 14 public void doGet(HttpServletRequest request, HttpServletResponse response) 15 throws ServletException, IOException { 16 17 String data = "好好学习!"; 18 //获取向客户端写数据的输出流 19 OutputStream out = response.getOutputStream(); 20 out.write(data.getBytes()); 21 } 22 23 public void doPost(HttpServletRequest request, HttpServletResponse response) 24 throws ServletException, IOException { 25 doGet(request,response); 26 } 27 28 }
浏览器打印:
结果正确!
这里面要注意,因为我在服务器端对数据进行编码时,没有指定使用哪种字符集,所以默认是使用gb2312,
而浏览器端解析时也是gb2312,所以正确显示,如果我指定编码字符为UTF-8,结果如下:
使用UTF-8对数据进行编码:
1 out.write(data.getBytes("UTF-8"));
打印结果为乱码:
因为我服务器端指定编码为UTF-8,而浏览器还是使用默认的解码方式进行解码,导致乱码。
解决方式:
可以通过设置浏览器的查看方式(使用UTF-8解析服务器发送过来的数据),但是不是根本办法,最好的办法是在
服务器端告诉浏览器以何种方式进行解码。修改如下:
1 response.setHeader("content-type", "text/html;charset=utf-8");
结果是正确的!
可以使用html标签中meta进行模拟服务器response响应头:
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 String data = "好好学习!"; 4 //获取向客户端写数据的输出流 5 OutputStream out = response.getOutputStream(); 6 out.write("<meta http-equiv='content-type' content='text/html;charset=utf-8'>".getBytes()); 7 out.write(data.getBytes("UTF-8")); 8 }
结果依然是正确的!
这里我们要了解服务端使用字符集编码以及浏览器解码的机制:
1:服务器端对数据进行编码,编码时使用字符集(gb2312或者UTF-8),没有指定默认为gb2312
2:浏览器解析response数据时,默认gb2312,它会拿着编码数据导字符集中取查询
如果我们想在浏览器输出99,那么服务端首先端99进行编码,在浏览器端,会拿着99的编码到
字符集中查询编码对应的内容。
1 out.write("99".getBytes("UTF-8"));
对99这个字符串进行UTF-8的编码。
printWriter对象与OutputStream对象
如果想浏览器写图片、视频以及音频文件等二进制文件时,必须使用字节流outputStream。
如果向浏览器写字符串时,可以使用printwriter对象,下面使用printWriter向浏览器写中文:
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 String data = "好好学习!"; 4 //获取向客户端写数据的输出流 5 PrintWriter out = response.getWriter(); 6 out.write(data); 7 }
输出结果:
出现乱码,因为response向对数据进行编码时使用的ISO8859-1,而浏览器解析使用的gb2312,所以查询不到,报????
解决方法:
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 //设置response对数据的编码方式 4 response.setCharacterEncoding("UTF-8"); 5 //告诉浏览器解码方式 6 response.setHeader("content-type", "text/html;charset=utf-8"); 7 String data = "好好学习!"; 8 //获取向客户端写数据的输出流 9 PrintWriter out = response.getWriter(); 10 out.write(data); 11 }
输出正确结果:
其实还可以使用response.setContentType("text/html;charset=utf-8");
这是servlet封装好的API,相当于下面两句的内容
//设置response对数据的编码方式
response.setCharacterEncoding("UTF-8");
//告诉浏览器解码方式
response.setHeader("content-type", "text/html;charset=utf-8");