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; }