首页 > 技术文章 > Servlet之HttpServletResponse

yu011 2020-09-24 23:57 原文

概述

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

主要功能:

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

代码示例

package com.zyh.contrller;

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

public class OneServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
        //执行结果
        String result = "Hello world!";
        /*响应对象将结果写入到响应体*/
        //1、通过响应对象,向Tomcat索要输出流
        PrintWriter out = response.getWriter();
        //2、通过输出流,将执行结果以二进制形式写入到响应体
        out.write(result);
        /*---至此doGet执行完毕,Tomcat将响应包推送给浏览器*/

    }
}

在这里插入图片描述

package com.zyh.contrller;

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;

public class TwoServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int i = 50;
        PrintWriter out = response.getWriter();
        /*out.write(i);*/
        /*------浏览器显示2,而不是50------*/
        /*
        * 问题描述:
        * 浏览器接收到数据是2,不是50。
        * 问题原因:
        * out.writer方法可以将【字符、字符串、ASCII码】写入到响应体。
        * 50对应的ASCII码是2。
        * 解决方案:
        * 通过out.print()将真实数据写入到响应体
        */
        out.println(i);
    }
}

在这里插入图片描述

package com.zyh.contrller;

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;

public class ThreeServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //既有文字信息,又有HTML
        String result = "aaa</br>bbb</br>ccc</br>";
        //包含中文,要设置charset=UTF-8
        String result2 = "烧烤</br>火锅</br>啤酒</br>";
        //设置响应头
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println(result);
        out.println(result2);
        /*
        * String result = "aaa</br>bbb</br>ccc</br>";
          PrintWriter out = response.getWriter();
          out.println(result);
        * 响应结果依然是:
        * aaa</br>bbb</br>ccc</br>
        * 没有执行HTML命令。
        *
        * 原因:
        * 浏览器在接收到响应包之后,根据响应头中(content-type)属性的值,
        * 来采用对应编译器对响应体中二进制内容进行编译处理。
        * 默认的情况下,content-type属性的值为"text"
        * (content-type="text")。
        * 此时浏览器将会采用文本编译器对响应体二进制数据进行解析。
        *
        * 解决办法:
        * 在得到输出流之前,通过响应对象对响应头中
        * content-type属性进行重新赋值,
        * 指定浏览器采用正确编译器。
        */
    }
}

在这里插入图片描述

package com.zyh.contrller;

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

public class FourServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
        * 浏览器在接收到响应包之后,
        * 如果发现响应头中存在Location属性,
        * 自动通过地址栏向Location指定网站发送请求。
        * sendRedirect方法远程控制浏览器请求行为。
        * 请求行为:请求地址、请求方式、请求参数。
        */
        String result = "http://www.baidu.com";
        //通过响应对象,将地址赋值给响应头中Location属性
        response.sendRedirect(result);
    }
}

在这里插入图片描述
跳转到百度首页:
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>com.zyh.contrller.OneServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>TwoServlet</servlet-name>
        <servlet-class>com.zyh.contrller.TwoServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>ThreeServlet</servlet-name>
        <servlet-class>com.zyh.contrller.ThreeServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>FourServlet</servlet-name>
        <servlet-class>com.zyh.contrller.FourServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>TwoServlet</servlet-name>
        <url-pattern>/two</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ThreeServlet</servlet-name>
        <url-pattern>/three</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>FourServlet</servlet-name>
        <url-pattern>/four</url-pattern>
    </servlet-mapping>
</web-app>

推荐阅读