Servlet——Response请求对象-笔记整理

Response响应对象

常见状态码

状态码说明
200成功
302重定向
304请求资源未改变
400请求错误,常见于请求参数错误
404请求资源未找到
405请求方式不支持
500服务器错误
  • 405:请求方式不支持,例如:一般是后台只支持post请求,而发起的请求确实get请求,这时候就会提示405

  • 状态码首位含义:

    状态码说明
    1xx消息
    2xx成功
    3xx重定向
    4xx客户端错误
    5xx服务器错误

响应对象的使用示例

字节流响应消息&解决乱码

  • 字节流响应API

    返回值方法名说明
    ServletOutputStreamgetOutputStream()获取响应字节输出流对象
    voidsetContentType(“text/html;charset=UTF-8”)设置响应内容类型,解决中文乱码问题
    • 字节流,常用于处理图片,文件
    @WebServlet("/servletDemo01")
    public class ServletDemo01 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            /*
                项目中常用的编码格式是utf-8,而浏览器默认使用的编码是gbk。导致乱码!
             */
            //1. 获取字节流输出对象
            ServletOutputStream sos = resp.getOutputStream();
    	    //2. 定义一个消息
            String str = "你好";
            //通过字节流对象输出
            sos.write(str.getBytes());//getBytes不带参数,默认获取操作系统的编码集(我们安装的都是中文windows,所以系统编码集是gbk)
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    
  • 要想出现乱码,修改代码:

    sos.write(str.getBytes("UTF-8"));
    
  • 解决乱码

    /*
     项目中常用的编码格式是u8,而浏览器默认使用的编码是gbk。导致乱码!
     解决方式一:修改浏览器的编码格式(不推荐,不能让用户做修改的动作)
     解决方式二:通过输出流写出一个标签:<meta http-equiv='content-type' content='text/html;charset=UTF-8'>
     解决方式三:response.setHeader("Content-Type","text/html;charset=UTF-8");  指定响应头信息
     解决方式四:response.setContentType("text/html;charset=UTF-8");
    */
    //sos.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());
    
    //resp.setHeader("Content-Type","text/html;charset=UTF-8");
    resp.setContentType("text/html;charset=UTF-8");//常用第四种,告知浏览器采用utf-8编码方式
    

字符流响应消息&解决乱码

  • 字符流API

    返回值方法名说明
    PrintWritergetWriter()获取响应字符输出流对象
    voidsetContentType(“text/html;charset=UTF-8”)设置响应内容类型,解决中文乱码问题
    • 字符流,常用于处理文字
    @WebServlet("/servletDemo02")
    public class ServletDemo02 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1. 准备一个消息
            String str = "你好";
            //2. 获取字符流对象
            PrintWriter pw = resp.getWriter();
            //3. 通过字符流输出
            pw.write(str);
            //pw.close();
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    
  • 解决

    //解决中文乱码
    resp.setContentType("text/html;charset=UTF-8");
    
  • 解决乱码总结

    • 如果是响应解决乱码问题,一般思路就是让浏览器与代码中的编码风格保持一致(utf-8)

       resp.setContentType("text/html;charset=UTF-8");
      
    • 如果请求中解决乱码,将gbk编码的中文信息转换为utf-8

      //设置编码格式 (将浏览器默认编码gbk的中文信息,转换为utf-8的信息)
       req.setCharacterEncoding("UTF-8");
      

响应图片

  1. 创建字节输入流对象,关联读取的图片路径

  2. 通过响应对象获取字节输出流对象

  3. 循环读取和写出图片

  4. 将a.png,copy到web/img目录下

  5. 案例:

    @WebServlet("/servletDemo03")
    public class ServletDemo03 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1. 创建字节输入流对象,关联图片路径
            String realPath = getServletContext().getRealPath("/img/a.png");
            System.out.println(realPath);
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));
    	    //注意:不能直接指定图片路径,需要同getRealPath获取,因为项目还要发布,我们需要获取到发布之后的图片路径
            //BufferedInputStream bis = new BufferedInputStream(new FileInputStream(/img/a.png));
            //2. 获取字节输出流对象
            ServletOutputStream sos = resp.getOutputStream();
            //3. 循环读写
            byte[] arr = new byte[1024];
            int len;
            while((len = bis.read(arr)) != -1) {
                sos.write(arr,0,len);
            }
            bis.close();
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    

