JAVAWeb - HttpServletResponse
HttpServletResponse
web服务器接收到客户端的Http请求,针对这个请求,分别创建了一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse
如果要获取客户端发送过来的请求:HttpServletRequest
如果要给客户一些响应信息:HttpServletResponse
一.简单分类
负责向浏览器发送数据的方法:
Servletoutputstream getoutputstream() throws IOException;
Printwriter getwriter() throws IOException;
负责向浏览器发送响应的头
负责向浏览器发送响应的状态码
200:正常
303:重定向
404:为找到文件
500:服务器请求不正常
二.常见引用
1.向浏览器输出消息:getWriter 等.....
2.下载文件
a.要获取下载文件的路径
b.下载文件的文件名
c.设置想办法让浏览器支持我们所需要的东西
d.获取下载文件的输入流
e.创建缓冲区
f.获取outputstream对象
g.将File outputstream流写入到buffer缓冲区中
h.使用outputstream将缓冲区的数据输出给客户端
public class Fileservlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // a.要获取下载文件的路径 String realPath="D:\\java\\javaweb-02-servlet\\response\\src\\main\\resources\\qing.png"; System.out.println("文件的路径是:"+realPath); // b.下载文件的文件名 String fileName=realPath.substring(realPath.lastIndexOf("\\")+1); // c.设置想办法让浏览器支持我们所需要的东西 resp.setHeader("Content-disposition","attachment;filename="+fileName); // d.获取下载文件的输入流 FileInputStream in = new FileInputStream(realPath); // e.创建缓冲区 int len=0; byte[] buffer = new byte[1024]; // f.获取outputstream对象 ServletOutputStream out = resp.getOutputStream(); // g.将File outputstream流写入到buffer缓冲区中 while((len=in.read(buffer))>0){ out.write(buffer,0,len); } in.close(); out.close(); // h.使用outputstream将缓冲区的数据输出给客户端 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
所谓的用response下载文件,实际上就是对IO流的操作
3.实现验证码功能
public class ImageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //如何让浏览器3秒自动刷新一次 resp.setHeader("refresh","3"); //在内存中创建一个图片 BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);//一张纸 //得到图片 Graphics2D g =(Graphics2D) image.getGraphics();//一支笔 //设置背景颜色 g.setColor(Color.WHITE);//背景颜色 g.fillRect(0,0,80,20);//画笔画数据的位置 //给图片写数据 g.setColor(Color.BLUE);//设置字体颜色 g.setFont(new Font(null,Font.BOLD,20));//设置字体 g.drawString(makenum(),0,20);//写入字符串 //告诉浏览器这个请求用图片打开 resp.setContentType("image/jpeg"); //网站存在缓存,我们不让它缓存 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Pragma","no-cache"); //把图片写给浏览器 ImageIO.write(image,"jpg",resp.getOutputStream()); } private String makenum(){ Random random = new Random(); String num = random.nextInt(9999999)+""; StringBuffer sb = new StringBuffer(); for (int i = 0; i <7-num.length(); i++) { sb.append("0"); } num = sb.toString() + num; return num; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
a.利用response来实现验证码功能,我们需要用的BufferImage这个对象,创建一个图片,这个时候我们只获得了一个框架,上面什么都没有
b.后端实现验证码实际上是一个作画的过程,所以我们就要画上去一个验证码,就需要一支画笔来画验证码 (Graphics2D) image.getGraphics() 这个方法来得到一支画笔
c.我们在使用所创建的框架时,首先要填充颜色,这第一次填充的实际上就是背景颜色,然后对我们画图片画在哪里做一个位置描述,使用 fillRect 方法,里面的四个属性分别是:x轴,y轴,图片宽,图片高
d.这里再次使用设置笔的颜色,实际上是用于对写入数据的颜色控制,然后设置字体,并且用 draw 方法选择画什么类型的数据,这里我们选用画一个字符串 drawString 方法
注:到这里结束我们就成功的写好了一张验证码了
e.然后再对浏览器进行一些配置,都是教科书式配置,照抄就完了,比如,让浏览器用图片的方式打开,不让浏览器对图片进行缓存 ,等等.....
f.最后通过io流的方式把图片写给浏览器 ImageIO.write 方法进行写出图片
4.response实现重定向
一个web资源收到了客户端的请求后,他会通知客户端去访问另外一个web资源,这个过程就叫重定向
常见应用场景:
用户登录
重定向和请求转发的区别:
相同点:页面都会实现跳转
不同点:
请求转发的url的地址栏不会发生变化
重定向的url地址栏会发生变化
public class RediectServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.sendRedirect("/img");//重定向代码 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }