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......");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风老魔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值