Response响应对象
1、HttpServletResponse
HttpServletResponse是一个定义在Servlet API中的接口,继承自ServletReponse接口,用于封装HTTP响应消息。HTTP相应分为响应行、响应头和响应体三部分。在HttpServletResponse中定义了向客户端发送相应状态码、响应头、响应体的方法。
2、发送状态码相关方法
常见的相应状态码:
200 OK,302 重定向,304 取本地缓存,404 找不到资源,500 服务器内部错误(内部java代码逻辑错误)
- setStatus(int status)方法:用于设置相应消息的状态码
- sendError(int sc):发送表示错误信息的状态码
3、发送响应头的相关方法
void addHeader(String name, String value):用于增加响应头
void setHeader(String name, String value):用于设置响应头
void addIntHeader(String name, int value):增加整数响应头
void setIntHeader(String name, int value):设置整数响应头
void setContentLength(int len):用于设置响应消息的实体大小,单位为字节
void setContentType(String type):用于设置输出文件的MIME类型
void setLocale(Locale loc):用于设置响应消息的本地化信息
void setCharacterEncoding(String charset):用于设置输出内容使用的字符集编码
4、发送响应体的相关方法
- getOutputStream():用于获取类型为ServletOutputStream类型的字节流输出对象
- getWriter():用于获取的字符输出流对象为PrintWriter类型
5、文件下载实例
文件下载要解决问题:文件名中文乱码问题,浏览器自动解析,读取服务器上文件,写到本地
1 package com.alphajuns.content; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.net.URLEncoder; 7 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletOutputStream; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 import sun.misc.BASE64Encoder; 15 16 public class DownloadServlet2 extends HttpServlet { 17 18 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 19 /* 20 * 文件名是中文的下载乱码问题解决 21 */ 22 // 获取要下载的文件的名称 23 String filename = request.getParameter("filename"); 24 // 解决中文乱码问题 25 filename = new String(filename.getBytes("iso8859-1"), "UTF-8"); 26 // 获得请求头中的User-Agent 27 String agent = request.getHeader("User-Agent"); 28 // 根据不同的浏览器进行不同的解码 29 String filenameEncoder = ""; 30 if (agent.contains("MSIE")) { 31 // IE浏览器 32 filenameEncoder = URLEncoder.encode(filename, "utf-8"); 33 filenameEncoder = filenameEncoder.replace("+", " "); 34 } else if (agent.contains("Firefox")) { 35 // 火狐浏览器 36 BASE64Encoder base64Encoder = new BASE64Encoder(); 37 filenameEncoder = "=?utf-8?B?" 38 + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; 39 } else { 40 // 其它浏览器 41 filenameEncoder = URLEncoder.encode(filename, "utf-8"); 42 } 43 // 告诉客户端不是直接解析,而是以附件形式下载 44 response.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder); 45 // 获取文件的绝对路径 46 String realPath = this.getServletContext().getRealPath("download/" + filename); 47 // 获取的该文件的字节输入流 48 InputStream in = new FileInputStream(realPath); 49 // 获得文件的字节输出流 50 ServletOutputStream out = response.getOutputStream(); 51 int len = 0; 52 // 定义读写数据的字节数组缓冲区 53 byte[] buffer = new byte[1024]; 54 // 读取数据到字节数组中 55 while ((len = in.read(buffer)) != -1) { 56 out.write(buffer, 0, len); 57 } 58 // 关闭资源 59 out.close(); 60 in.close(); 61 } 62 63 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 64 doGet(request, response); 65 } 66 }