您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
10-Response响应字符&字节数据(使用IOUtils响应一张图片)
发布时间:2024-11-30 20:29:40编辑:雪饮阅读()
-
response响应字符,一般是给浏览器响应。
package com;
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.io.PrintWriter;
@WebServlet("/HttpServlet18")
public class HttpServlet18 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer=resp.getWriter();
writer.write("hello world!");
}
}
像是这样,你在浏览器中访问如http://localhost:8081/servlet01/HttpServlet18
则浏览器中会显示如:
hello world!
但如果你写入html代码进行响应
writer.write("hello world!");
writer.write("<h1>hello world!</h1>");
像是这样它会在浏览器中原样显示
hello world!<h1>hello world!</h1>
而并不会解析。
除非你设置content-type为text/html
resp.setHeader("content-type","text/html");
PrintWriter writer=resp.getWriter();
writer.write("hello world!");
writer.write("<h1>hello world!</h1>");
这里的一个细节是PrintWriter这个打印输出流是不需要关闭的,请求结束就会自动关闭的。
但如果响应里面包含中文结果是又会出现乱码情况。那你可以这样直接用setHeader连同编码一起写进content-type的值里面。
resp.setHeader("content-type","text/html;charset=utf-8");
PrintWriter writer=resp.getWriter();
writer.write("你好 世界!");
writer.write("<h1>hello world!</h1>");
当然也可以单独用专门设置响应内容类型的方法setContentType
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer=resp.getWriter();
writer.write("你好 世界!");
writer.write("<h1>hello world!</h1>");
response响应字节数据
响应字节数据其实就是例如给浏览器响应一个文件,例如图片。
原理就是打开图片的文件输入流,将图片的字节数据拷贝到浏览器请求过来相对于服务器来说的一个输出流中。则实现如:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
FileInputStream fis=new FileInputStream("D:\\wallpaper\\js_11.jpg");
ServletOutputStream os=resp.getOutputStream();
//从输入流,拷贝到输出流,定义一个1024的缓冲区,这个缓冲区大小一般比较随意,别离谱就行
byte[] buff=new byte[1024];
int len=0;
//read:读入缓冲区的总字节数,如果由于到达文件末尾而没有更多数据,则返回-1。
while((len=fis.read(buff))!=-1){
//写入到输出流
os.write(buff,0,len);
}
//这里输出流不用关闭会请求结束自动关闭,但输入流是一个文件输入流,会占用文件打开的文件句柄,所以需要手动关闭下
fis.close();
}
其实在windows中这个文件输入流里面的路径分隔符还可以这样
FileInputStream fis=new FileInputStream("D:/wallpaper/js_11.jpg");
这样更简洁,\反而要转义。
那么此时访问浏览器url如http://localhost:8081/servlet01/HttpServlet18,则会直接显示一个图片。
这里从输入流拷贝到输出流细节写起来还是挺麻烦的。
那么其实有个更简洁的做法。
更简洁的做法,在pom中定义一个坐标依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
那么接下来servlet中像是这样实现就更简单了
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
FileInputStream fis=new FileInputStream("D:/wallpaper/js_11.jpg");
ServletOutputStream os=resp.getOutputStream();
IOUtils.copy(fis,os);
fis.close();
}
关键字词:Response,IOUtils,图片,字符,字节,流
相关文章
- 08-Response设置响应数据功能介绍&完成重定向
- 01-Request和Response介绍&Request继承体系(获取get请
- 图片上传保存逻辑(laravel11+breeze+inertia+vue3实现
- 难用的苹果电脑mac系统其之六如何截屏?如何共享截屏图
- 15_案例_校验用户名是否存在(setContentType对于jquery
- 安卓okhttp发送json与解析json(支持嵌套)
- 5_Filter_细节_执行流程&生命周期(filter创建模板与生
- 24_案例_验证码_代码实现(equalsIgnoreCase在比较字符
- 15_JSP_入门学习(out与response缓冲区的优先级)
- 13_Response_案例4_验证码_代码实现(随机验证码、干扰