HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,一个代表响应的HttpServletResponse;
- 如果要获取客户端请求过来的参数:找HttpServletRequest
- 如果要给客户端响应一些信息:找HttpServletResponse
主要方法简单分类
-
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException; PrintWriter getWriter() throws IOException;
-
负责向浏览器发送响应头的方法
void setCharacterEncoding(String charset); void setContentLength(int len); void setContentLengthLong(long len); void setContentType(String type);
响应的状态码:
- 200:请求响应成功
- 3**:请求重定向(重新到我给的新位置)
- 4**:找不到资源(资源不存在)–>400
- 5**:服务器代码错误–>500、502(网关错误)
应用-下载文件
步骤:
- 获取下载文件的路径
- 下载的的文件名
- 浏览器支持(Content-Disposition)下载
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream(输出流)的对象
- 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区的数据输出到客户端
- 关闭流
代码实现
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、下载文件的路径
//String realPath = this.getServletContext().getRealPath("/1.jsp"); //报错500,无法找到文件路径
String realPath = "D:\\JAVA\\IDEA运行代码\\javaweb-01-maven\\java-01-servlet\\response\\target\\classes\\石头.jpg"; //固定路径
//this.getServletContext().getRealPath("/1.jpg");
System.out.println("下载的路径:" + realPath);
//2、下载的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); //两个“\\”是转义为“\”,+1是截取“/”下一位就是:1.jpg
//3、浏览器支持(Content-Disposition)下载
//resp.setHeader("Content-Disposition", "attachment; filename = " + fileName); //注意filename前是分号;
resp.setHeader("Content-Disposition", "attachment; filename = " + URLEncoder.encode(fileName, "utf-8")); //URLEncoder.encode中文文件名编码,否则有可能乱码
//4、获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
//5、创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//6、获取OutputStream(输出流)的对象
ServletOutputStream out = resp.getOutputStream();
//7、将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区的数据输出到客户端
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
//8、关闭流
out.close();
in.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注意:
- 下载文件的路径 getRealPath("/")方法返回的是项目在服务器的绝对路径;
- setHeader(“Content-Disposition”, "attachment; filename = " + fileName)方法里面的filename前是分号;