zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    613. Shortest Distance in a Line
    182. Duplicate Emails
    181. Employees Earning More Than Their Managers
    180. Consecutive Numbers
    612. Shortest Distance in a Plane
    178. Rank Scores
    177. Nth Highest Salary
    610. Triangle Judgement
    二维气泡弹窗
    jQuery触发a标签的click事件和原生javascript的区别
  • 原文地址:https://www.cnblogs.com/albertzhangyu/p/8932998.html
Copyright © 2011-2022 走看看