设置缓存时间

  • 缓存:对于不经常变化的数据,我们可以设置合理缓存时间,以避免浏览器频繁请求服务器。以此来提高效率

  • 缓存API

    返回值方法名说明
    voidsetDateHeader(String name,long time)设置消息头添加缓存
  • 案例:

    @WebServlet("/servletDemo04")
    public class ServletDemo04 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String news = "这是一条很火爆的新闻~";
            //设置缓存时间:1小时的缓存时间
            //参数1:Expires:失效的意思
            //参数2:当前时间+1小时毫秒值(意思就是在1小时之后过期)
            resp.setDateHeader("Expires",(System.currentTimeMillis()+1*60*60*1000L));
            //设置编码格式
            resp.setContentType("text/html;charset=UTF-8");
            //写出数据
            resp.getWriter().write(news);
            System.out.println("aaa");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    
  • 第一次访问:发现执行了Servlet,并且打印了aaa

  • 此时,这个Servlet已经被缓存下来了

  • 第二次访问执行了Servlet,并且控制台没有打印aaa

设置定时刷新

  • 定时刷新:过了指定时间后,页面自动进行跳转

  • 定时刷新API

    返回值方法名说明
    voidsetHeader(String name,String value)设置消息头定时刷新
  • 案例:

    @WebServlet("/servletDemo05")
    public class ServletDemo05 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String news = "您的用户名或密码错误,3秒后自动跳转到登录页面...";
            //设置编码格式
            resp.setContentType("text/html;charset=UTF-8");
            //写出数据
            resp.getWriter().write(news);
            //设置响应消息头定时刷新
    	    //Refresh:刷新
            //第二个参数第一部分:3,3设之后
            //第二个参数第二部分:跳转到哪个路径
            resp.setHeader("Refresh","3;URL=/login.html");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    
  • 在web目录下新建login.html

  • 访问:3s之后自动跳转到login.html

请求重定向

  • 请求重定向:客户端的一次请求到达后,发现需要借助其他的Servlet来实现功能。

  • 特点:浏览器地址栏会发生改变,再次请求、请求域对象中不能共享数据,可以重定向到其它服务器。

  • 重定向实现原理:

    //设置响应状态码为302
    resp.setStatus(302);
    //设置响应的资源路径(响应到哪里去,通过响应消息头location来指定)
    resp.setHeader("location","/responseDemo07");
    
  • 响应对象重定向方法

    返回值方法名说明
    voidsendRedirect(String name)设置重定向
  • 案例:

    @WebServlet("/servletDemo06")
    public class ServletDemo06 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置请求域数据
            req.setAttribute("username","zhangsan");
            //设置重定向
            resp.sendRedirect(req.getContextPath() + "/servletDemo07");		
    		//resp.sendRedirect("https://www.baidu.com");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    
  • 获取共享数据

    @WebServlet("/servletDemo07")
    public class ServletDemo07 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("servletDemo07执行了...");
            Object username = req.getAttribute("username");
            System.out.println(username);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    
  • 重定向与转发的区别

  • 重定向:

    • 两次请求
    • 地址栏发生变化
    • 不可以使用request域共享数据 (既然是两次请求,那肯定不能使用请求域中共享的数据)
    • 可以重定向到其他服务器的url
  • 转发:

    • 一次请求
    • 地址栏不发生变化
    • 可以使用request域共享数据
    • 只能转发到自己服务器内部的url

响应对象-文件下载

  • 案例:

    @WebServlet("/servletDemo08")
    public class ServletDemo08 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1.创建字节输入流,关联读取的文件
            //获取文件的绝对路径
            String realPath = getServletContext().getRealPath("/img/a.png");
            //创建字节输出流对象
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath));
            
            //2.设置响应头支持的类型  应用支持的类型为字节流
            /*
                Content-Type 消息头名称   支持的类型
                application/octet-stream   消息头参数  应用类型为字节流
             */
            resp.setHeader("Content-Type","application/octet-stream");
    
            //3.设置响应头以下载方式打开  以附件形式处理内容
            /*
                Content-Disposition  消息头名称  处理的形式
                attachment;filename=  消息头参数  附件形式进行处理;指定下载文件名称
             */
            resp.setHeader("Content-Disposition","attachment;filename=hm.png");
    
            //4.获取字节输出流对象
            ServletOutputStream sos = resp.getOutputStream();
    
            //5.循环读写文件
            byte[] arr = new byte[1024];
            int len;
            while((len = bis.read(arr)) != -1) {
                sos.write(arr,0,len);
            }
    
            //6.释放资源
            bis.close();
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值