HTTP的详细知识点(Response)

响应的三个组成部分

HTTP响应由哪三个组成部分

什么是HTTP响应

由服务器端发送给浏览器(客户端)的所有的数据,称为响应Response。

数据准备

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
<h2>用户登录</h2>
<form action="login" method="post">
    <table>
        <tr>
            <td>用户名</td>
            <td><input type="text" name="username"/></td>
        </tr>
        <tr>
            <td>密码</td>
            <td><input type="password" name="password"/></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="登录"/></td>
        </tr>
    </table>
</form>
</body>
</html>

响应信息的三个组成

响应行(状态行),响应头,响应体

HTTP的详细知识点(Response)
响应体由两种类型的数据:字符数据和字节数据

响应行、响应头、响应体

  1. 响应行的格式
  2. 响应头的格式
  3. 响应体的格式

响应行

组成:由三个部分组成

HTTP/1.1 200 OK

协议和版本 状态码 状态信息

响应头

HTTP的详细知识点(Response)

响应体

文本:字符的数据,如:text,html,json,xml

图片:字节的数据,还可以是下载的文件,音乐,视频

小结:响应的组成

HTTP的详细知识点(Response)

响应对象的方法:与状态行有关

与响应行有关的方法

什么是HttpServletResponse对象

  1. 由谁提供实现类:由Web容器,就是tomcat

  2. 由谁创建此对象:由Web容器
    HTTP的详细知识点(Response)
    设置状态码的方法(了解)
    HTTP的详细知识点(Response)

演示代码

package com.itheima.servlet;

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

/**
 与响应行有关的方法
 */
@WebServlet(name = "Demo1Servlet", urlPatterns = "/demo1")
public class Demo1Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //多态:父类的声明,子类的对象
        System.out.println("请求对象:" + request);
        System.out.println("响应对象:" + response);
        //设置状态码
        //response.setStatus(500);
        //与错误有关的状态码可以使用这个方法,在网页上会有web容器发送的错误信息
        //response.sendError(404);
        //如果需要更详细的信息,可以使用这个方法的重载
        response.sendError(404,"你吃了吗?");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

小结

状态码的方法 描述
setStatus(int status) 设置状态码
sendError(int sc) 发送错误码

常见的状态码

  1. 响应行中常见状态码的含义
  2. 404与405出现的原因

常见状态码的含义

200

服务器正常响应

302

表示页面的跳转

304

表示页面使用了缓存

404HTTP的详细知识点(Response)

HTTP的详细知识点(Response)
HTTP的详细知识点(Response)

代码

package com.itheima.servlet;

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

/**
 与响应行有关的方法
 */
@WebServlet(name = "Demo1Servlet", urlPatterns = "/demo1")
public class Demo1Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //多态:父类的声明,子类的对象
        System.out.println("请求对象:" + request);
        System.out.println("响应对象:" + response);
        //设置状态码
        //response.setStatus(500);
        //与错误有关的状态码可以使用这个方法,在网页上会有web容器发送的错误信息
        //response.sendError(404);
        //如果需要更详细的信息,可以使用这个方法的重载
        //response.sendError(404,"你吃了吗?");
       /* response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("服务器的响应");*/
        System.out.println(100 / 0);  //出现异常
        response.sendRedirect("01_login.htm");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       this.doPost(request, response);
    }
}

小结

状态码 含义
200 正常响应
302 页面跳转
304 使用缓存
404 找不到页面
405 没有doGet或doPost处理方法
500 服务器内部错误

响应对象:响应头相关方法

  1. 学习响应头相关的方法
  2. 案例:过3秒跳转到其它页面

响应头的方法

HTTP的详细知识点(Response)

案例:设置响应头过3秒跳转

步骤

  1. 创建Demo2RefreshServlet

  2. 调用setHeader,设置消息头(“Refresh”,“3;url=http://www.itcast.cn”)

  3. 调用setStatus,设置响应状态码200。(可选的代码)

代码

package com.itheima.servlet;

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

@WebServlet(name = "Demo2RefreshServlet", urlPatterns = "/demo2")
public class Demo2RefreshServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //调用setHeader,设置消息头("Refresh","3;url=http://www.baidu.com")
        response.setHeader("refresh", "3;url=http://www.itcast.cn");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("过3秒跳转到login");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

HTTP的详细知识点(Response)

代码

package com.itheima.servlet;

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

@WebServlet(name = "Demo3LocationServlet", urlPatterns = "/demo3")
public class Demo3LocationServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置location的响应头,实现页面跳转
        //response.setHeader("location","01_login.html");
        //设置302的状态码
        //response.setStatus(302);
        System.out.println("使用重定向的方法");
        response.sendRedirect("01_login.html");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

小结

响应头的方法 描述
void setHeader(String name, String value) 设置指定的响应头和它的值
void setContentType(String type) 相当于:
response.setHeader(“content-type”,“text/html;charset=utf-8”);

响应体:处理响应乱码的问题

  1. 响应体数据的两种方式:字节流和字符流
  2. 处理汉字乱码的问题

响应体的两种数据

  1. 字节流 OutputStream
  2. 字符流 Writer

HTTP的详细知识点(Response)
HTTP的详细知识点(Response)

打印流的一些疑问

  1. 直接使用打印输出流,输出汉字的结果是什么?

    乱码,为什么会有乱码
    
  2. 如何设置打印流默认的字符集?

    response.setCharacterEncoding("编码")
    但浏览器不知道服务器使用的是什么编码
    
  3. 只设置content-type响应头会怎么样?

    response.setContentType("text/html;charset=utf-8");
    就可以解决响应的乱码问题
    

代码

package com.itheima.servlet;

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

/**
 响应中汉字乱码的问题
 */
@WebServlet(name = "Demo4Servlet", urlPatterns = "/demo4")
public class Demo4Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
        1. 告诉浏览器服务器使用的编码是utf-8
        2. 设置了打印流的字符集
         */
        response.setContentType("text/html;charset=utf-8");
        //需要设置响应的编码
        //response.setCharacterEncoding("utf-8");
        //得到打印流
        PrintWriter out = response.getWriter();
        out.print("我们是好朋友");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

如何得到ServletContext对象

如何得到上下文对象

什么是ServletContext

概念:定义Servlet与其Servlet容器(tomcat)通信的一组方法。对于每个Java虚拟机,每个“web应用程序”都有一个上下文。上下文是web程序启动的时候创建,web程序关闭的时候销毁。

HTTP的详细知识点(Response)
**### 主要作用

  1. 用来得到Web目录和它子目录下的资源**
    HTTP的详细知识点(Response)
  2. 上下文域也是一个作用域对象

得到上下文域的方法

HTTP的详细知识点(Response)

Servlet的继承结构

HTTP的详细知识点(Response)

得到ServletContext的代码

package com.itheima.servlet;

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

@WebServlet(name = "Demo1Servlet", urlPatterns = "/demo1")
public class Demo1Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到ServletContext对象
        ServletContext application = getServletContext();  //调用自己的方法
        System.out.println("上下文对象:" + application);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}