v 应答主体的缓冲
Ø HTTP应答消息即包含首部也包含应答主体
ª 首部将告诉浏览器应答主体中所含数据的类型(HTML文本、图像)、应答主体的大
小、应答主体是否可以被缓存等信息。
ª 所有的应答首部必须在应答主体被发送之前发送到浏览器去。
ª 一旦JSP页面向消息主体中写入了什么东西,JSP就会开始把应答发送到浏览器中,
这时再设置首部就太晚了,因为首部会最先被发送出去。
ª 任何邡在JSP页面中而由不是JSP元素的内容,都将被JSP容器自动写入应答主体
中。
ª JSP元素本身是由JSP容器来执行的,它们永远不会出现在应答中。
ª servlet规范规定在应答提交之后就不能再设置首部了,并且当数据已经被写入应答
主体之后就不能再转发请求了。
Ø JSP容器缓冲:JSP容器将把任何不是JSP元素的内容和所有由JSP元素生成的动态内容
写入到缓冲区中,而不是一旦有东西被写入应答主体就马上把应答发送到浏览器。
ª 在某个特定的时候,比如缓冲区已经被填满,或者已经达到了页面的结尾,容
器就会把所有已经设定好的首部发送出去,然后发送缓冲区里应答主体的内容。
ª 当整个页面处理完毕的时候,JSP容器将先发送所有的首部,然后再发送缓冲
区中的内容。
ª 可以使用page指令的两个属性来控制缓冲区的大小,并规定当缓冲区被充满时
应该采取的操作。
<%@ page buffer=”12kb” autoFlush=”false”%>
Buffer属性值指定了缓冲区大小的最小值,容器可以选择使用比这个值大一些的缓冲区,这个值必须是以千字节为单位的数字,后面紧跟kb。默认情况下一个缓冲区至少8kb大小。也可以使用none关键字,这样JSP容器将不会对应答主体执行任何操作。
AutoFlush属性指定了当缓冲区已满时应当执行的操作。True:当缓冲区已满时,缓冲区中的内容将被发送到浏览器(缓冲区被排空),而页面剩余部分将被放入缓冲区,直到缓冲区再次被填满。False:当缓冲区被填满时,JSP容器将抛出一个异常,并结束对页面的处理。
ª 大多数情况应该使用默认值,如果有一个特别大的页面,而又必须在页面的结尾处设置首部,那么就需要增加缓冲区的大小。
ª 如果页面生成速度缓慢,而你又想尽快的把已经产生的结果发送给浏览器,可以禁用缓冲。
ª 不管把buffer属性设成了什么值,都可以用下面的小脚本来强制性地排空缓冲区。
<% out.fjush();%>
v 引入页面片段
ª 可以使用一个JSP指令或者一个标准行为,在JSP页面中引入其他的页面片段。
ª include指令:在翻译阶段(将JSP页面转换成servlet的阶段),JSP的include指令会读入
指定的页面中的内容,并将这些内容和原来的页面融合在一起。
<%@ include file=”header.html”%>
© 引入的页面可以只包含静态内容(例如HTML),也可以是一个普通的JSP页面。主页面和引入的页面融和在一起(引入的页面只是最为普通的文本进行融合,并不对动态内容求值),融合后的完整页面再被整体的转换为一个servlet。
© 这意味着主页和被引入的页面共享所有的页面作用域数据。因此,如果主页面中声明了一个变量,而在某个被引入的页面中也声明了一个同名的变量,那么在翻译阶段将会造成一个错误,因为组合后的页面无法进行编译。
© include指令的一个常见用法是引入应用程序的所有页面都需要的公共声明。
© JSP规范建议在使用include指令引入JSP页面时,最好使用不同的文件扩展名,因为它们一般都不是完整而合法的页面,如:可以使用这些替代的文件扩展名:.jspf或 .jsf。
© 被引用页面改变后,容器可能不会马上产生反应。
ª <jsp:include>指令用于在运行时引入另外的资源。
© <jsp:include page=”navigation.jsp”/>
© 这个指令是在请求处理阶段而不是在翻译阶段执行的。该行为并不是要引入指定页面的实际内容,它将引入执行该引入页面后所产生的应答,这意味着你可以指定任何能够产生文本应答的web资源。JSP容器将通过一个内部的函数调用来调用指定的资源。因此,这些被引入的资源可以帮助处理原来的请求,所以这些资源可以访问请求作用域内的所有对象,以及所有的请求参数。但是要注意,它不能访问任何页面作用域属性,或是在主页面中声明的脚步变量。
©<c:import>行为和<jsp:include>相同,另外它还可以从外部资源引入数据,比如不同的web应用程序,或者一个FTPfuwq。
© 所以应该使用<c:import>来代替<jsp:include>的使用。
© 被引用页面改变后,新版本会立即投入使用。
ª include 和<jsp:include>行为直接的区别
语法 执行时间 引入的内容
<%@ include 翻译阶段 静态文本(HTML、JSP),在JSP页面被转换
File=”relativeURI”%> 为servlet之前和他融合在一起
<jsp:include 请求处理阶段 执行页面或servlet所生成的应答文本
Page=”relativeURI”
Flush=”true/false”/>
v 客户端代码包括JavaScript和Java applet
Ø 使用JavaScript
ª 在JSP页面中包含的JavaScript代码,容器不会把它看作是代码,它只会把这些代码看作是模板文本,并仅仅把它和其他应答一起发送到浏览器去。
ª 浏览器调用JSP页面的唯一方式是发送一个HTTP请求,JavaScript事件处理器无法直接调用JSP元素。
ª JavaScript可以要求浏览器去请求一个完整的页面,但是脚本无法处理应答。
v 防止JSP页面被缓存
Ø 浏览器和服务请求都可以缓存用户访问过得页面,但有时不希望页面被缓存,可以
ª <%
response.addHeader(“Paragma”,”no-cache”);
response.setHeader(“Cache-control”,”no-cache”);
response.setDateHeader(“Expires”,0);
%>
setDateHeader(“Expires”,0)方法将值转换为“Thu,1 Dec 1970 00:00:00 GMT”,也就是,设置为过去的时间,保证了客户端可以在每次请求该页面时获得一个最新的副本,以达到不缓存页面的作用。