Javaweb学习笔记8(Response对象)

Posted huamanggg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javaweb学习笔记8(Response对象)相关的知识,希望对你有一定的参考价值。

Response对象

功能:设置响应消息

  1. 设置响应行
    1. 格式:HTTP/1.1 200 ok
    2. 设置状态码:setStatus(int sc)
  2. 设置响应头:setHeader(String name, String value)
  3. 状态码的设置和响应头的设置,可以集合到sendRedirect(String 路径)方法里面一把嗦
  4. 设置响应体:
    1. 获取输出流
      • 字符输出流:PrintWriter getWriter()
      • 字节输出流:ServletOutputStream getOutputStream()
    2. 使用输出流,将数据输出到客户端浏览器

重定向

笨方法

  • 创建两个类demo1和demo2,我们要实现访问demo1会重定向到demo2
  • 在demo1中:设置状态码302,设置重定向到demo2

demo1

@WebServlet("/demo1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 访问demo1后会跳转到demo2
         */
        System.out.println("demo1");
        //设置状态码302
        resp.setStatus(302);
        //设置响应头location
        resp.setHeader("location","/demo2");
    }

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

demo2

@WebServlet("/demo2")
public class ResponseDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo2");
    }

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

访问一下demo1,发现重定向到了demo2

看输出结果,成功实现

< color=red>更好的方法

sendRedirect(String 路径)

由于设置状态码resp.setStatus(302);和设置响应头resp.setHeader("location","/demo2");只有路径是需要自己设置,其他的都是固定的,所以我们有一个专门用来重定向的方法,只需要填写路径就可以了

@WebServlet("/demo1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 访问demo1后会跳转到demo2
         */
        System.out.println("demo1");
        // 一把嗦
        resp.sendRedirect("/demo2");
    }

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

成功重定向

重定向与转发

之前学过转发,功能好像和重定向很类似,这里列出他们的特点

重定向的特点:redirect

  1. 地址栏发生变化
  2. 重定向可以访问其他站点(服务器)的资源
  3. 重定向是两次请求。不能使用request对象来共享数据

转发的特点:forward

  1. 转发地址栏路径不变
  2. 转发只能访问当前服务器下的资源
  3. 转发是一次请求,可以使用request对象来共享数据

输入输出流

输出字符数据

步骤:

  • 获取字符输出流
  • 输出数据

获取字符输出流:PrintWriter getWriter()
输出数据:xxx.write()

@WebServlet("/demo3")
public class ResponseDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取字符输入流
        PrintWriter pw = resp.getWriter();
        // 输出字符
        pw.write("hello world");
    }

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

输出字节数据

步骤:

  • 获取字节输出流
  • 输出数据

获取字节输出流:ServletOutputStream getOutputStream()
输出数据xxx.write()

@WebServlet("/demo4")
public class ResponseDemo4 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设定字符编码
        resp.setContentType("text/html;charset=utf-8");
        // 获取字节输入流
        ServletOutputStream sos = resp.getOutputStream();
        // 输出字符
        sos.write("hello world".getBytes());
    }

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

中文乱码

解决方法:
简单的形式,设置编码,是在获取流之前设置
response.setContentType("text/html;charset=utf-8");

原因:编解码使用的字符集不一致

以上是关于Javaweb学习笔记8(Response对象)的主要内容,如果未能解决你的问题,请参考以下文章

20160322 javaweb 学习笔记--response 重定向

JavaWeb学习笔记-06请求和响应

20160322 javaweb 学习笔记--response验证码实现

JavaWeb学习笔记四 request&response

JavaWeb jsp 笔记总结

JavaWeb学习笔记