Servlet response

1.Response 概述

  • Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象
  • request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向容器或者客户机输出数据,只需要找response对象就行了。

2.Response常用API

HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。

  1. 通过response设置响应行
    设置响应行的状态码
    setStatus(int sc)
  2. 通过response设置响应头
    addHeader(String name, String value)
    addIntHeader(String name, int value)
    addDateHeader(String name, long date)
    setHeader(String name, String value)
    setDateHeader(String name, long date)
    setIntHeader(String name, int value)
    其中,add表示添加,而set表示设置
  3. 通过response设置响应体
    (1)响应体设置文本
    PrintWriter getWriter()
    获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览 器端。

3.Response常见应用

3.1向客户端输出中文数据

3.1.1用OutputStream(字节流)发送数据:

  1. response.getOutputStream().write(“中国”.getBytes());//以默认本地编码发送数据
  2. response.getOutputStream().write(“中国”.getBytes(“UTF-8”));//以UTF-8编码发送数据,浏览器(默认用GB2312)会出现乱码
    解决办法
    (1)通过更改浏览器的编码方式:IE/”查看”/”编码”/”UTF-8”(不可取)
    (2)通过设置响应头告知客户端编码方式:response.setHeader(“Content-type”, “text/html;charset=UTF-8”);//告知浏览器数据类型及编码
    (3)通过meta标签模拟请求头:out.write(“<meta charset=utf-8’ />".getBytes());
    (4)通过以下方法:response.setContentType(“text/html;charset=UTF-8”);
    总结:程序以什么编码输出,就需要告知客户端以什么编码显示。

3.1.2用PrintWriter(字符流)发送数据:

  1. 示例:response.getWriter().write(“中国” );有没有乱码?
    答:以默认编码发送数据 ISO-8859-1(没有中国二字编码),此时会发生乱码
    解决办法:
  2. 解决办法:
    setCharacterEncoding(“UTF-8”);//更改编码为UTF-8
    response.setHead(“Context-type”,”text/html;charset=UTF-8”);//告诉客户端编码方式
    注意:不要忘记告诉客户端的编码方式。
    由于经常改动编码,response提供了一种更简单的方式
    response. setContentType(“text/html;charset=UTF-8”);其作用相当于以上两条代码。

3.2定时刷新网页:

发送http头,控制浏览器定时刷新网页

  • 输出一个随机数,控制浏览器每2S刷新一次
  • 利用Refresh刷新到其他组件。模拟注册页面,注册处理交由一个Servlet,在Servlet处理完成后,显示注册成功并转向主页
    在这里插入图片描述
    在这里插入图片描述

3.3通过response实现请求重定向:

  • 请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向
  • 地址栏会变,并发送2次请求,增加服务器负担(重定向到本服务器时,建议使用转发或者包含
  • 实现方式
    response.sendRedirect()
  • 实现原理:
    302/307状态码和location头即可实现重定向
    302 303 307

4.Response 重定向

4.1重定向机制的原理

  1. 用户在浏览器端输入特定URL,请求访问服务器端的某个组件
  2. 服务器端的组件返回一个状态码为302的响应结果
  3. 当浏览器端接收到这种响应结果后,再立即自动请求访问另一个web组件
  4. 浏览器端接收到来自另一个web组件的响应结果。
  5. HttpServeltResponse的sendRedirect(String location)用于重定向

4.2重定向机制的运行流程

第一步:
在这里插入图片描述

第二步:
在这里插入图片描述

第三步:
在这里插入图片描述

第四步:
在这里插入图片描述

第五步:
在这里插入图片描述

第六步:
在这里插入图片描述

第七步:
在这里插入图片描述

第八步:
在这里插入图片描述

第九步:
在这里插入图片描述

第十步:
在这里插入图片描述

第十一步:
在这里插入图片描述

第十二步:
在这里插入图片描述

第十三步:
在这里插入图片描述

第十四步:
在这里插入图片描述

第十五步:
在这里插入图片描述

第十六步:
在这里插入图片描述

4.3重定向特点

  1. Servlet源组件生成的响应结果不会被发送到客户端
    response.sendRedirect(String location)方法一律返回状态码为302的响应结果

  2. 如果源组件在进行重定向之前,已经提交了响应结果,会抛出IllegalStateException。为了避免异常,不应该在源组件中提交响应结果。
    //Cannot call sendRedirect() after the response has been committed

  3. 在Servlet源组件重定向语句后面的代码也会执行

  4. 源组件和目标组件不共享同一个ServletRequest对象

  5. 对于sendRedirect(String location)方法的参数,如果以“/”开头,表示相对于当前服务器根路径的URL (不是当前应用的根目录)。以“http"//”开头,表示一个完整路径(http://localhost/)

  6. 目标组件不必是同一服务器上的同一个web应用的组件,它可以是任意一个有效网页

5.Response 细节

  1. getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象
  2. getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。 会抛异常
  3. Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端
  4. Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象

猜你喜欢

转载自blog.csdn.net/gy99csdn/article/details/114105850