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>