Servlet也能响应图片了,快来看看吧

目录

测试Servlet响应字节数据

测试Servlet响应图片

添加缓冲池,提高图片加载效率 

提取公共元素,创建工具类ImgUtil

把图片添加到图片标签中


测试Servlet响应字节数据

根据之前的流程我们新建一个Servlet工程。

resp.getOutputStream()方法,用于输出字符流数据或者二进制的字节流数据

@WebServlet("/testByte")
public class TestByte extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 用于输出字符流数据或者二进制的字节流数据都可以
        ServletOutputStream os = resp.getOutputStream();
        // 响应一个字节
        os.write(96);
    }
}

测试Servlet响应图片

我们可以找到任何一张图片,查看图片的字节数

Servlet连接前后端的结构分布图

FileInputStream方法是IO流中的文件输入流

resp.getOutputStream方法获取字符流数据或者二进制的字节流数据,并将获取到的结果返回给ServletOutputStream

ServletOutputStream属性是将获取到的字符通过StringBuffer修改为字符串

os.write方法是将值在客户端进行响应,读取

@WebServlet("/testByte")
public class TestByte extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1、先将图片加载到程序中
        FileInputStream is = new FileInputStream("D:\\Desktop.jpg");

        // 2、将图片响应在页面上
        ServletOutputStream os = resp.getOutputStream();

        // 3、因为图片有很多个字节,所以加入循环
        // 采用边读边写的方式
        int b;
        while ((b=is.read())!=-1){
            os.write(b);
        }

        // 4、释放资源
        is.close();
        os.close();
    }
}

此时图片会在页面上响应出来,但是效果是从上往下逐帧加载的,并不是一下子显示出来。

原因就是图片的字符比较到,通过for循环遍历加载需要消耗时间

添加缓冲池,提高图片加载效率 

BufferedInputStream 表示缓冲池输入流
BufferedOutputStream 表示缓冲池输出流

write()方法是可以接收字节数组的,创建字节数组,可以使每次循环加载时,都加载1000个字节数,提高加载效率

bos.flush()方法用在IO中,即清空缓冲区数据

@WebServlet("/testByte")
public class TestByte extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1、先将图片加载到程序中
        FileInputStream is = new FileInputStream("D:\\Desktop.jpg");

        // 2、将图片响应在页面上
        ServletOutputStream os = resp.getOutputStream();

        // 5、添加缓冲池,提高图片加载效率
        // 缓冲池输入流
        BufferedInputStream bis = new BufferedInputStream(is);
        // 缓冲池输出流
        BufferedOutputStream bos = new BufferedOutputStream(os);

        // 6、添加字节数组
        byte[] bytes = new byte[1000];

        // 3、因为图片有很多个字节,所以加入循环
        // 采用边读边写的方式
        // 注意:这里每次循环都会加载bytes中的数据
        while ((bis.read(bytes))!=-1){
            bos.write(bytes);
        }

        // 4、释放资源
        bos.flush();
        bos.close();
        bis.close();
        os.close();
        is.close();
    }
}

提取公共元素,创建工具类ImgUtil

通过上诉代码的编写,已经可以发现,图片加载的流程都是一样的

不一样的只是图片的地址,我们如果将图片地址修改为参数,那么就可以封装成一个工具类

public class ImgUtil {

    public static void responseImg(String imgPath, HttpServletResponse resp){
        try{
            // 1、创建文件输入流,将图片传到Servlet中
            FileInputStream is = new FileInputStream(imgPath);

            ServletOutputStream os = resp.getOutputStream();

            // 3、创建文件缓冲流,提高读写速度
            // 缓冲池输入流
            BufferedInputStream bis = new BufferedInputStream(is);
            // 缓冲池输出流
            BufferedOutputStream bos = new BufferedOutputStream(os);
            byte[] bytes = new byte[1000];

            // 2、添加循环,边读取数据边写出输入
            while ((bis.read(bytes))!=-1){
                bos.write(bytes);
            }

            // 释放资源
            bos.flush();
            bis.close();
            bos.close();
            os.close();
            is.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

 当我们封装好工具类之后,就可以在普通类中去调用工具类中的方法

@WebServlet("/testByte")
public class TestByte extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ImgUtil.responseImg("D:\\Desktop.jpg",resp);
    }
}

把图片添加到图片标签中

以上那么多步骤,就只是完成了图片在页面的加载。但是图片的加载,并没有存放在前端代码中,而是通过后端代码,从本地读取图片。接下来我们准备将图片添加到图片标签中去

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <img src="/testByte" alt="" width="500px" height="350px">
</body>
</html>

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无念至此

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

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

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

打赏作者

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

抵扣说明:

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

余额充值