zoukankan      html  css  js  c++  java
  • JSP中include指令和include动作的区别

    JSP中include指令和include动作的区别

      include指令是编译阶段的指令,即include所包含的文件的内容是编译的时候插入到JSP文件中,JSP引擎在判断JSP页面未被修改,否则视为已被修改。由于被包含的文件是在编译时才插入的,因此如果只修改了include文件内容,而没有对JSP修改,得到的结构将不会改变,所以直接执行已经存在的字节码文件,而没有重新编译。因此对不经常变化的内容,用include指令是合适的,如果需要的内容是经常变化的,则需要动作元素<jsp:include>.下面将详细区分他们之间的不同

     

    1.include指令
        include可以在JSP页面转换成Servlet之前,将JSP代码插入其中。它的主要优点是功能强大,所包含的代码可以含有总体上影响主页面的JSP构造,比如属性、方法的定义和文档类型的设定。它的缺点是难于维护只要被包含的页面发生更改,就得更改主页面,这是因为主页面不会自动地查看被包含的页面是否发生更改。

    语法:<%@ include file="sample.jsp" %>

    2.include动作
        jsp:include动作是在主页面被请求时,将次级页面的输出包含进来。尽管被包含的页面的输出中不能含有JSP,但这些页面可以是其他资源所产生的 结果。服务器按照正常的方式对指向被包含资源的URL进行解释,因而这个URL可以是Servlet或JSP页面。服务器以通常的方式运行被包含的页面, 将产生的输出放到主页面中,这种方式与RequestDispatcher类的include方法一致。它的优点是在被包含的页面发生更改时,无须对主页 面做出修改。它的缺点是所包含的是次级页面的输出,而非次级页面的实际代码,所以在被包含的页面中不能使用任何有可能在整体上影响主页面的JSP构造。

    语法: <jsp:include page="sample.jsp" flush="true"> <jsp:param name="name" value="value"/> </jsp:include>

       其中参数设置可以没有,如果没有参数设置,则必须采用<jsp:include page="sample.jsp" flush="true"/>形式

    3. 使用include动作还是include指令?

      使用include指令,如果被包含的文件发生改变,那么,用到它的所有Jsp页面都需要更新。

      仅当include动作不能满足要求时,我们才应该使用include指令。

      有 些开发人员认为include指令生成的代码执行起来比使用include动作的代码更快。尽管原则上由可能的确如此,但性能上的差异很小,以致难以测 量,同时,include动作在维护上的优势十分巨大,当两种方法都可以使用时,include动作几乎肯定是首选的方法。

      对于文件包含,应该尽可能地使用include动作。仅在所包含的文件中定义了主页面要用到的字段或方法,或所包含的文件设置了主页面的响应报头时,才应该使用include指令。

    既然include指令产生难以维护的代码,为什么人们还要使用它呢?
      因为include指令更为强大。include指令允许所包含的文件中含有影响主页面的Jsp代码,比如响应报头的设置和字段、方法的定义。

     

    例子://subpage.jsp
    <%! int num=0; %>

    //mainpage.jsp
    <html>
     <body>
      <%@ include file="subpage.jsp" %>
      <%= num %>
     </body>
    </html>

    当然使用include动作时这是不可能的,因为num变量未定义,主页面不能成功的转换成servlet。

    include指令 可以影响到主页面 ,在子页面定义了一个num, 主页面就有了num变量,

    而include动作,子页面定义的变量 影响不到主页面,所以会报错了。

     

    include指令是静态包含,在编译主页面的之前,就把子页面原封不动的,加载进来,然后一同编译。

    所以如果使用 include指令 ,在每次更新子页面,之后就要重新 编译主页面,如果不重新编译主页面,主页面还会应用原来的子页面,而不是更新过的子页面。

    总的来说,子页面是在加载到主页面之后,一起编译的。

     

    而使用include动作 是动态包含。子页面和主页面分开编译,而且是在每次请求的时候都编译一回,所以说可以看成是两个页面。

    <jsp:include>动作指令是用来包含一个静态的或动态的文件.这里的include动作标签与用以静态插入文件的include命令指令不同,主要体现在两个方面:一,include命令指令在翻译阶段执行,而include动作标签在请求处理阶段执行;二,include命令引入静态文本时,是在JSP页面被转化成Servlet之前和它融合到一起的,而include动作标签是在需要引入执行页面时,才动态调用被包含文件编译后产生的Servlet类所生成的应答文本的.
    因此,如果对包含的文件进行了修改,那么运行时可以看到所包含文件修改后的结果.而静态include命令指令包含的文件如果发生了变化,则必须重新编译JSP页面,否则只能看到所包含的修改前的文件内容.
    比如:
    第一种是静态包含.
    被引用的页面date.jsp代码:

    <%@ page contentType="text/html;charset=GB2312" %>
    <%
    java.util.Date date=new java.util.Date();
    String date_cn ="";
    String dateStr = "";
    switch(date.getDay())
    {
    case 0:date_cn ="日"; break;
    case 1:date_cn ="一"; break;
    case 2:date_cn ="二"; break;
    case 3:date_cn ="三"; break;
    case 4:date_cn ="四"; break;
    case 5:date_cn ="五"; break;
    case 6:date_cn ="六"; break;
    }
    dateStr = (1900+date.getYear()) + "年" + (date.getMonth()+1) + "月" + date.getDate() + "日(星期" + date_cn + ")";


    %>
    <%=dateStr%>

    引入的页面test.jsp代码:

    <%@ page contentType="text/html; charset=GB2312" %>
    <html>
    <head>
    <title>include的两种用法</title>


    <%@ include file="date.jsp"%>//静态引入date.jsp页面

    <head>
    <body>
    <table><tr><td>
    有关jsp中include的两种用法.敬请关注。
    </td></tr></table>
    </body>
    </html>

    运行时出现错误提示:

    HTTP Status 500-

    org.apache.jasper.JasperException: /date.jsp(0,0) Page directive: can't have multiple occurrence of contenType

    原因是在翻译阶段,date.jsp文件的代码被原封不动的加入到了test.jsp页面,从而合成一个文件.合成后的文件中出现重复的<%@ page contentType="text/html;charset=GB 2312"%>代码.而一个JSP页面中不允许重复出现contentType属性.因此解决的办法是把date.jsp文件中的这句重复代码删掉.

    刷新后再执行test.jsp页面,结果就对了.

    第二种是动态包含.
    被引入的页面date.jsp代码:


    <%
    java.util.Date date=new java.util.Date();
    String date_cn ="";
    String dateStr = "";
    switch(date.getDay())
    {
    case 0:date_cn ="日"; break;
    case 1:date_cn ="一"; break;
    case 2:date_cn ="二"; break;
    case 3:date_cn ="三"; break;
    case 4:date_cn ="四"; break;
    case 5:date_cn ="五"; break;
    case 6:date_cn ="六"; break;
    }
    dateStr = (1900+date.getYear()) + "年" + (date.getMonth()+1) + "月" + date.getDate() + "日(星期" + date_cn + ")";


    %>
    <%=dateStr%>

    引入页面test.jsp代码:

     

    <%@ page contentType="text/html; charset=GB2312" %>
    <html>
    <head>
    <title>include的两种用法</title>


    <jsp:include page="date.jsp" flush="true"/>

    <head>
    <body>
    <table><tr><td>
    有关jsp中include的两种用法.敬请关注。
    </td></tr></table>
    </body>
    </html>

    运行后页面上输出的日期中中文出现了乱码,这是因为动态引入页面时,实际上只是引用了date.jsp这个文件被转化并被编译后产生的Servlet类文件.date.jsp作为一个单独的文件在执行后才被test.jsp文件运行时调用.由于date.jsp文件中没有指定字符编码,所以出现了乱码.

    解决办法是在date.jsp文件中把刚才去掉的 <%@ page contentType="text/html;charset=GB2312"%> 代码加入

  • 相关阅读:
    CMY/CMYK 打印机色彩
    safe RGB colors
    人眼内的三类视锥细胞
    函数极限的定义
    Region的周长, 面积与紧凑程度
    Boundary Representations
    Boundary Following Algorithm
    Region Representaion and Description
    JavaSE编码试题强化练习5
    JavaSE编码试题强化练习4
  • 原文地址:https://www.cnblogs.com/qylbg/p/3561489.html
Copyright © 2011-2022 走看看