4.4 out对象

out对象是javax.servlet.jsp.JspWriter的一个对象,它能把信息发送给客户端的浏览器。out对象常用的方法是print()和println(),两者都在浏览器上显示信息。out对象最主要的功能在于将特定的数据内容搭配JSP程序代码动态输出至客户端的浏览器网页,在前面章节的范例中,已经初步介绍了如何使用这个对象进行文本输出,这一节将进一步说明out对象的相关特性。

4.4.1 out对象方法成员与数据输出

除了使用println()方法外,out对象也提供了一些用来控制输出的相关方法成员。表4-5列出了其中比较常用的方法。

表4-5 out对象的常用方法

表4-5中将这些方法分成两大类,其中一类用于控制缓冲区的行为;另一类则是数据的输出操作。缓冲区是一种数据暂存的应用概念,用以存储暂时性的数据内容。下面首先介绍与数据输出相关的方法成员。

关于数据输出的方法成员包含newLine、print和println,其中newLine在网页中输出一个新行,例如下面的程序代码:

     out.newLine() ;

这一行程序代码输出一行空白,当网页的输出内容必须以行空白作分隔时,可以使用这个方法进行输出。

print()和println()这两个方法成员被引用时均接受一个特定类型的参数,并且将这个参数输出至网页上,例如下面的程序代码:

     out.print("Hello JSP") ;
     out.println("Hello JSP") ;

其中第1行程序代码将Hello JSP直接输出至网页上,第2行则在输出Hello JSP之后,紧接着加上一个断行,但这个换行符在浏览器中会被忽略,要想真正在页面中实现换行,就需要在输出内容的最后加上换行标签<br>。除了字符串,其他种类的数据类型也能够被当作参数输出至网页。

JSP程序利用out对象将网页内容输出时,都要和客户端做一次连接,并且会为此消耗不少的资源;因此可以将要输出的内容放在一个固定大小的缓冲区中,等到缓冲区满时再一次将内容送往客户端,这就要将autoFlush设为true,否则缓冲区满时将产生IOException错误。设置代码如下:

     <%@ page autoFlush="true"%>

注意

out.print()方法与out.println()方法的区别是:out.print()方法在输出完毕后并不结束该行,而out.println()方法在输出完毕后会结束当前行,下一个输出语句将在下一行开始输出。

4.4.2 缓冲区操作

缓冲区是JSP将数据输出至浏览器之前,用来暂时存储数据的一块区域,顾名思义,这块区域提供一种数据输出的缓冲机制,让数据从服务器真正送出到客户端浏览器之前能够有重新调整的机会。

如图4-15所示是缓冲区操作的说明图示,其中JSP网页在将数据传送至浏览器之前,会被存放在预先定义的缓冲区里面,最后才被整批输出至客户端的浏览器。

图4-15 缓冲区操作

内置对象中的out对象和response对象,均提供控制缓冲区的方法,这些方法的行为相当类似,下面介绍out对象操作缓冲区的方式。

表4-5列举的out对象方法成员,与缓冲区作业有关的有6个方法。其中前3个成员clear、clearBuffer和flush用于清空缓冲区内容,后3个成员则用来取得缓冲区目前的状态,它们分别为getBufferSize、getRemaining和isAutoFlush。下面针对这几个方法成员进行较为详细的说明。

clear()与clearBuffer()方法均用于清空缓冲区的暂存数据内容,其差异主要是在引用clear方法时,缓冲区必须存在存储的数据,否则系统会引发一个IOException异常,而clearBuffer()方法比较单纯,只负责清除操作而不在乎是否存在任何数据。

flush()是另外一个具备清空缓冲区数据内容功能的成员,在引用该方法时,系统会进一步将所清空的数据内容输出到网页,因此若是想将存储的数据内容清空输出至网页,使用这个方法是比较合适的。

除了清空缓冲区的操作外,还可以利用另外3个方法成员取得缓冲区当前的状态:getBufferSize()返回一个表示当前缓冲区大小的整数值;而getRemaining()所返回的整数值则是当前缓冲区中剩余的空间大小;IsAutoFlush()用来设置当数据存储量大于缓冲区剩余空间时,是否清空其中的数据内容,是则返回值为true,否则返回值为false。

4.4.3 out对象应用实例

【例4-10】在outBuffer.jsp页面中实现out对象对缓冲区的操作。

outBuffer.jsp的代码如下:

程序代码out.println("JSP程序设计<br>");设置要输出的字符串为JSP动态网页,此字符串会被先存入缓冲区,clearBuffer()方法清空缓冲区的数据,因此字符串JSP动态网页最后并不会显示在用户的浏览器上。程序最后的out.close()关闭输出流,所以hello也不会显示在用户的浏览器上。

程序代码out.println("清华出版社<br>");设置要输出的字符串为“清华出版社”,flush()方法直接将缓冲区中的内容输出。out.getBufferSize()和out.getRemaining()方法输出缓冲区的存储容量与剩余空间大小,其运行结果如图4-16所示。

图4-16 outBuffer.jsp运行结果

以上的运行结果反映了方法clearBuffer()的运行效果,引用此方法之前的内容均没有被显示出来,甚至标题栏文字也消失了。为了更清楚地进行说明,通过“查看”|“源文件”,打开如图4-17所示的网页源文件。

图4-17 outBuffer.jsp源文件

现在将程序代码中引用方法clearBuffer()的这一行程序代码批注掉,如:

     //out.clearBuffer();

此时重新浏览此范例,得到的输出结果如图4-18所示,所有的文字均已输出到了网页上。

图4-18 取消清除缓冲区后的运行结果

值得注意的是,下面这一行代码设置了此范例标题栏的HTML:

     <TITLE>演示 out 对象缓冲区的操作</TITLE>

由于缓冲区中所存储的数据包含HTML标签,因此引用clearBuffer()方法同样会将其内容清除,由于此次已将clearBuffer()方法批注掉,因此图中的标题已经出现,用户可以对比上述的输出结果以了解其中的差异。

【例4-11】创建outExample.jsp页面,实现out对象对数据的输出操作。

outExample.jsp的代码如下:

程序运行结果如图4-19所示。

图4-19 outExample.jsp运行结果