Response详解

原创 2018年04月15日 16:55:53
一、Response的运行过程
 
客户端发送请求(http请求)---->Tomcat引擎(解析,内部封装request信息以及response空对象)------>对应的Web程序的Servlet-------->然后将Response响应放到response缓冲区(类似)------->Tomcat引擎取出Response缓冲区内容------>Tomcat引擎将Response缓冲区内容与引擎自己添加的信息组装成一个http响应发送给客户端
 
http响应(三部分):
----http响应行
----http响应头
----http响应体
 
1、通过Response设置响应行
   设置响应行的状态码
   setStatus( int sc )
//手动设置http响应行中的状态码
   response.setStatus(302);
2、通过Response设置响应头
addHeader(String name, String value)
addIntHeader(String name, int value)
addDateHeader(String name, long date)
Date date = new Date();
   //设置响应头
        response.addHeader("name", "zhangsan");
        response.addIntHeader("age", 28);
        response.addDateHeader("birthday", date.getTime());
 
setHeader(String name, String value)
setDateHeader(String name, long date)
setIntHeader(String name, int value)
 
其中,add表示添加(同名,会添加多个),而set表示设置(同名的,后面的会覆盖前面的)。

3、重定向
什么是重定向?
客户端找servlet1要资源,servlet1没有资源,但知道servlet2有资源,然后告诉客户端,客户端去找servlet2要资源的过程就叫重定向。
俗话理解:你找张三借钱,张三没钱,但知道李四有钱,然后告诉你李四有钱,让你去找李四借钱。
特定:a、访问服务器两次或多次。b、地址栏的地址发生变化(自动变化)
 
怎样设定重定向?
状态码:302  响应头:location  (代表重定向的地址)
             //没有响应,告知客户端去重定向到Servlet2
             //1.设置状态码302
             response.setStatus(302);
             //2.设置响应头location
             response.setHeader("Location", "/WEB14_Response/servlet2");
//JavaEE已经封装了一个重定向的方法sendRedirect(url)
       response.sendRedirect("/WEB14_Response/servlet2");
 
设置定时刷新,也能够达到重定向的功能!
//设置定时刷新的头,5秒回刷新到百度
             response.setHeader("refresh", "5;url=http://www.baidu.com";);
 
4、通过Response设置响应体
a、响应体设置文本
PrintWriter  writer = response.getWriter();
writer.write("hello China");
writer.write("中国!!!");
中文乱码问题?
通知Response查询UTF-8的码表,需要在输出流之前设置。
            //设置Response查询的码表
             //response.setCharacterEncoding("UTF-8");
             
             //通过一个头Content-Type,告知客户端使用的编码表
             //response.setHeader("Content-Type", "text/html;charset=UTF-8");
             
             //封装的方法
             response.setContentType("text/html;charset=UTF-8");
             
             PrintWriter  writer = response.getWriter();
             writer.write("hello China");
             writer.write("中国!!!");
 
PrintWriter getWriter()
获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
 
响应头设置字节
//使用response获得字节输出流
ServletOutputStream outputStream = response.getOutputStream();
 
获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字节,再由Tomcat服务器将字节内容组成Http响应返回给浏览器。 
二、文件下载的基本代码
    问题:
        a、什么情况下会文件下载?
        浏览器不能解析的文件就下载。
        b、什么情况下需要在服务器端编写文件下载的代码?
        理论上,浏览器可以解析的代码需要编写文件下载代码。
        实际开发中,只要是下载的文件都编写文件代码下载。       
 
1、文件下载的本质
文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端。所以文件下载需要IO技术将服务器端的文件使用InputStream读取到,再使用ServletOutputStream写到response缓冲区中。
//使用response获得字节输出流
             ServletOutputStream outputStream = response.getOutputStream();
             //获得服务器上的图片
             String realPath = this.getServletContext().getRealPath("/WEB-INF/a.jpg");
             InputStream in = new FileInputStream(realPath);
             int  len = 0;
             byte[] buffer = new byte[1024];
             while ((len = in.read(buffer))>0) {
                    outputStream.write(buffer, 0, len);                  
             }
             in.close();
             outputStream.close();

上述代码可以将图片从服务器端产生到浏览器,但浏览器直接解析图片显示在页面上,而不是提供下载,我们需要设置两个响应头,告知浏览器文件的类型和文件的打开方式。
a、告知浏览器文件的类型:
response.setContentType(文件的MIME类型)
response.setContentType(this.getServletContext().getMimeType(filename));
b、告知浏览器文件的打开方式是下载:
response.setHeader("Content-Disposition","attachment;filename=文件名称");

