javaweb学习总结二十五(response对象的用法一)

一: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");

原文地址:https://www.cnblogs.com/warrior4236/p/6021393.html