JavaWeb-03-Servlet-04-HttpServletResponse接口

HttpServletResponse接口

1.HttpServletResponse简介

  1. HttpServletResponse接口来自于Servlet规范中,存在于Tomcat中的servle-api.jar,具体位置是【javax.servlet.http.HttpServletResponse】
  2. HttpServletResponse接口实现类由Http服务器负责提供。
  3. HttpServletResponse接口负责将doGet/doPost方法执行结果写入到【Http响应协议包】的【响应体】中交给浏览器。
  4. 开发人员习惯将HttpServletResponse接口修饰的对象称为【响应对象】

2.响应对象的主要功能

  1. 将执行结果以二进制形式写入到【响应体】中
  2. 设置【响应头】中【content-type】的属性值,从而控制浏览器使用对应的编译器将响应体中的二进制数据编译为【文字、图片、视频、命令】
  3. 设置响应头中的【location】属性,将一个请求地址赋给location,从而远程控制浏览器向指定服务器发送请求。

3.功能实现1:响应对象将方法中执行结果写入响应体

3.1实现流程

新建一个项目,创建一个Servlet接口实现类。

重写doGet()方法,在方法内使用HttpServletResponse接口对象将执行结果写入到响应体中。

package com.tsccg.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @Author: TSCCG
 * @Date: 2021/08/13 13:16
 * 响应对象将执行结果写入到响应体中
 */
public class OneServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //执行结果
        String str = "Hello World";
        
        //---响应对象将执行结果写入到响应体中---
       //1.通过响应对象向Tomcat索要输出流
        PrintWriter out =  response.getWriter();
        //2.通过输出流将执行结果以二进制形式写入到响应体中
        out.write(str);
        //response.getWriter().write(str);//合起来写
        //---响应对象将执行结果写入到响应体中---
        
    }//doGet方法执行结束,服务器将Http响应协议包推送给浏览器
}

发布网站后,开启服务器,通过浏览器向Tomcat服务器发起请求访问OneServlet:

JavaWeb-03-Servlet-04-HttpServletResponse接口

Tomcat服务器接收到请求后,创建一个OneServlet的实例对象,然后通过该实例对象调用其doGet()方法。

在doGet方法中,得到执行结果后,通过响应对象response向Tomcat服务器索要一个输出流对象:

PrintWriter out =  response.getWriter();

然后通过输出流对象调用write()方法将执行结果写入到Http响应协议包的响应体中:

out.write(str);

doGet方法执行结束后,服务器将带有执行结果的Http响应协议包发送给浏览器,

浏览器接收到数据后,读取响应体中的执行结果,将其展示到浏览器上。

3.2write和print

write()方法可以将【字符】、【字符串】、【ASCII码】写入到响应体中。

上面程序中,写入一个字符串没有什么问题,但如果写入的是一个数字的话,就会将数字当作是一个ASCII码。

把上面程序中的执行结果换成97,重启服务器,重新写入响应体:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //执行结果
    //String str = "Hello World";
    int result = 97;
    //1.通过响应对象向Tomcat索要输出流
    PrintWriter out =  response.getWriter();
    //2.通过输出流将执行结果以二进制形式写入到响应体中
    out.write(result);
}

通过浏览器访问,得到的结果是ASCII码中97对应的字符【a】。

JavaWeb-03-Servlet-04-HttpServletResponse接口

当我们想写入一个真实数据时,使用write()显然不可行。

此时,我们可以使用print()方法。

print()方法可以将真实数据写入响应体中。

JavaWeb-03-Servlet-04-HttpServletResponse接口

使用print()方法重新写入:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //执行结果
    int result = 97;
    //1.通过响应对象向Tomcat索要输出流
    PrintWriter out =  response.getWriter();
    //2.通过输出流将执行结果以二进制形式写入到响应体中
    //out.write(result);
    out.print(result);
}

通过浏览器访问,可以接收到真实数据。

JavaWeb-03-Servlet-04-HttpServletResponse接口

4.功能实现2:设置响应头中content-type的属性值

4.1设置编译html标签命令

新创建一个Servlet接口实现类TwoServlet:

将一句包含html标签的字符串作为执行结果写入响应体中。

