HTTPServletResponse

HttpServletResponse是一个接口,它继承自ServletResponse接口;同时又被HttpServletResponseWrapper接口实现。

HttpServletResponse对象由servlet容器创建,并将这个对象作为参数传递给servlet的service方法(如:doGet、doPost等)

现在简单介绍一下一下这些方法:

  setStatus(int  sc)方法:

    设置此响应的状态代码。此方法用于设置没有错误时的返回状态代码(例如状态代码 SC_OK 或 SC_MOVED_TEMPORARILY)。如果有错误,并且调用者希望调用 Web 应用程序中定义的错误页面,则应改用 sendError 方法。

  并且调用setStatus()方法后,容器会清除缓冲区,设置Location响应头,并保留cookie和其他头

  参数:sc  是状态码

 

  setHeader(String name, String value)方法:

    用给定名称和值设置响应头。如果已经设置了头,则新值将覆盖以前的值。containsHeader 方法可用于测试在设置其值之前头是否存在;

    name:头的名称

    value:头值

 

  getWriter()方法:

    这个方法是ServletResponse接口中的方法;它是用来返回可将字符文本发送到客户端的 PrintWriter 对象

 

  getOutputStream()方法:

    返回适用于在响应中编写二进制数据的 ServletOutputStream。servlet 容器不会编码二进制数据。

对 ServletOutputStream 调用 flush() 将提交响应。 可调用此方法或 #getWriter 编写正文,而不是两种方法都调用。

  注意:它跟getWriter()方法,这两个方法这二者选其一,不能同时既调用getWriter方法又调用getOutputStream方法,两者同时调用会出现异常:throw IllegalStateException

  return:ServletOutputStream;

 

response常见应用:

  向客户端输出中文数据

    用OutputStream()发送数据:

      1.response.getOutputStream().write("中国".getBytes());  //以默认的编码发送数据,这里的默认编码是你系统的默认编码;

      2.response.getOutputStream().write("中国".getBytes("UTF-8"));//以UTF-8编码发送数据,浏览器(默认使用Gb2312)会出现乱码。

    解决办法:

      1.通过设置响应头告知客户端编码方式:response.setHeader("Content-type","text/html;charset=UTF-8");  //告知浏览器数据类型及编码

      2.通过meta标签模拟请求头:out.write("<meta http-equiv='Content-type' content = 'text/html;charset=utf-8'/>".getBytes());

      3.response.setContentType("text/html;charset=UTF-8");

    总结:程序以什么编码输出,就需要告诉客户端用什么编码显示。

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

      示例:response.getWriter().write("中国");//会出现乱码

      原因:以默认的编码发送数据ISO-8859-1(不支持中文),此时会发生乱码;

      解决办法:

        setCharacterEncoding("UTF-8");//将编码设置为UTF-8

        response.setHeader("Context-type","text/html;charset=UTF-8");//告诉客户端用utf-8编码方式来解析数据

      当然,我们还可以用一种更简单的方法:

        response.setContentType("text/html;charset=UTF-8");

       这个方法跟上面的两句代码实现的是一样的功能。

 

    文件下载问题:

        

    

  CAPTCHA图像(输出随机图片):Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自动区分计算机和人类的测试),也就是我们通常说的验证码;

  相关主要类:

    ----  BufferedImage:内存图像

    ----  Graphics:画笔

    ----  ImageIO:输出图像

    ----  然后放到html页面上<img src="***"/>

  这里要注意的是浏览器会默认缓存图片,这样的话就无法刷新验证码,也就是说当用户看不清验证码时,没法换一张。这里的解决方法是:

   控制客户端不要缓存:

      response.addHeader("Prama","no-cache");

      response.setHeader("Cache-Control","no-cache");

      response.setHeader("Expires",0);

   这 三种方法分别是控制不同浏览器不要缓存,一般三种方法都要写,这样可以做到浏览器版本兼容;

      response.setHeader("Expires",0)这个方法的“0”这个参数,表示你需要浏览器缓存的时间,当这个参数设置为0或者负数时,就是表示不要缓存。

  

  当然,有时候我们又需要浏览器帮我们缓存数据,因为有些不怎么变化的数据,利用缓存可以减轻服务器的负担;

  发送HTTP头,控制浏览器缓存当前文档内容:

    response.setDateHeader("Expires",System.currentTimeMillis() + 1000*60*60)//缓存1个小时,这里这个时间是1970年1月1日00:00:00的时间

  


请求重定向:

  请求重定向是指当一个web资源收到客户端请求后,自身没有请求所需的资源,然后通知客户端去访问另外一个web资源;

  在请求重定向中,会发送2次请求,,地址栏会变化;增加服务器负担

  重定向图解:

    

 

实现方式:

  -- response.sendRedirect(String location)

    参数:location  重定向的url

 

posted @ 2017-10-29 18:21  fengyu后  阅读(603)  评论(0编辑  收藏  举报