JavaWeb-Response对象
Response对象
HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、设置响应头,设置响应状态码的方法。

设置响应行
setStatus(int sc) 设置响应行的状态码
设置响应头
| == |
|---|
addHeader(String name, String value) |
addIntHeader(String name, int value) |
addDateHeader(String name, long date) |
setHeader(String name, String value) |
setDateHeader(String name, long date) |
setIntHeader(String name, int value) |
设置响应体
PrintWriter getWriter
获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
中文乱码问题
| 方法 | 说明 |
|---|---|
setCharacterEncoding(String charset) |
设置response缓冲区编码码表 |
setContentType(String type) |
设置为浏览器可识别的MIME类型 |
- response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。
- MIME映射策略就是在网页中使用哪个应用程序(即插件),打开哪种文件。另外还有使用权限问题。比如对PDF文档,用“application/pdf “策略。这在动态网页中很常见。出现这种现象,有两种情形:一是使用一个应用程序去打开它不能打开的文档,比如用在标签中定义“DWG”文档用 “application/pdf ”,就会出现无法打开的问题。二是文件扩展名符合要求,但文件内容(格式)不符合要求。你可以检查你浏览的网页源代码,获得出错信息。检查方法是:查看— 源文件。寻找类似于“application/pdf “的字符串,就可以看到,要打开的文件是否与应用程序匹配。 追问 如果不相匹配 如何解决回答 这通常是由网页编写人来更改。比如:你在源文件里面找到你要打开的文件的HTML标签,在里面加上应用程序即可。比如,你要在网页上打开一个PDF文档, 找到PDF文档那一行,在HTML标签里加上 type=“application/pdf “ 就可以了。比如以下HTML文件: <!----------测试MIME----------->
测试MIME 测试MIME </html 将上面的代码保存为test.html,再在相同的位置存储一个pdf文档,双击它就会在网页中打开该文档。response.setContentType();同时也包含setCharacterEncoding的功能,所以在实际开发中只要编写response.setContentType("text/html;charset=UTF-8")就可以。
响应头设置字节流
ServletOutputStream getOutputStream()
获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字 节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。
response细节点:
- response获得的流不需要手动关闭,web容器(tomcat容器)会帮助我们关闭,
- getWriter和getOutputStream不能同时调用
- 重定向语句一般作为终结代码
使用response实现文件下载
java代码
package com.oracle.web;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Encoder;
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取文件名
String filename = request.getParameter("filename");
/**
* 文件下载的关键代码
*/
// get请求解决乱码
filename = new String(filename.getBytes("ISO8859-1"), "UTF-8");
// 获取user-agent头
String agent = request.getHeader("User-Agent");
// 不同浏览器解析模板
String filenameEncoder="";
if (agent.contains("MSIE")) {
// IE浏览器
filenameEncoder= URLEncoder.encode(filename, "utf-8");
filenameEncoder= filenameEncoder.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filenameEncoder= "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filenameEncoder= URLEncoder.encode(filename, "utf-8");
}
// 告知浏览器文件类型
response.setContentType(getServletContext().getMimeType(filename));
// 告知浏览器文件的打开方式是下载
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
// 获取文件所在服务器的绝对路径
String filepath = getServletContext().getRealPath("download/" + filename);
// 明确数据源
FileInputStream fis = new FileInputStream(filepath);
// 明确目的地
ServletOutputStream sos = response.getOutputStream();
int len = 0;
byte[] bytes = new byte[1024];
// 开始复制
while ((len = fis.read(bytes)) != -1) {
sos.write(bytes, 0, len);
}
// 释放资源
fis.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

浙公网安备 33010602011771号