JavaEE基础-----------Response对象

JavaEE基础-----------Response对象

1.Response的功能

  1. 设置响应行

    1. 格式:HTTP/1.1 200 ok
    2. 设置状态码:setStatus(int sc)
  2. 设置响应头:setHeader(String name, String value)

  3. 设置响应体:

    • 使用步骤:
      1. 获取输出流

        • 字符输出流:PrintWriter getWriter()

        • 字节输出流:ServletOutputStream getOutputStream()

      2. 使用输出流,将数据输出到客户端浏览器

2.重定向的使用

​ 之前在request中学过转发,那么为什么又要使用重定向,看起来差不多,都是实现跳转,但是二者有很多区别,这也是常见的面试题,它们的区别如下:

1.重定向地址栏会发生改变,转发地址栏不会发生改变
2.重定向是两次请求,因此共用两个request对象,不能共享数据,转发是一次请求,可以共享 数据
3.重定向可以访问任意站点的资源,转发是服务器内部行为,跳转仅限于当前站点

​ 尤其是上面的第二点,转发是一次请求,是可以共享数据的,但是重定向是发出第二次请求的,这个是很容易让人混淆的。

​ 下面介绍一下重定向的两种实现方式:

扫描二维码关注公众号,回复: 11426753 查看本文章

​ 1.传统方式实现:

@WebServlet("/as")
public class AServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //传统方式重定向
        response.setStatus(302);//设置状态码
        response.setHeader("location","https://www.baidu.com");//设置响应头
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

分析:上面的状态码302和location是不变的,变得是url,因此就有下面的更简便的方法

​ 2.最常用的方法实现:

@WebServlet("/bs")
public class BServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //简写方式重定向
        response.sendRedirect("https://www.baidu.com");
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

​ 点进源码可以看出,底层已经帮我们做好了传统的步骤。

3.ServletContext对象

1.获取方法

  1. 通过request对象获取
    request.getServletContext();
  2. 通过HttpServlet获取
    this.getServletContext();

2.获取文件的真实路径

String realPath = request.getServletContext().getRealPath("/img/1.jpg");

4.响应字符流形式的数据

​ 1.这里需要注意的是,开始我们要设置编码格式,处理中文乱码

response.setContentType(“text/html;charset=utf-8”);

​ 写这个之前先把这一行加上,开发过程的一个习惯,这样就不会出现乱码

​ 2.响应字符流数据

@WebServlet("/cs")
public class CServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //响应字符流
        response.setContentType("text/html;charset=utf-8");//防止乱码
        response.getWriter().write("字符流");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

这里附加一个知识点,这个不仅仅能输出字符串,还能写html,真正在后端代码中实现了HTML的编写,不过这种方式用的比较少,只在特殊情况下实用:

@WebServlet("/cs")
public class CServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //响应字符流
        response.setContentType("text/html;charset=utf-8");//防止乱码
        response.getWriter().write("字符流");
        response.getWriter().write("<h1>");
        response.getWriter().write("字符流");
        response.getWriter().write("</h1>");
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

​ 我们只要将HTML标签包裹起来就可以实现HTML的编写了

5.响应字节流形式的数据

这里的字节流我们可以用来响应图片,这是用的最多的,下面就这个实现说明几个方法:

1.以绝对路劲来读取

@WebServlet("/ds")
public class DServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取图片位置并读取图片
        FileInputStream fis = new FileInputStream("F:\\idea_workspace\\yz\\day08_response\\web\\img\\1.jpg");
        //获取输出流
        ServletOutputStream os = response.getOutputStream();
        //对接流
        int len = 0;
        while ((len=fis.read())!= -1){
            os.write(len);
        }
        //关闭资源
        fis.close();
        os.close();

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

这个使用就是java基础里面io流的常规使用

2.工具类结合ServletContext对象实现

@WebServlet("/fs")
public class FServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取图片的真是路径
        String realPath = request.getServletContext().getRealPath("/img/1.jpg");
        System.out.println(realPath);
       // 获取字节输入流读取图片
        FileInputStream fis = new FileInputStream(realPath);
        //获取字节输出流
        ServletOutputStream os = response.getOutputStream();
        //对接流,将图片输出
        IOUtils.copy(fis,os);

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

IOUtils使用需要commons-io-2.6.jar,这个jar包,是maven工程直接导入改坐标即可,不是,导入jar包即可,关于ServletContext对象使用上面介绍了,就不多说了。这种方式也是开发中用的最多的,代码简洁,可读性很强 。

猜你喜欢

转载自blog.csdn.net/qq_39594037/article/details/107523311
今日推荐