请求和响应

news2024/11/27 12:58:19

目录

  • 1 请求对象
    • 1.1 请求对象介绍
    • 1.2 请求对象常用方法-获取各自路径
    • 1.3 请求对象常用方法-获取请求头信息
    • 1.4 请求对象常用方法-请求参数信息
    • 1.5 获取请求参数并封装对象
      • 1.5.1 手动封装方式
      • 1.5.2 反射封装方式
      • 1.5.3 工具类封装方式
    • 1.6 流对象获取请求信息
    • 1.7 中文乱码问题
    • 1.8 请求域
    • 1.9 请求转发
    • 1.10 请求包含
  • 2 响应对象
    • 2.1 响应对象介绍
    • 2.2 常见状态码
    • 2.3 字节流响应消息
    • 2.4 字符流响应消息
    • 2.5 响应图片
    • 2.6 设置缓存
    • 2.7 定时刷新
    • 2.8 请求重定向
    • 2.9 文件下载

1 请求对象

1.1 请求对象介绍

  • 请求:获取资源。在 BS 架构中,就是客户端浏览器想服务器端发出询问
  • 请求对象:就是在项目中用于发送请求的对象

1.2 请求对象常用方法-获取各自路径

在这里插入图片描述

  • 代码演示
package com.txt.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("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取虚拟目录名称
        String contextPath = req.getContextPath();
        System.out.println(contextPath);

        //2.获取Servlet映射路径
        String servletPath = req.getServletPath();
        System.out.println(servletPath);

        //3.获取访问者ip
        String ip = req.getRemoteAddr();
        System.out.println(ip);

        //4.获取请求消息数据
        String queryString = req.getQueryString();
        System.out.println(queryString);

        //5.获取统一资源标识符
        String requestURI = req.getRequestURI();
        System.out.println(requestURI);

        //6.获取统一资源定位符
        StringBuffer requestURL = req.getRequestURL();
        System.out.println(requestURL);
    }

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

  • 演示效果:
    在这里插入图片描述

1.3 请求对象常用方法-获取请求头信息

在这里插入图片描述

  • 代码演示:
package com.txt.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.util.Enumeration;

@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //根据请求头名称获取一个值
        String connection = req.getHeader("connection");
        System.out.println(connection);
        System.out.println("-----------------------");

        //根据请求头的名称获取多个值
        Enumeration<String> headers = req.getHeaders("accept-encoding");
        while(headers.hasMoreElements()){
            String header = headers.nextElement();
            System.out.println(header);
        }
        System.out.println("-----------------------");

        //获取所有的请求头名称
        Enumeration<String> names = req.getHeaderNames();
        while (names.hasMoreElements()){
            String name = names.nextElement();
            String value = req.getHeader(name);
            System.out.println(name + ":" +value);
        }
    }

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

  • 效果如下:
    在这里插入图片描述

1.4 请求对象常用方法-请求参数信息

在这里插入图片描述

  • 代码演示
package com.txt.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.util.Enumeration;
import java.util.Map;

@WebServlet("/servletDemo03")
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1. 根据名称获取数据
        String username = req.getParameter("username");
        System.out.println(username);
        String pwd = req.getParameter("pwd");
        System.out.println(pwd);
        System.out.println("---------------------------------");

        //2.根据名称获取所有数据
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies){
            System.out.println(hobby);
        }
        System.out.println("---------------------------------");

        //3.获取所有名称
        Enumeration<String> names = req.getParameterNames();
        while(names.hasMoreElements()){
            String name = names.nextElement();
            System.out.println(name);
        }
        System.out.println("---------------------------------");

        //获取所有参数的键值对
        Map<String, String[]> map = req.getParameterMap();
        for (String key : map.keySet()){
            String[] values = map.get(key);
            System.out.print(key + ":");
            for (String value : values){
                System.out.print(value + " ");
            }
            System.out.println();
        }

    }

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

  • 效果如下
    在这里插入图片描述

1.5 获取请求参数并封装对象

  1. 手动封装方式
  2. 反射封装方式
  3. 工具类封装方式

1.5.1 手动封装方式

  • 代码演示
package com.txt.servlet;

import com.txt.bean.Student;

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.util.Enumeration;
import java.util.Map;

@WebServlet("/servletDemo04")
public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取所有的数据
        String username = req.getParameter("username");
        String pwd = req.getParameter("pwd");
        String[] hobbies = req.getParameterValues("hobby");

        //2.封装学生对象
        Student stu = new Student(username,pwd,hobbies);

        //输出对象
        System.out.println(stu);
    }

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

