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);
    }
}
posted @ 2022-10-29 20:04  回忆也交给时间  阅读(44)  评论(0编辑  收藏  举报