HttpServletResponse
web服务器接收到客户端的http请求,会针对这个请求分别创建一个代表请求的request对象,和代表响应的一个response对象;
- 如果要获取客户端请求过来的参数,找request
- 如果要给客户端响应一些信息,找response
简单分类
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream();//其他
PrintWriter getWriter();//中文
负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
响应状态码
常见应用
1. 向浏览器输出消息
2.下载文件
- 要获取下载文件的路径
- 下载的文件名是什么
- 设置想办法让浏览器能够支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutPutStream对象
- 将FileOutPutStream流写入buffer缓冲区
- 使用OutPutStream将缓冲区中的数据输出到客户端
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 要获取下载文件的路径
String realPath = this.getServletContext().getRealPath("/xxxx.md");
//2. 下载的文件名是什么
String fileName = realPath.substring(realPath.lastIndexOf("//")+1);//转义"/"
//3. 设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
//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);
}
in.close();
out.close();
}
}
验证码功能
验证码怎么来的?
- 前端实现
- 后端实现,用Java的图片类实现,生成一个图片
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器3s刷新一次
resp.setHeader("refresh","3");
//在内存中创建一个图片,宽高
BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_3BYTE_BGR);
//得到图片
Graphics2D graphics = (Graphics2D) image.getGraphics();//笔
//设置图片的背景颜色
graphics.setColor(Color.white);
graphics.fillRect(0,0,80,20);
//给图片写数据
graphics.setColor(Color.BLUE);//设置笔的颜色
//设置字体
graphics.setFont(new Font(null,Font.BOLD,20));
graphics.drawString(makeNum(),0,20);
//告诉浏览器这个请求用图片方式打开
resp.setContentType("image/png");
//不让浏览器缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache0Control","no-cache");
resp.setHeader("pragma","no-cache");
//把图片写给浏览器
ImageIO.write(image,"jpg",resp.getOutputStream());
}
//生成随机数
private String makeNum(){
Random random = new Random();
String num = random.nextInt(99999999) + "";
StringBuffer stringBuffer = new StringBuffer();
//用0填充保证生成是8位
for(int i = 0; i < 7-num.length(); i++){
stringBuffer.append("0");
}
String s = stringBuffer.toString() + num;
return s;
}
}
Response重定向
一个Web资源收到客户端请求后,他会通知客户端去访问另一个web资源,这个过程叫重定向
常见场景:
-
用户登录
void sendRedirect(String val1) throws IOException;
测试:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //加项目地址 resp.sendRedirect("/r/index.jsp"); //url地址发生了变化 //原理: resp.setHeader("Location","r/index.jsp"); resp.setStatus(302); }
重定向和转发的区别
- 相同点:
- 页面都会实现跳转
- 不同点
- 请求转发的时候,url不会发生变化
- 重定向时,url地址栏会发生变化
重定向时一定要注意路径问题