【07 响应(response) 学习笔记】

该文详细介绍了HTTP响应的各种处理方法,包括常见的状态码设置,字节流和字符流在响应消息中的应用,如何响应图片,设置HTTP缓存,实现定时刷新,执行请求重定向以及文件下载的实现,主要使用了Servlet进行演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、响应

在这里插入图片描述

1. 常见状态码

在这里插入图片描述

2. 字节流响应消息&乱码问题解决

在这里插入图片描述
乱码问题解决:resp.setContentType(“text/html;charset=UTF-8”);


import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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("/servletDemo01")
public class ServletDemo01 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.setContentType("text/html;charset=UTF-8");
        //1. 获取字节输出流
        ServletOutputStream os = resp.getOutputStream();
        //2. 定义一个消息
        String str="hello";
        //3. 通过字节流输出
        os.write(str.getBytes("UTF-8"));
        //os.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

3. 字符流响应消息

在这里插入图片描述


import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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("/servletDemo02")
public class ServletDemo02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        //1. 获取字节输出流
        PrintWriter os = resp.getWriter();
        //2. 定义一个消息
        String str="你好";
        //3. 通过字节流输出
        os.write(str);
        //os.close();

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

4. 响应图片

在这里插入图片描述


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

/**
 * 响应图片
 **/
@WebServlet("/servletDemo03")
public class ServletDemo03 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //通过相对路径获取绝对路径
        String realPath = getServletContext().getRealPath("/img/java.png");
        System.out.println(realPath);
        //1.  创建字节输入流对象,关联图片路径
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream(realPath));
        //2. 通过响应对象获取字节输出流对象
        ServletOutputStream os = resp.getOutputStream();
        //3.循环读写
        byte [] arr=new byte[1024];
        int len;
        while ((len=bis.read(arr))!=-1){
            os.write(arr,0,len);
        }
        //4. 释放资源
        bis.close();


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

5. 设置缓存

在这里插入图片描述


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

/**
 * 设置缓存
 **/
@WebServlet("/servletDemo04")
public class ServletDemo04 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String news = "hot news";
        //设置编码格式
        resp.setContentType("text/html;charset=UTF-8");
        //设置缓存  1小时缓存时间

        //当前时间为基准 +1小时
        resp.setDateHeader("Expires",System.currentTimeMillis()+1*60*60*1000);

        //1. 写出数据
        resp.getWriter().write(news);
        System.out.println("缓存访问!!!!");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

6. 定时刷新

在这里插入图片描述
在这里插入图片描述


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("/servletDemo05")
public class ServletDemo05 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String str ="输入有误,3s后刷新";
        //设置编码格式
        resp.setContentType("text/html;charset=UTF-8");
        //写出数据
        resp.getWriter().write(str);
        //定时刷新
        resp.setHeader("Refresh","3;URL=/jou/login.html");


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

7. 请求重定向

请求转发和请求重定向的区别:
请求转发地址栏不会发生变化,对象中不能共享数据;
1、请求转发是服务器行为、重定向是客户端浏览器行为
2、请求转发是request对象调用方法、重定向是response对象调用方法
3、请求转发只有一次请求所以可以实现request域对象中的数据共享,而重定向是多次请求、多次响应
4、请求转发的效率要高于重定向
5、请求转发url地址栏不变,而重定向会发生变化
6、既然请求转发是服务器内部的行为,所以只能访问服务器内部资源!而重定向既然是浏览器行为,地址栏会变,所以可以访问服务器外部资源!

在这里插入图片描述
实验 demo6重定向demo7 共享数据为null


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("/servletDemo06")
public class ServletDemo06 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("servletDemo06 running");
        //设置请求域共享数据
        req.setAttribute("username","zhangsan");
        //设置重定向
        resp.sendRedirect(req.getContextPath()+"/servletDemo07");



    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

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("/servletDemo07")
public class ServletDemo07 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("servletDemo07 running");
        Object username = req.getAttribute("username");
        System.out.println(username);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

在这里插入图片描述

8. 文件下载

在这里插入图片描述

package com.example.demo0402;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * 请求重定向
 **/
@WebServlet("/servletDemo08")
public class ServletDemo08 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1.创建字节输入流对象 关联读取的文件
        String realPath = getServletContext().getRealPath("/img/java.png");
        BufferedInputStream  bis=new BufferedInputStream(new FileInputStream(realPath));
        //2.设置响应头支持的类型
        /**
         *  Content-Type 消息头名称   支持的类型
         *  application/octet-stream 消息头参数 应用类型为字节流
         */
        resp.setHeader("Content-Type","application/octet-stream");
        //3.设置响应头以下载方式打开文件
        /**
         * Content-Disposition 消息头名称  处理的形式
         * attachment;filename=java.png  消息头参数 附件形式进行处理  指定下载文件的名称
         */
        resp.setHeader("Content-Disposition","attachment;filename=java.png");
        //4. 获取字节输出流
        ServletOutputStream os = resp.getOutputStream();
        //5.循环读写
        byte []arr=new byte[1024];
        int len;
        while ((len=bis.read(arr))!=-1){
            os.write(arr,0,len);
        }
        //释放资源
        bis.close();


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

青北念

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

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

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

打赏作者

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

抵扣说明:

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

余额充值