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

时间:2021-01-18 11:49:04

一:Reponse对象的概念

当客户端发送http请求时,服务器端会对每一次请求,创建request对象和response对象。

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

response对象包括三个部分:响应头、响应状态码以及响应体

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

二:response对象案例分析

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

1:向客户端输出中文数据

 package com.hlcui.servlet;

 import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ServletDemo6 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String data = "好好学习!";
//获取向客户端写数据的输出流
OutputStream out = response.getOutputStream();
out.write(data.getBytes());
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
} }

浏览器打印:

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

结果正确!

这里面要注意,因为我在服务器端对数据进行编码时,没有指定使用哪种字符集,所以默认是使用gb2312,

而浏览器端解析时也是gb2312,所以正确显示,如果我指定编码字符为UTF-8,结果如下:

使用UTF-8对数据进行编码:

 out.write(data.getBytes("UTF-8"));

打印结果为乱码:

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

因为我服务器端指定编码为UTF-8,而浏览器还是使用默认的解码方式进行解码,导致乱码。

解决方式:

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

可以通过设置浏览器的查看方式(使用UTF-8解析服务器发送过来的数据),但是不是根本办法,最好的办法是在

服务器端告诉浏览器以何种方式进行解码。修改如下:

 response.setHeader("content-type", "text/html;charset=utf-8");

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

结果是正确的!

可以使用html标签中meta进行模拟服务器response响应头:

 public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data = "好好学习!";
//获取向客户端写数据的输出流
OutputStream out = response.getOutputStream();
out.write("<meta http-equiv='content-type' content='text/html;charset=utf-8'>".getBytes());
out.write(data.getBytes("UTF-8"));
}

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

结果依然是正确的!

这里我们要了解服务端使用字符集编码以及浏览器解码的机制:

1:服务器端对数据进行编码,编码时使用字符集(gb2312或者UTF-8),没有指定默认为gb2312

2:浏览器解析response数据时,默认gb2312,它会拿着编码数据导字符集中取查询

如果我们想在浏览器输出99,那么服务端首先端99进行编码,在浏览器端,会拿着99的编码到

字符集中查询编码对应的内容。

 out.write("99".getBytes("UTF-8"));

对99这个字符串进行UTF-8的编码。

printWriter对象与OutputStream对象

如果想浏览器写图片、视频以及音频文件等二进制文件时,必须使用字节流outputStream。

如果向浏览器写字符串时,可以使用printwriter对象,下面使用printWriter向浏览器写中文:

 public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data = "好好学习!";
//获取向客户端写数据的输出流
PrintWriter out = response.getWriter();
out.write(data);
}

输出结果:

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

出现乱码,因为response向对数据进行编码时使用的ISO8859-1,而浏览器解析使用的gb2312,所以查询不到,报????

解决方法:

 public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置response对数据的编码方式
response.setCharacterEncoding("UTF-8");
//告诉浏览器解码方式
response.setHeader("content-type", "text/html;charset=utf-8");
String data = "好好学习!";
//获取向客户端写数据的输出流
PrintWriter out = response.getWriter();
out.write(data);
}

输出正确结果:

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

其实还可以使用response.setContentType("text/html;charset=utf-8");

这是servlet封装好的API,相当于下面两句的内容

//设置response对数据的编码方式
response.setCharacterEncoding("UTF-8");
//告诉浏览器解码方式
response.setHeader("content-type", "text/html;charset=utf-8");