JavaWeb 之 HttpServletResponse 类 一、Response 原理与集成结构 二、HttpServletResponse 类的作用 三、设置响应信息 四、获取输出流及回传数据 五、请求重定向 六、重定向与转发对比

原理和继承结构参考 request。

二、HttpServletResponse 类的作用

    HttpServletResponse 类和 HttpServletRequest 类一样。 每次请求进来, Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。

    HttpServletRequest 表示请求过来的信息, HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息, 都可以通过 HttpServletResponse 对象来进行设置。 

    其中 HttpServletResponse 类主要有三个作用:

    1、设置响应信息

    2、获取输出流及回传数据

    3、请求重定向

三、设置响应信息

  1、设置响应行

      响应行格式:

HTTP/1.1 200 ok

  

      设置状态码:

setStatus(int sc);  // sc为状态码

  

  2、设置响应头

      设置响应头信息:

setHeader(String name, String value);//通过name来给指定的响应头设置信息 

  

  3、设置响应体

    (1)获取输出流

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

四、获取输出流及回传数据

  1、获取输出流

    通过 HttpServletResponse 对象可以获取两个输出流:

字节流 ServletOutputStream getOutputStream();     常用于下载(传递二进制数据)
字符流 PrintWriter getWriter();                   常用于回传字符串(常用)

    注意两个流同时只能使用一个。使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。

    JavaWeb 之 HttpServletResponse 类
一、Response 原理与集成结构
二、HttpServletResponse 类的作用
三、设置响应信息
四、获取输出流及回传数据
五、请求重定向
六、重定向与转发对比

  2、服务器输出字符数据到浏览器

    Demo:

 1     @Override
 2     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 3 
 4         //1.获取字符输出流
 5         PrintWriter writer = resp.getWriter();
 6 
 7         //2.输出数据
 8         writer.write("<h1>hello response</h1>");
 9         writer.write("Hello Java!!!");
10     }

  上面的这种方式,向页面输出英文没有问题,而且HTML标签也会被正常解析,但是如果输出中文,就会产生乱码。

    乱码原因:

    JavaWeb 之 HttpServletResponse 类
一、Response 原理与集成结构
二、HttpServletResponse 类的作用
三、设置响应信息
四、获取输出流及回传数据
五、请求重定向
六、重定向与转发对比

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

    JavaWeb 之 HttpServletResponse 类
一、Response 原理与集成结构
二、HttpServletResponse 类的作用
三、设置响应信息
四、获取输出流及回传数据
五、请求重定向
六、重定向与转发对比

     解决乱码:

      方式一:(不推荐使用)

 1     @Override
 2     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 3 
 4         //获取流对象之前,设置流的默认编码:ISO-8859-1 设置服务器字符集为:utf-8
 5         resp.setCharacterEncoding("UTF-8");
 6         //告诉浏览器,服务器发送的消息体数据的编码。通过响应头,设置浏览器也使用UTF-8字符集
 7         resp.setHeader("Content-Type","text/html; charset=UTF-8");
 8 
 9         //1.获取字符输出流
10         PrintWriter writer = resp.getWriter();
11 
12         //2.输出数据
13         writer.write("<h1>hello response</h1>");
14         writer.write("Hello Java!!!");
15         writer.write("世界第一!!!");
16     }

      方式二:(推荐使用

 1     @Override
 2     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 3 
 4         // 它会同时设置服务器和客户端都使用 UTF-8 字符集, 还设置了响应头
 5         // 此方法一定要在获取流对象之前调用才有效
 6         resp.setContentType("text/html; charset=UTF-8");
 7 
 8         //1.获取字符输出流
 9         PrintWriter writer = resp.getWriter();
10 
11         //2.输出数据
12         writer.write("<h1>hello response</h1>");
13         writer.write("Hello Java!!!");
14         writer.write("世界第一!!!");
15     }

    注意一定要在获取流之前设置编码。

  3、服务器输出字节数据到浏览器(一般用于非文字的传输)

    Demo:

 1     @Override
 2     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 3 
 4         // 它会同时设置服务器和客户端都使用 UTF-8 字符集, 还设置了响应头
 5         // 此方法一定要在获取流对象之前调用才有效
 6         resp.setContentType("text/html; charset=UTF-8");
 7 
 8         //1.获取字节输出流
 9         ServletOutputStream sos = resp.getOutputStream();
10         //2.输出数据
11         sos.write("你好".getBytes("utf-8"));
12     }

五、请求重定向

    请求重定向是指客户端给服务器发请求, 然后服务器告诉客户端说一些新地址,让客户端去新地址访问。 叫请求重定向(因为之前的地址可能已经被废弃) 
    请求重定向:是一种客户端资源跳转的方式。

    原理图:

    JavaWeb 之 HttpServletResponse 类
一、Response 原理与集成结构
二、HttpServletResponse 类的作用
三、设置响应信息
四、获取输出流及回传数据
五、请求重定向
六、重定向与转发对比

    重定向的方式一:

1 // 设置响应状态码 302 , 表示重定向
2 response.setStatus(302);
3 // 设置响应头, 说明 新的地址在哪里
4 response.setHeader("Location", "http://localhost:8080");

    重定向的方式二:(推荐使用

response.sendRedirect("http://localhost:8080");

六、重定向与转发对比

  1、重定向与转发的特点

      重定向(redirect)的特点:[重要]

        ① 地址栏会发生变化;

        ② 重定向可以访问其他站点(服务器)的资源;

        ③ 重定向是两次请求,不能使用 request 对象来共享数据;

        ④ 不能访问 WEB-INF 下的资源,但是可以访问工程外的资源;

        请求转发(forward)的特点:[重要]

        ① 转发地址栏路径不变

        ② 转发只能访问当前工程内容下的资源

        ③ 转发是一次请求,可以使用 request 对象来共享数据

  2、路径问题

    相对路径:通过性对路径不可以确定唯一资源

如:./index.html;

特点:不以 / 开头,以 . (点)开头

规则:找到当前资源和目标资源之间的相对位置关系

./ :表示当前目录

../ :表示后退返回上一级目录

 

    绝对路径:通过绝对路径可以确定唯一资源

如:http://localhost/web/demo1

特点:以 / 开头

规则:判断定义的路径是给谁用的,判断请求将来从哪里发出

  ① 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)

    如:页面中的超链接,form表单,重定向等。

    注意:不建议把虚拟目录写死,一般都是动态获取。获取方法:

    request.getContextPath()

  ② 给服务器使用:不需要加虚拟目录

    如:转发路径;