文件下载案列
页面设置
<body>
       <h1>使用服务器编码实现文件下载</h1>
       <a href="/WEB14_Response/downloadServlet?filename=a.flv">a.flv</a><br>
       <a href="/WEB14_Response/downloadServlet?filename=a.jpg">a.jgp</a><br>
       <a href="/WEB14_Response/downloadServlet?filename=a.mp3">a.mp3</a><br>
       <a href="/WEB14_Response/downloadServlet?filename=a.mp4">a.mp4</a><br>
       <a href="/WEB14_Response/downloadServlet?filename=a.txt">a.txt</a><br>
       <a href="/WEB14_Response/downloadServlet?filename=a.zip">a.zip</a><br>
       <a href="/WEB14_Response/downloadEncode?filename=美女.jpg">美女.jpg</a><br>
</body>

主要的servlet

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String filename = request.getParameter("filename");
		
		//解决获得中文参数的乱码
        filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");

		// 获得请求头中的User-Agent
		String agent = request.getHeader("User-Agent");
		String filenameEncode = "";
		// 根据不同得了浏览器进行不同的编码
		if (agent.contains("MSIE")) {
			// IE浏览器
			filenameEncode = URLEncoder.encode(filename, "utf-8");
			filenameEncode = filenameEncode.replace("+", " ");
		} else {
			// 其它浏览器
			filenameEncode = URLEncoder.encode(filename, "utf-8");
		}

		response.setContentType(this.getServletContext().getMimeType(filename));

		// 要下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型
		// MIME:字符串
		response.setContentType(this.getServletContext().getMimeType(filename));

		 //告诉客户端该文件不是直接解析,而是以附件形式打开(下载)
        response.setHeader("Content-Disposition", "attachment;filename="+filenameEncode);

		ServletOutputStream os = response.getOutputStream();

		String path = getServletContext().getRealPath(
				"/WEB-INF/download/" + filename);
		InputStream fis = new FileInputStream(path);
		byte[] buf = new byte[1024];
		int len = 0;
		while ((len = fis.read(buf)) != -1) {
			os.write(buf, 0, len);
		}
		//os.close();可以不写,服务器关闭时自动关闭
		fis.close();

	}

response细节点:
a、response 获得的流不需要手动关闭,Tomcat容器会帮助我们关闭
b、getWriter 和 getOutputStream不能同时调用
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZJ_2420441444/article/details/79950540

ASP内置对象Request和Response详解

  • 2008年05月20日 13:39
  • 8KB
  • 下载

ASP.NET之Request和Response对象

经过了牛腩新闻发布系统和html的学习对B/S开发的流程有了些理解。前面虽然用到了很多知识,但对制作网页只能说知其然,当学到asp.net视频中的讲解才可以说开始知其所以然了。       今天来说说...
  • u010858791
  • u010858791
  • 2014-10-22 16:39:54
  • 1631

jsp全部内置对象详解

  • 2010年04月24日 01:28
  • 17KB
  • 下载

Response有关

Response.Flush和Response.BufferOutput 首先Response.Buffer属性现在已经过时,它存在的唯一目的仅仅是为了兼容asp。你应该使用Response.Bu...
  • xxmeng2012
  • xxmeng2012
  • 2016-06-29 19:22:54
  • 277

response详解

1 response概述 response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,...
  • qq_26676207
  • qq_26676207
  • 2016-09-22 17:13:36
  • 6581

response 详解

getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。 getOutputStream和g...
  • a112121788
  • a112121788
  • 2014-04-24 15:44:40
  • 329

http协议之response响应详解

1,http响应 HTTP/1.1 200 OK             --响应行 Server: Apache-Coyote/1.1    --多个响应头 Content-Length: 51 D...
  • guyan1111
  • guyan1111
  • 2017-01-01 17:42:25
  • 4117

Request对象和Response对象详解

JavaWeb开发中经常要使用Request对象和Response对象, 这两个对象自己也有很多方法可以帮助我们做许多事情,因此对Request对象和Response对象的掌握非常有必要,最近在复习这...
  • DreamLi1314
  • DreamLi1314
  • 2017-12-26 21:36:54
  • 498

HTTP协议学习# (一)request 和response 解析

当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等。 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了We...
  • pfm685757
  • pfm685757
  • 2016-06-05 18:43:16
  • 1670

OKHttp 里面的Interceptor解析

okhttp 里面有一个类Interceptor主要负责 request的提交 获取response不知道这个是不是拦截器模式。先介绍一下思路:RealCall类里面的下面的方法 Response g...
  • gacmy
  • gacmy
  • 2016-12-20 20:04:34
  • 1226
收藏助手
不良信息举报
您举报文章:Response详解
举报原因:
原因补充:

(最多只允许输入30个字)