//学生类
package com.txt.bean;

import java.util.Arrays;

public class Student {
    private String username;
    private String pwd;
    private String[] hobby;

    public Student() {
    }

    public Student(String username, String pwd, String[] hobby) {
        this.username = username;
        this.pwd = pwd;
        this.hobby = hobby;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "Student{" +
                "username='" + username + '\'' +
                ", pwd='" + pwd + '\'' +
                ", hobby=" + Arrays.toString(hobby) +
                '}';
    }
}

  • 效果如下:
    在这里插入图片描述

1.5.2 反射封装方式

  • 代码演示
package com.txt.servlet;

import com.txt.bean.Student;

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.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Map;

//反射封装方式
@WebServlet("/servletDemo05")
public class ServletDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取所有的数据
        Map<String, String[]> map = req.getParameterMap();

        //2.封装学生对象
        Student stu = new Student();
        //2.1 遍历集合
        for (String name : map.keySet()){
            String[] value = map.get(name);
            //2.2 获取 Student对象的属性描述器
            try {
                PropertyDescriptor pd = new PropertyDescriptor(name,stu.getClass());
                //2.3 获取对应的setXxx方法
                Method writeMethod = pd.getWriteMethod();
                //执行方法
                if (value.length > 1){
                    writeMethod.invoke(stu,(Object) value);
                }else {
                    writeMethod.invoke(stu,value);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        //输出对象
        System.out.println(stu);
    }

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


1.5.3 工具类封装方式

我们需要引入jar包
在这里插入图片描述

  • 代码演示
package com.txt.servlet;

import com.txt.bean.Student;
import org.apache.commons.beanutils.BeanUtils;

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.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;

//工具类封装方式
@WebServlet("/servletDemo06")
public class ServletDemo06 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取所有的数据
        Map<String, String[]> map = req.getParameterMap();

        //2.封装学生对象
        Student stu = new Student();
        try {
            BeanUtils.populate(stu,map);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        //输出对象
        System.out.println(stu);
    }

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

1.6 流对象获取请求信息

在这里插入图片描述

  • 代码演示
package com.txt.servlet;

import com.txt.bean.Student;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Map;


@WebServlet("/servletDemo07")
public class ServletDemo07 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //字符流(必须是post方式)
        /*BufferedReader br = req.getReader();
        String line;
        while ((line = br.readLine()) != null){
            System.out.println(line);
        }*/

        //字节流
        ServletInputStream is = req.getInputStream();
        byte[] arr = new byte[1024];
        int len;
        while ((len = is.read(arr)) != -1){
            System.out.println(new String(arr,0,len));
        }
    }

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

  • 效果如下
    在这里插入图片描述

1.7 中文乱码问题

  • GET 方式
    没有乱码问题,在 Tomcat 8 版本后已经解决
  • POST 方式
    有乱码问题。可以通过 setCharacterEncoding() 方法来解决
    • 代码演示
package com.txt.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
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("/servletDemo08")
public class ServletDemo08 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");

        String username = req.getParameter("username");
        System.out.println(username);
    }

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

1.8 请求域

  • 请求域(request 域):可以再一次请求范围内进行共享数据
  • 一般用于请求转发的多个资源中共享数据
  • 请求对象操作共享数据方法
    在这里插入图片描述

1.9 请求转发

  • 请求转发:客户端的一次请求到达后,发现需要借助其他 Servlet 来实现功能
  • 特点
    • 浏览器地址栏不变
    • 域对象中的数据不丢失
    • 负责转发的 Servlet 转发前后的响应正文会丢失
    • 由转发的目的地来响应客户端
      在这里插入图片描述
  • 代码演示
    servletDemo09:
package com.txt.servlet;

import javax.servlet.RequestDispatcher;
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("/servletDemo09")
public class ServletDemo09 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置共享数据
        req.setAttribute("encoding","gbk");

        //获取请求调度对象
        RequestDispatcher rd = req.getRequestDispatcher("/servletDemo10");

        //实现转发功能
        rd.forward(req,resp);
    }

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

servletDemo10:

package com.txt.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("/servletDemo10")
public class ServletDemo10 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取共享数据
        Object encoding = req.getAttribute("encoding");
        System.out.println(encoding);

        System.out.println("servletDemo10 执行了...");
    }

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