package com.tsccg.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @Author: TSCCG
 * @Date: 2021/08/13 15:23
 */
public class TwoServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //执行结果
        String str1 = "java<br>c++<br>python";
        //向服务器索要输出流
        PrintWriter out = response.getWriter();
        //将执行结果以二进制形式写入响应体中
        out.print(str1);
    }
}

开启服务器,通过浏览器访问TwoServlet

JavaWeb-03-Servlet-04-HttpServletResponse接口

从结果可见,浏览器在接收到响应结果时,将写入的html语句作为文字内容展示在窗口上了,并没有将其作为html标签命令执行。

原因是什么呢?

浏览器在接收到响应包后,根据响应头中的【content-type】属性值,来选择相对应的【编译器】对响应体中的二进制内容进行编译处理。

在默认情况下,【content-type】的属性值为"text",浏览器会使用【文本编辑器】编译响应体中的二进制文件。

如何解决呢?

在得到输出流之前,通过【响应对象】设置响应头中的【content-type】属性值:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //执行结果
    String str1 = "java<br>c++<br>python";
    //设置响应头中content-type属性值
    response.setContentType("text/html");
    //向服务器索要输出流
    PrintWriter out = response.getWriter();
    //将执行结果写入响应体中
    out.print(str1);
}

这样,浏览器接收到响应结果时,就会采用【文本编译器】和【HTML命令编译器】一起对响应体中的二进制数据进行编译。

重启服务器并通过浏览器访问TwoServlet。

JavaWeb-03-Servlet-04-HttpServletResponse接口

4.2设置字符编码集

将一句包含中文的字符串写入到响应体中:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String str1 = "java<br>c++<br>python";
    String str2 = "北京烤鸭<br>大盘鸡<br>鸡公煲";//中文字符串
    //设置响应头中content-type属性值
    response.setContentType("text/html");
    //向服务器索要输出流
    PrintWriter out = response.getWriter();
    //将执行结果写入响应体中
    out.print(str1);
    out.print(str2);
}

重启服务器,通过浏览器访问

JavaWeb-03-Servlet-04-HttpServletResponse接口

由结果可见,写入的中文显示乱码。

原因是响应头中,Content-Type属性值的【字符编码集charset】默认是【ISO-8859-1】,不支持中文。

我们可以在得到输出流之前设置Content-Type的属性值,将字符编码集设置为【utf-8】。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String str1 = "java<br>c++<br>python";
    String str2 = "北京烤鸭<br>大盘鸡<br>鸡公煲";
    //设置响应头中content-type属性值
    //response.setContentType("text/html");
    response.setContentType("text/html;charset=utf-8");
    //向服务器索要输出流
    PrintWriter out = response.getWriter();
    //将执行结果写入响应体中
    out.print(str1);
    out.print(str2);
}

JavaWeb-03-Servlet-04-HttpServletResponse接口

5.功能实现3:远程控制浏览器发送请求行为

响应对象可以调用sendRedirect方法将一个网址赋值给响应头中的location属性。

浏览器在接收到响应包后,如果发现响应头中有location属性,会自动通过地址栏向location指定的网站发送请求。

新建一个Servlet接口实现类ThreeServlet,通过响应对象调用sendRedirect方法将百度地址赋给响应头中的location属性。

package com.tsccg.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Author: TSCCG
 * @Date: 2021/08/13 17:31
 */
public class ThreeServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //百度地址
        String result = "http://www.baidu.com";
        //通过响应对象将地址赋给响应头中的location属性
        response.sendRedirect(result);
    }
}

通过浏览器请求访问ThreeServlet:

浏览器发现响应头中的location属性有地址,会在地址栏写入该地址并发起请求。

JavaWeb-03-Servlet-04-HttpServletResponse接口

sendRedirect方法还可以控制浏览器的【请求地址,请求方式,请求参数】。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //百度地址
    //String result = "http://www.baidu.com";
    String result = "http://www.baidu.com?username=zhangsan";//【请求参数】
    //通过响应对象将地址赋给响应头中的location属性
    response.sendRedirect(result);
}

JavaWeb-03-Servlet-04-HttpServletResponse接口

上一篇:Servlet笔记②


下一篇:NGINX反向代理,header丢失的问题