页面片断引入和缓冲

    技术2022-05-11  79

    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的阶段),JSPinclude指令会读入

           指定的页面中的内容,并将这些内容和原来的页面融合在一起。

           <%@ 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                翻译阶段                     静态文本(HTMLJSP),在JSP页面被转换

    File=”relativeURI”%>                                      servlet之前和他融合在一起

     

     

     

     

    <jsp:include                  请求处理阶段             执行页面或servlet所生成的应答文本

    Page=”relativeURI”

    Flush=”true/false”/>

    v 客户端代码包括JavaScriptJava 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”,也就是,设置为过去的时间,保证了客户端可以在每次请求该页面时获得一个最新的副本,以达到不缓存页面的作用。


    最新回复(0)