1.10 请求包含

  • 请求包含:可以合并其他 Servlet 中的功能一起响应给客户端
  • 特点:
    • 浏览器地址栏不变
    • 域对象中的数据不会丢失
    • 被包含的 Servlet 的响应头会丢失
      在这里插入图片描述

2 响应对象

2.1 响应对象介绍

  • 响应:回馈结果。在 BS 架构中,就是服务器给客户端浏览器反馈结果。
  • 响应对象:就是在项目中用于发送响应的对象

2.2 常见状态码

在这里插入图片描述

2.3 字节流响应消息

在这里插入图片描述

  • 代码演示
package com.txt.servlet;

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.nio.charset.StandardCharsets;

@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");

        //获取字节流输出对象
        ServletOutputStream os = resp.getOutputStream();

        //定义一个消息
        String str = "你好";

        //通过字节流对象输出
        os.write(str.getBytes(StandardCharsets.UTF_8));
    }

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

2.4 字符流响应消息

在这里插入图片描述

  • 代码演示
package com.txt.servlet;

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;
import java.nio.charset.StandardCharsets;
//字符流响应消息
@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");

        //获取字符输出流对象
        PrintWriter pw = resp.getWriter();

        //准备一个消息
        String str = "你好";

        //通过字符输出流输出
        pw.write(str);
    }

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

2.5 响应图片

  1. 创建字节输入流对象,关联读取的图片路径
  2. 通过响应对象获取字节输出流对象
  3. 循环读取和写出图片
package com.txt.servlet;

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/qiu.jpg");

//        1. 创建字节输入流对象,关联读取的图片路径
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));

//        2. 通过响应对象获取字节输出流对象
        ServletOutputStream os = resp.getOutputStream();

//        3. 循环读取和写出图片
        byte[] bys = new byte[1024];
        int len;
        while ((len = bis.read(bys)) != -1){
            os.write(bys,0,len);
        }

        //释放资源
        bis.close();

    }

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

2.6 设置缓存

  • 缓存:对于不经常变化的数据,我们可以设置合理缓存时间,以避免浏览器频繁请求服务器,以此来提高效率!
  • 在这里插入图片描述
  • 代码演示
package com.txt.servlet;

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 = "这是一条很火爆的新闻";

       //设置缓存 1小时的缓存时间
        resp.setDateHeader("Expires",System.currentTimeMillis() + 60 * 60 * 1000);


       //设置编码
        resp.setContentType("text/html;charset=UTF-8");

        //写出数据
        resp.getWriter().write(news);

        System.out.println("aaa");
    }

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

2.7 定时刷新

  • 定时刷新:过了指定时间后,页面自动进行跳转
    在这里插入图片描述
  • 代码演示
package com.txt.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("/servletDemo05")
public class ServletDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String str = "您的用户名和密码有误,3秒后自动跳转到登录页面";

       //设置编码格式
        resp.setContentType("text/html;charset=UTF-8");
        //写数据
        resp.getWriter().write(str);

        resp.setHeader("Refresh","3;URL=/response/login.html");
    }

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

2.8 请求重定向

  • 请求重定向:客户端的一次请求到达后,发现需要借助其他 Servlet 来实现功能
  • 特点:浏览器地址栏会发生改变,两次请求、请求域对象中不能共享数据,可以重定向到其他服务器
  • 响应对象重定向方法
    在这里插入图片描述
  • 代码演示
    ServletDemo06
package com.txt.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("/servletDemo06")
public class ServletDemo06 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servletDemo06 执行了...");

        //设置共享数据
        req.setAttribute("username","zhangsan");

        //请求重定向
        resp.sendRedirect(req.getContextPath() + "/servletDemo07");

//        resp.sendRedirect("https://www.baidu.com");
    }

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

ServletDemo07

package com.txt.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("/servletDemo07")
public class ServletDemo07 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servletDemo07 执行了...");

        //获取共享数据
        Object username = req.getAttribute("username");
        System.out.println(username);
    }

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

  • 运行效果
    在这里插入图片描述

2.9 文件下载

  1. 创建字节输入流,关联读取文件
  2. 设置响应消息头支持的类型
  3. 设置响应消息头以下载方式打开资源
  4. 通过响应对象获取字节输出流对象
  5. 循环读写
  6. 释放资源
  • 代码演示
package com.txt.servlet;

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("/servletDemo08")
public class ServletDemo08 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1. 创建字节输入流,关联读取文件
        String realPath = getServletContext().getRealPath("/img/qiu.jpg");
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));

