jsp out对象、response.getWriter与response.getOutputStream

1.
<% 
out.println("first line<br/>");
response.getWriter().println("second line<br/>");
%>
输出结果为 
second line
first line
源代码为
second line
<html>...<body>first line<br/></body></html>

解释:jsp中java代码中的out.print()中缓冲区中的内容会被一起写入到response.getWriter()得到的输出流中
上面的例子中,输出流中已经被加入了一些内容,first line部分是在后面加入的,所以second line出现在了html源代码的第一行

2.
<%
   response.getOutputStream().println("---");
%>
如果一个jsp文件中就包含这么一句话,而且在"<%"之前与"%>"之后没有任何内容,则客户端得到的html源代码就是打印的部分:"---"
如果在这个jsp文件中,还有其他的内容(在"<%"之前与"%>"之后有任何的内容),那么在客户端得到的html源代码还是与上面的一致(以外的内容无法得到),并且在服务器端抛出异常。
解释:jsp页面中的内容会被转化成out.println()的格式来输出,out这个对象的print方法,会在网页没有执行结束,或者是打印缓冲区未满的时候一直缓冲要打印的内容,知道结束的时候,将所有的要打印的内容刷新到response.getOutputStream()得到的输出流中。
上面的例子中,已经调用过了response.getOutputStream(),而这个方法只能调用一次,我们手动调用了一次,等到jsp容器自动调用这个方法的时候抛出了一个异常,这个时候容器就将出异常前 response.getOutputStream()得到的输出流中的内容返回给客户端。当然,如果除了这个代码段再没有其他的内容,那么缓冲区没东西,就不调用这个方法,服务器端也不会报错了。

3.
<% pageContext.forward("/testOut.html"); %>
这个实验结果还2中的是一样的

解释:
对于客户端对静态的html的请求,tomcat对他的处理方式是把他看成是一个缺省的servlet,然后调用那个默认的servlet,而那个默认的servlet的处理方式就是把客户端请求的.html资源找到,然后把文件的内容读出来,然后写会到客户端。
这之中还是用到了response.getOutputStream,出错的原因和2中是一样的

//其实在tomcat处理html返回到客户端的时候是先要判断 httpServletResponse.getWriter()方法是否已经被调用过了,如果是,则使用这个已经得到过的输出流对象来处理html文件的内容;如果没有调用过,那就使用 httpServletResponse.getOutputStream() 方法,通过这个方法得到的对象来处理html文件的内容。
//那是不是如果之前使用过了 httpServletReponse.getWriter() 方法,就不会调用 httpServletResponse.getOutputStream() 方法,再处理html文件的时候也不会报错了呢?
修改一下代码;
<% 
response.getWriter();
pageContext.forward("testOut.html");
%>
会不会报错呢?<br/>
这个时候的确是不报错了


4.但是在3之后,再改回来,服务器这边竟然怎么也都不报错了
原因:
默认处理html文件的那个servlet会记录着html页面的最后修改时间,而在客户端会保存这html页面的缓存,当客户端向服务器发送请求的时候,会询问服务器是否使用缓存的内容,服务器根据html的修改时间给出回应,如果html页面没有被修改,那么使用的就是缓存中的内容,也就不会调用到httpServletResponse.getOutputStream(),那么也不会报错了


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSP 中,没有 `response.setResponseBody()` 方法,可能是因为 JSP 的本质是一个 Servlet,而 Servlet 规范中并没有 `setResponseBody()` 方法。不过,你可以使用 `javax.servlet.ServletOutputStream` 或 `java.io.PrintWriter` 等类向 HTTP 响应中写入内容。 例如,你可以使用 `javax.servlet.ServletOutputStream` 类的 `write()` 方法将字节写入 HTTP 响应,如下所示: ```jsp <% response.setContentType("text/plain"); // 设置响应内容类型为纯文本 ServletOutputStream out = response.getOutputStream(); out.write("Hello, world!".getBytes()); // 向响应中写入内容 out.flush(); out.close(); %> ``` 在这个例子中,我们首先使用 `response.setContentType("text/plain")` 方法设置响应内容类型为纯文本。然后,我们通过 `response.getOutputStream()` 方法获取 ServletOutputStream 对象,使用 `write()` 方法将字符串 "Hello, world!" 写入 HTTP 响应中,最后使用 `flush()` 和 `close()` 方法关闭输出流。 你也可以使用 `java.io.PrintWriter` 类的 `print()` 或 `println()` 方法向 HTTP 响应中写入文本,如下所示: ```jsp <% response.setContentType("text/html"); // 设置响应内容类型为 HTML PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>Hello, world!</title></head>"); out.println("<body>"); out.println("<h1>Hello, world!</h1>"); out.println("</body>"); out.println("</html>"); out.flush(); out.close(); %> ``` 在这个例子中,我们首先使用 `response.setContentType("text/html")` 方法设置响应内容类型为 HTML。然后,我们通过 `response.getWriter()` 方法获取 PrintWriter 对象,使用 `println()` 方法向 HTTP 响应中写入 HTML 代码,最后使用 `flush()` 和 `close()` 方法关闭输出流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值