HttpServletResponse

HttpServletResponse

 

简介

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

HttpServletResponse用途

  • 1、向客户端写入Cookie
  • 2、重写URL
  • 3、获取输出流对象,向客户端写入文本或者二进制数据
  • 4、设置响应客户端浏览器的字符编码类型
  • 5、设置客户端浏览器的MIME类型。

 HttpServletResponse对象向客户端发送数据格式如下:

HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 5 Jan 2004 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 5 Jan 2004 13:13:12 GMT
Content-Length: 112
<html><head><title>HTTP Response Example</title></head>....</html>

 

 负责向客户端(浏览器)发送响应头的相关方法

addHeader(String name,String value)  //将指定的名字和值加入到响应的头信息中
encodeURL(String url)  //编码指定的URL
sendError(int sc)  //使用指定状态码发送一个错误到客户端
setDateHeader(String name,long date)  //将给出的名字和日期设置响应的头部
setHeader(String name,String value)  //将给出的名字和值设置响应的头部 eg:response.setHeader(“Refresh”,”2;url=”http://www.baidu.com”); 页面的刷新
setStatus(int sc)  //给当前响应设置状态码
getOutputStream()  //字节输出流对象
getWriter()   //字符的输出流对象(这个一般用于输出汉字内容,一般不用这个)
sendRedirect ()   //请求重定向,对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
setContentType(String ContentType)  //设置响应的MIME类型 ,页面的设置文本类型,获取或设置输出流的 HTTP MIME 类型。
setCharacterEncoding(String charset) //告知服务器用什么方式编码解析

响应状态码(setStatus()、sendError())

HttpServletResponse定义了很多状态码的常量(具体可以查看Servlet的API),当需要向客户端发送响应状态码时,可以使用这些常量,避免了直接写数字,常见的状态码对应的常量:

  • 状态码404对应的常量   SC_NOT_FOUND
  • 状态码200对应的常量   SC_OK
  • 状态码500对应的常量   SC_INTERNAL_SERVER_ERROR

 

HttpServletResponse对象的常见应用

1、输出中文

    /**
      * 使用OutputStream流输出中文
      * @param request
      * @param response
     * @throws IOException 
      */   
         String data = "中国";
         OutputStream outputStream = response.getOutputStream();//获取OutputStream输出流
        response.setHeader("content-type", "text/html;charset=UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
        /**
          * data.getBytes()是一个将字符转换成字节数组的过程,这个过程中一定会去查码表,
         * 如果是中文的操作系统环境,默认就是查找查GB2312的码表,
         * 将字符转换成字节数组的过程就是将中文字符转换成GB2312的码表上对应的数字
         * 比如: "中"在GB2312的码表上对应的数字是98
         *         "国"在GB2312的码表上对应的数字是99
         */
        /**
         * getBytes()方法如果不带参数,那么就会根据操作系统的语言环境来选择转换码表,如果是中文操作系统,那么就使用GB2312的码表
         */
         byte[] dataByteArr = data.getBytes("UTF-8");//将字符转换成字节数组,指定以UTF-8编码进行转换
         outputStream.write(dataByteArr);//使用OutputStream流向客户端输出字节数组

2、文件下载

文件下载功能的实现思路:

  1.获取要下载的文件的绝对路径

  2.获取要下载的文件名

  3.设置content-disposition响应头控制浏览器以下载的形式打开文件

  4.获取要下载的文件输入流

  5.创建数据缓冲区

  6.通过response对象获取OutputStream流

  7.将FileInputStream流写入到buffer缓冲区

  8.使用OutputStream将缓冲区的数据输出到客户端浏览器

OutputStream下载xls文件例子如下:

//HttpServletResponse OutputStream下载xls文件
@RequestMapping("/download")
public void download(HttpServletRequest req,HttpServletResponse res){
    String fileName = "java教程.xls";//要下载的文件名
    String realPath = req.getSession().getServletContext().getRealPath("/wbms/download");
    File file=new File(realPath+"/"+fileName); 
    // 设置响应的编码UTF-8
    res.setCharacterEncoding("utf-8");
    // 响应头的类型(xls)
    res.setContentType("application/octet-stream");
    //设置content-disposition响应头控制浏览器以下载的形式打开文件
    res.setHeader("Content-Disposition", "attachment;fileName="+ URLEncoder.encode("javaschool.xls", "UTF-8"));
    InputStream inputStream=new FileInputStream(file);根据路径获取要下载的文件输入流 
    OutputStream out = res.getOutputStream();
    byte[] b=new byte[1024];  //创建数据缓冲区
    int length;  
    while((length=inputStream.read(b))>0){  把文件流写到缓冲区里
        out.write(b,0,length);  
    }  
    out.flush();
    out.close();
    inputStream.close();
}

推荐使用OutputStream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。

3、HttpServletResponse设置http控制浏览器禁止缓存当前文档内容

protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { 
    response.setDateHeader("expries", -1);
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Pragma", "no-cache");
}

 

4、HttpServletResponse sendRedirect重定向

用法:

HttpServletResponse.sendRedirect("url?参数名1=参数值&参数名2=参数值");

实例:

protected void doGet(HttpServletRequest request,  
    HttpServletResponse response) throws ServletException, IOException {  
    /*方法一:使用response.sendRedirect*/  
//      response.sendRedirect("index.html");  
      
    /*方法二:设置响应头和重定向地址*/  
    response.setHeader("Location", "index.html");  
    response.setStatus(HttpServletResponse.SC_FOUND);//设置302状态码,等同于response.setStatus(302);       
} 

sendRedirect重定向不可以在页面中共享HttpServletRequest对象中的数据。但是可以通过重定向的url中携带需要的参数,但这里的参数只能携带字符串的参数。但是其优点是重定向时浏览器默认是使用get请求方式,这样的请求方式速度更快一点。但是安全性却不高。

5、HttpServletResponse设置http定时刷新网页(refresh)

protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { 
    response.setHeader("refresh", "5");//设置refresh响应头控制浏览器每隔5秒钟刷新一次
}

 



 
 
 
 

 

posted @ 2020-04-15 17:13  邓维-java  阅读(355)  评论(0编辑  收藏  举报