Servlet中Response的用法和API

1.概述
--response对象表示web服务器给浏览器返回的响应信息
--作用:开发人员可以使用response对象的方法,设置要返回给浏览器的响应信息

2.Response体系结构

ServletResponse 接口
        |
HttpServletResponse 接口
        |
org.apache.catalina.connector.ResponseFacade 实现类(由tomcat提供的)            

3.设置Http响应消息

--响应行

* 格式
  协议/版本号 状态码
* 例如
  HTTP/1.1 200
* API
  1.设置状态码
  void setStatus(int sc)

--响应头

* 格式
  响应头名称:响应头的值
* 例如
  Location:http://www.itcast.cn
* API
  1.设置指定名称响应头的值
  void setHeader(String name,String value)

--响应体

* API(输出流对象)
  1.字符输出流
  PrintWriter getWriter()
  2.字节输出流
  ServletOutputStream getOutputStream()
  注意:在同一个Servlet,二种输出流不能同时使用,产生互斥

--响应重定向

方式一
// 1.设置状态码
  response.setStatus(302);
// 2.设置响应头
  response.setHeader("Location","/项目地址/资源地址");
方式二【推荐】
  // response提供了专门负责重定向的方法
  response.sendRedirect("/项目地址/资源地址");

特点

1. 地址会发生改变
2. 重定向是二次请求(不能使用request来共享数据)
3. 重定向是浏览器行为,可以跳转到到服务器外部资源...

--解决中文乱码

* 方式一(了解)
// 指定服务器响应中文的编码方式
  response.setCharacterEncoding("GBK");
* 方式二(掌握)
// 统一服务器和客户端的编码方式
  response.setContentType("text/html;charset=utf-8");

4.文件下载

1. 被下载文件的字节输入流
   FileInputStream        
2. response字节输出流
   ServletOutputStream     
3. 告知客户端下载文件的MIME类型
   Content-Type:MIME类型
4. 告知浏览器以附件的方式保存
   Content-Disposition:attachment;filename=文件名
//  1.接收请求参数 filename
String filename = request.getParameter("filename");
//  2.获取该文件真实路径,封装字节输入流
ServletContext servletContext = getServletContext();
String realPath = servletContext.getRealPath("/download/" + filename);
FileInputStream in = new FileInputStream(realPath);
//  3.告诉浏览器下载文件的MIME类型 Content-Type
String mimeType = servletContext.getMimeType(filename);
response.setContentType(mimeType);
//  4.告诉浏览器以附件形式保存 Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
//  5.获取response的字节输出流
ServletOutputStream out = response.getOutputStream();
//  6.IO流的拷贝
byte[] b = new byte[4096]; // 4KB
int len = -1;
while ((len = in.read(b)) != -1) {
   out.write(b, 0, len);
}
//  7.释放资源
out.close();
in.close();

解决不同浏览器兼容,传入user-Agent请求头信息和文件参数名

public static String getName(String agent, String filename) throws UnsupportedEncodingException {
        if (agent.contains("Firefox")) {
            // 火狐浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
}
原文地址:https://www.cnblogs.com/xiaozhang666/p/13366850.html