//        2. 设置响应消息头支持的类型
        resp.setHeader("Content-Type","application/octet-stream");

//        3. 设置响应消息头以下载方式打开资源
        resp.setHeader("Content-Disposition","attachment;filename=qiu.jpg");

//        4. 通过响应对象获取字节输出流对象
        ServletOutputStream os = resp.getOutputStream();
//        5. 循环读写
        byte[] bys = new byte[1024];
        int len;
        while ((len = bis.read(bys)) != -1){
            os.write(bys,0,len);
        }
//        6. 释放资源
        bis.close();
    }

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/49845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可发生点击化学反应:1458576-00-5,Biotin-PEG4-alkyne,生物素-四聚乙二醇-炔

【中文名称】生物素-四聚乙二醇-炔&#xff0c;生物素-四聚乙二醇-丙炔基 【英文名称】 Biotin-PEG4-alkyne 【货号】Y-PE-2172 【CAS】1458576-00-5 【分子式】C21H35N3O6S 【分子量】457.58 【基团】alkyne 【纯度】95% 【规格】25mg&#xff0c;100mg&#xff0c;250mg 【是…

如何应对继承的双面性

如何应对继承的双面性 继承既强大又有破坏性&#xff0c;那怎么办呢&#xff1f; 1&#xff09;避免使用继承&#xff1b; 2&#xff09;正确使用继承。 我们先来看怎么避免继承&#xff0c;有三种方法&#xff1a; 使用final关键字&#xff1b; 优先使用组合而非继承&#…

11月30日:linux服务器安装以及部署项目

准备一个连接linux服务器的可视化工具&#xff0c;开始发车 推荐使用国产&#xff1a; finalshell 下载地址&#xff1a;FinalShell SSH工具,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux,版本3.9.7,更新时间2022.10.26 - SSH工具 SSH客户端 xshell&#xff1a;安装…

Spring Cloud Gateway微服务网关快速入门

介绍 Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等技术开发的网关&#xff0c;Spring Cloud Gateway 旨在为微服务架构提供一种简单而有效的统一的 API 路由管理方式。Spring Cloud Gateway 作为 Spring Cloud 生态…

Kamiya丨Kamiya艾美捷人乳铁蛋白ELISA说明书

Kamiya艾美捷人乳铁蛋白ELISA预期用途&#xff1a; 人乳铁蛋白ELISA是一种高度灵敏的双位点酶联免疫测定&#xff08;ELISA&#xff09;人类生物样品中乳铁蛋白的测定。仅供研究使用。不用于诊断程序。 引言 乳铁蛋白&#xff08;LF&#xff09;是一种具有抗菌活性的多功能铁…

运动“双十一”持续走热,缤跃酒店洞察市场需求,创新打造运动健康酒店!

2022年“双十一”购物促销活动刚刚结束&#xff0c;各大品牌陆续开始展示肌肉&#xff0c;在众多数据中运动健身领域相关数据不容忽视&#xff0c;居家健身器械等商品持续走热&#xff0c;户外运动设备销售量也保持热度。由此可见&#xff0c;在当下全民运动热潮下&#xff0c;…

uniapp开发微信小程序实现语音识别,使用微信同声传译插件,

第一步&#xff1a;在微信小程序管理后台&#xff1a;“设置”-》“第三方设置”-》“插件管理”中添加插件。 但是这个地方&#xff0c;没有搜索到插件&#xff0c;就到微信服务市场 搜索到以后添加到需要的小程序里面&#xff0c;然后返回管理中心查看&#xff0c;就可以看…

Css3 3D转换

特点&#xff1a; 近大远小物体后面遮挡不可见 三维坐标系&#xff1a; 三维坐标系其实就是指立体空间&#xff0c;立体空间是由3个轴共同组成的。 X轴&#xff1a;水平向右为正 Y轴&#xff1a;垂直向下为正 Z轴&#xff1a;垂直屏幕向外为正 3D位移和3D旋转&#xff1a…

曲柄压力机的离合器和制动系统设计

目 录 摘 要 I ABSTRACT II 第1章 绪论 1 1.1压力机发展的概况 1 1.2压力机工作原理 1 1.2.1压力机功能简介 1 1.2.2压力机的工作原理简介 3 1.3 压力机的分类 3 1.4 压力机的主要参数和型号 4 1.5本次设计压力机参数及内容 6 1.5.1主要技术参数 6 1.5.2设计内容 6 第二章 曲柄…

