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细节点:

  1. response获得的流不需要手动关闭,web容器(tomcat容器)会帮助我们关闭,
  2. getWriter和getOutputStream不能同时调用
  3. 重定向语句一般作为终结代码

使用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);
	}
}
posted @ 2020-05-12 22:39  于大宝执剑江湖  阅读(204)  评论(0)    收藏  举报