jsp内置对象out 和response.getwriter().write()的区别

两者的主要区别:
1. 这两个对象的类型是完全不同的:内置对象out的类型是JspWriter;response.getWrite()返回的类型是PrintWriter
2. 获取方式不同:JspWriter是JSP的内置对象,直接使用即可,对象名out是保留字,也只能通过out来调用其相关方法。此外还可以通过内置对象pageContext.getOut();获得;PrintWriter则是在用的时候需要通过内置对象response.getWriter();获得
3. JspWriter的print()方法会抛出IOException;而PrintWriter则不会
4. JspWriter和PrintWriter都继承自java.io.Writer,但JspWriter是抽象类,而PrintWriter不是
5,最终要的就是,out为page当前页的缓存,response为response缓冲区,两个缓冲区是不一样的,大小也可以自己设置
 
先看第一种情况
 
 1
1<%@ page language="java" contentType="text/html; charset=utf-8"
 2     pageEncoding="utf-8" buffer="0kb" autoFlush="true" %>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10 
11 aaaaaaaaaaaaa
12 <% 
13   for(int i=0;i<9;i++){
14       out.print("b");
15       
16   }
17 %>
18 <br/>
19 <% 
20   response.getWriter().write("cccccccccccc");
21  response.flushBuffer();
22 %>
23 
24 ddddddddddddddddd
25 </body>
26 </html>

先看上面这段代码的输入

源代码

这段代码和源代码我解释一下:

当页面执行的时候所有页面元素和输出,都缓存在了页面缓冲区,当执行到response.getWriter().write("cccccccccccc");这一句的时候,就是把“cccccccccccc”一段字母缓存在了response缓存区,这时候没有响应给客户端,然后在接着执行,等所有的页面都执行完,out缓冲区的数据会flush到response缓冲区,这个时候开始相应客户端,而“cccccccccc”这一段自然就会在html标签的上面先响应给浏览器。

2,下面看第二种情况,我把buffer的缓冲区大小设置为0

<%@ page language="java" contentType="text/html; charset=utf-8"
 2     pageEncoding="utf-8" buffer="0kb" autoFlush="true" %>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10 
11 aaaaaaaaaaaaa
12 <% 
13   for(int i=0;i<9;i++){
14       out.print("b");
15       
16   }
17 %>
18 <br/>
19 <% 
20   response.getWriter().write("cccccccccccc");
21  response.flushBuffer();
22 %>
23 
24 ddddddddddddddddd
25 </body>
26 </html>

输入如下:

说明我把buffer设置成0的时候页面不缓冲数据,每执行一行,就会放置到response的缓冲区,自然就在最头部,然后执行到response.getWriter().write("cccccccccccc");这一句的时候同样插入到了response缓冲区,这样就按照顺序,执行,直到最后输出信息都写入response缓冲区为止,开始相应客户端。所以看到的自然就是按照顺序的。

3种情况,我给当前page页面的缓冲区设置了1kb当页面内容满了之后,out会自动调用,flush方法,这个时候,直接把page缓冲取得内容响应给客户端,所以就会出现,“cccccccccc”穿插在了一串bbb中,这是应为

循环的时候有吧bbbb缓存到page缓冲区,就相当于第一种方法的那个过程了。大家应该理解了吧。

 1 <%@ page language="java" contentType="text/html; charset=utf-8"
 2     pageEncoding="utf-8" buffer="1kb" autoFlush="true" %>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10 
11 aaaaaaaaaaaaa
12 <% 
13   for(int i=0;i<900;i++){
14       out.print("b");
15       
16   }
17 %>
18 <br/>
19 <% 
20   response.getWriter().write("cccccccccccc");
21  response.flushBuffer();
22 %>
23 
24 ddddddddddddddddd
25 </body>
26 </html>
原文地址:https://www.cnblogs.com/albertzhangyu/p/8932998.html