这是今天在做java web作业时,发现的问题。原题如下:
我没有直接复制这段代码到我的test.jsp里面,而是只复制了body部分。而后输出的结果是这样的:
我很纳闷为什么会是这样的结果,不应该是first line在第一行吗?于是我问了我的同学,我的同学输出确是first line在第一行的,他截了他的代码图给我:
然后我发现我的代码在指令部分少了一个属性的设置buffer=“none”:
于是我添加了属性后就对了,但是我很疑惑啊,为什么添加了它就是这个效果呢?
我看了几篇博客后,宏观上觉得是因为这个原因:这里有两个缓冲区,out缓冲区和response.getWriter()缓冲区,这两个缓冲区是有优先级的,response缓冲区里面的内容最先输出,而后输出out缓冲区里面的内容。但是因为这里的buffer设置了out缓冲区的内存为0,故直接输出了。具体原因看下面这位朋友的解释,最开始是他博客的链接地址。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
https://my.oschina.net/javaalex/blog/734249
1、首先介绍write()和print()方法的区别:
(1)、write():仅支持输出字符类型数据,字符、字符数组、字符串等
(2)、print():可以将各种类型(包括Object)的数据通过默认编码转换成bytes字节形式,这些字节都通过write(int c)方法被输出
2、介绍response.getWriter()和out的区别:
(1)、out和response.getWriter的类不一样,一个是JspWriter,另一个是java.io.PrintWriter。
(2)、执行原理不同:JspWriter相当于一个带缓存功能的printWriter,它不是直接将数据输出到页面,而是将数据刷新到response的缓冲区后再输出,
response.getWriter直接输出数据(response.print()),所以(out.print)只能在其后输出。
(3)、out为jsp的内置对象,刷新jsp页面,自动初始化获得out对象,所以使用out对象是需要刷新页面的,
而response.getWriter()响应信息通过out对象输出到网页上,当响应结束时它自动被关闭,与jsp页面无关,无需刷新页面
形象的比喻:当我们调用response.getWriter()这个对象同时获得了网页的画笔,这时你就可以通过这个画笔在网页上画任何你想要显示的东西。
(4)、out的print()方法和println()方法在缓冲区溢出并且没有自动刷新时候会产生ioexception,
而response.getWrite()方法的print和println中都是抑制ioexception异常的,不会有ioexception
out.println(""); 方法并不能在页面布局换行,只能领html代码换行,要实现页面布局换行可以:out.println("</br>");
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------