当前位置: 首页 > news >正文

Servlet 之 Responses

1. HTTP 协议

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应,分为:

  • 请求消息:客户端发送给服务端的数据,数据格式包含:请求行、请求头、请求空行、请求体

  • 响应消息:服务段发送给客户端的数据,数据格式:

    • 响应行
      • 组成:协议/版本 响应状态码 状态码描述
      • 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态,都是 3 个数字
      • 1xx:服务端接收客户端消息,但没有接收完成,等待一段时间后,发送 1xx 状态码
    • 2xx:成功,如:200
      • 3xx:重定向,如:302 重定向、304 访问缓存
      • 4xx:客户端错误,如:404 请求路径没有对应的资源、405 没有对应的请求方式
      • 5xx:服务端错误,如:500 服务器内部出现异常
    • 响应头:格式(键值对形式):头名称: 值,常见的有:
      • Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
      • Content-disposition:服务器告诉客户端以什么格式打开响应体数据,如 in-line 默认值,表示在当前页面打开、attachment;filename=xxx:以附件形式打开响应体如:文件下载
    • 响应空行
    • 响应体:传输的数据

响应字符串格式示例:

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT

<html>
<head>
<title>$Title$</title>
</head>
<body>
hello , response
</body>
</html>

2. Response 对象

Response 对象可以设置响应消息,比如:

  • 设置响应行:如:格式:HTTP/1.1 200 ok、设置状态码:setStatus(int sc)
  • 设置响应头:setHeader(String name, String value)
  • 设置响应体:使用步骤:
    • 获取输出流:字符输出流获取方法 PrintWriter getWriter()、字节输出流获取方法 ServletOutputStream getOutputStream()
    • 使用输出流,将数据输出到客户端浏览器显示

2.1 重定向和转发

两者区别

  • 重定向 redirect
    • 地址栏发生变化
    • 访问其他站点(服务器)的资源
    • 是两次请求,不能使用request对象来共享数据
  • 转发 forward
    • 地址栏路径不变
    • 只能访问当前服务器下的资源
    • 是一次请求,可以使用request对象来共享数据

RedirectServlet1.java

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("/responseDemo1")
public class RedirectServlet1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get 请求!");

        // 请求 responseDemo1,重定向到 responseDemo2
        // 方法一 
        resp.setStatus(302);  // 1. 设置状态码为 302
        resp.setHeader("location", "responseDemo2");  //  2. 设置响应头

        // 方法二:动态获取虚拟目录(推荐)
        String contextPath = req.getContextPath();
        System.out.println(contextPath);
        resp.sendRedirect(contextPath + "/responseDemo2");  // 重定向
        //response.sendRedirect("https://www.baidu.com");
    }
}

RedirectServlet2.java

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("/responseDemo2")
public class RedirectServlet2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("responseDemo2 doPost......");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("responseDemo2......");
    }
}

相关文章:

  • 如何写好JS
  • 【1813. 句子相似性 III】
  • dp解最长回文子串
  • 故障分析 | cassandra 集群数据故障转移
  • jvm系列(1)--JVM和Java体系架构
  • Openresty记录笔记
  • 最容易理解的并查集详解
  • Kruskal重构树学习笔记(C++)
  • 电商erp迁往云端必须注意的5件事
  • docker-compose 搭建伪分布模式redis cluster集群
  • JS逆向之补环境过瑞数详解
  • 【PR #5 C】和平共处(整体二分)
  • 数组、对象操作方法
  • 2023-01-16 阿里SMS短信接口使用
  • 【linux kernel】Linux设备驱动模型 | bus
  • HTML的body元素
  • Spring Boot(五十四):SpringBoot事件监听机制
  • Fastdfs分布式文件系统原理浅析
  • 3-2存储系统-主存与CPU的连接外部存储器
  • 20230116英语学习