目录
测试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>