学妹居然叫我帮她P证件照自拍,结果发现.........

前因后果 事情是这样的 晚上我正在聚精会神写代码&#xff08;打游戏~&#xff09; 突然&#xff0c;收到学妹给我发来的消息 还有一张自拍照 而且是可以放在结婚证上的那种哦 原来是照片尺寸不合适 让我帮她修图。还要什么蓝底、红底各种背景的 效果 1、尺寸长宽调整为&…

有序数组转换为二叉查找树

问题描述 给定一个整数数组&#xff0c;其元素为先序排列&#xff0c;将其转换为高度平衡的二叉查找树。 示例 示例1 Input: nums [-10,-3,0,5,9] Output: [0,-3,9,-10,null,5] Explanation: [0,-10,5,null,-3,null,9] is also accepted: 示例2 Input: nums [1,3] Output: …

STM32实战总结:HAL之触摸屏

输入类设备简介 IO输入输出&#xff0c;是计算机系统中的一个概念。计算机的主要功能就是从外部获取数据然后进行计算加工得到目标数据并输出给外部&#xff08;计算机可以看成数据处理器&#xff09;。计算机和外部交互就是通过IO。每一台计算机都有个标准输入和标准输出。 常…

业务:财务会计业务知识

一、引言 会计是以货币为主要计量单位&#xff0c;对企业、事业、机关、团体及其他经济组织的经济活动进行记录、计算、控制、分析、报告&#xff0c;以提供财务和管理信息的工作。会计的职能主要是反映和控制经济活动过程&#xff0c;保证会计信息的合法、真实、准确和完整&a…

像素坐标和实际坐标的转换

文章目录像素坐标系图像坐标系小孔成像原理相机坐标系畸变参数像素坐标系 像素坐标系uov是一个二维直角坐标系&#xff0c;反映了相机CCD/CMOS芯片中像素的排列情况。原点o位于图像的左上角&#xff0c;u轴、v轴分别于像面的两边平行。像素坐标系中坐标轴的单位是像素&#xf…

新手python的自学总结(已拿到百度offer)

今天给大家分享一个小伙伴自学Python找到工作的文章。 先简单介绍一下小伙伴的情况。是非科班出身的&#xff0c;虽然高中读的是理科&#xff0c;但是进入大学学了一个文科专业&#xff0c;之后就再没接触过理工科的东西。对计算机也是一窍不通&#xff0c;大学才刚开始接触电…

Linux源码——启动流程1

主要 大概流程就是&#xff1a; 通电自检-----》bios----》bootloader —》内核。其中内核这部分是这篇主要的&#xff0c;通过bootloader初始化好一些条件&#xff0c;然后调用kernel_entry()开始正式进入内核之中&#xff0c;后面就是内核操作了&#xff0c;启动进程什么的…

Java知识点

Java浅拷贝 Java的深拷贝和浅拷贝 - YSOcean - 博客园 (cnblogs.com) Clone 是 Object 类中的一个方法&#xff0c;通过对象A.clone() 方法会创建一个内容和对象 A 一模一样的对象 B&#xff0c;clone 克隆&#xff0c;顾名思义就是创建一个一模一样的对象出来&#xff08;浅…

如何确保海外服务器的高可用性?

服务器正常运行时间和站点可用性是每个企业的首要任务。但对于那些通过在线业务盈利的公司来说&#xff0c;确保可靠性是最重要的。然而&#xff0c;任何意外停机都是有代价的&#xff0c;而硬件故障是最常见的原因。不过好在这也是可以预防的。那么&#xff0c;如何确保海外服…

怎样把网页上的音频转换成mp3格式?试试这几个转换方法

大家平时喜欢听音乐吗&#xff1f;我经常会在网上保存一些不错的音频到设备上&#xff0c;这样子就方便我可以随时播放了。那你们有遇到过该音频格式不支持播放的情况吗&#xff1f;这种情况是因为播放器兼容的音频格式比较少&#xff0c;需要我们将音频格式转换成播放器兼容的…

如何发现Python依赖库漏洞

因为python编程的流行&#xff0c;python的各种库也越来越多&#xff0c;但许多小伙伴可能只注意到了自己编程所要依赖的环境&#xff0c;但是却忽略了库的版本也有可能存在漏洞的风险&#xff0c;如果不及时检查和更新python依赖库&#xff0c;那么很有可能你写的代码本身就存…