zoukankan      html  css  js  c++  java
  • JSP的学习(5)——语法知识三之include指令

      本篇继续来对JSP语法中的JSP指令进行学习,在《JSP的学习(3)——语法知识二之page指令》中,已经介绍了JSP指令的书写格式和page指令的详细信息,所以在这一篇中我们会对JSP指令中的include指令来进行详细的学习。

      先来回顾下JSP指令的语法格式:

    JSP指令:

      JSP指令是为JSP引擎而设计的,JSP指令不产生任何可见输出,只是告诉在转换成Servlet的过程中如何处理JSP页面中的其余部分。在JSP 2.0 规范中共定义了三个指令:

      1)   page指令

      2)   include指令

      3)   taglib指令

      taglib指令是导入标签库的指令,以后会介绍到。

    JSP指令格式:

     <%@  指令(如page、include或taglib)  属性1="属性值"   属性2="属性值"  ... %>

    例如:

     <%@  page  contentType = "text/html;charset=utf-8" %>

      如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。

    例如:

    1     <%@  page  contentType = "text/html;charset=utf-8" %>
    2     <%@  page  import = "java.util.Date" %>

    或者写成:

        <%@  page  contentType="text/html;charset=utf-8"  import="java.util.Date" %>

    include指令

      include指令用于在本JSP中引入其他JSP页面。

    语法格式:

        <%@  include  file=”/相对URL”  %>

    其中“file”属性的值为相对于web应用下的地址(给服务器的地址,因为由服务器来处理将那些JSP包含进来)。

      我们来做个简单的例子:

      新建一个web工程【JSPLearning】,并在该工程下新建一个“header.jsp”,这个JSP作为等会要被包含的JSP页面,因此我们将所有那些不必要的部分去掉,为了包含后页面的码源能有良好的格式(想想就知道了如果不去掉,就会有好几个<html>标签),最后内容为:

    1     <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
    2     这是页头 <br>

    如图所示:

      

      接着我们另建一个“1.jsp”,然后只修改<body>标签中的内容,其余不变(其实这是不太准确的,必须要保持这些JSP页面的指令不冲突)。在<body>标签中添加点可以显示的内容,并使用include指令包含“header.jsp”,内容如下:

    1      <body>
    2             <%@ include file="/header.jsp" %>
    3             这是内容。。。<br>
    4       </body>

    如图所示:

      

    那么当我们开启服务器,并部署该web工程后,在浏览器访问“1.jsp”页面就可以看到:

      

      从上诉的例子我们可以看到使用include指令确实能将不同的JSP页面进行包含,而且include指令的这种包含我们也称为静态包含。为什么这么说呢,这是因为多个JSP如果含有包含和被包含的关系的话,在由服务器端将这些JSP页面进行翻译后只会转换成一个Servlet。也就是说那些会“被”包含的JSP不会被翻译成Servlet。比如上面例子中的“header.jsp”,因为它被包含在“1.jsp”中,所以在Tomcat的【work】目录中只有“_1_jsp.java”文件,而不会有“header_jsp.java”文件:

      

    而在“_1_jsp.java”文件中有关于被包含的相关语句:

      

      挺“可怜”的不是,“header.jsp”就只剩作为“1.jsp”翻译后的Servlet中的输出字符串了,但是静态包含的性能要比动态包含的性能高的多,那什么又是动态包含呢?

      我们在学习Servlet的过程中知道对于从request.getRequestDispatcher(String path)方法获得的RequestDispatcher方法(详见《Servlet的学习之Request请求对象(3)》)不仅可以进行转发(forward()方法),还有一个包含,即include()方法,我们也可以应用在JSP中:

      对上面的例子进行改写,header.jsp文件内容不变,在1.jsp页面中重写<body>标签内容:

    1     <body>
    2         <%
    3           request.getRequestDispatcher("/header.jsp").include(request, response);
    4         %>
    5         这是内容。。。<br>
    6     </body>

    如下图所示:

      

    那么我们再次访问“1.jsp”页面:

      

      同时,动态包含最大的一点不同就是,被包含的JSP页面都会被翻译转换成各自Servlet了,我们看到在使用动态包含之后,“header.jsp”文件会被Tomcat翻译转换成“header_jsp.java”文件了:

      

      因此,如果我们使用动态包含将多个JSP页面包含到某一个JSP页面中,那么每次当用户访问该JSP页面时,服务器都要将这个JSP页面和其中包含的所有JSP页面都翻译转换成各自的Servlet(转成Servlet要写入和配置相当多的信息,看看转换后的Java文件就知道了),这就是为什么动态包含的性能不如静态包含。

      最后,注意几个关于include指令的小知识点:

      被引入的文件中的内容必须遵循JSP的语法。

      被包含的文件可以使用任意的扩展名,即使其扩展名是 .html,JSP引擎也会按照处理JSP页面的方式处理它里面的内容,为了见名知意,JSP规范中建议使用“ .jspf ”(JSP fragments)作为静态引入文件的扩展名。

      由于使用include指令会涉及到多个JSP页面,并把这些JSP页面只翻译转换成一个Servlet,所以这几个页面的指令不能冲突(除了“pageEncoding”属性和导入的包之外)。

      静态包含也称为编译时包含,动态包含也指运行时包含。

      因此在开发中应该多多使用静态包含,也就是说我们要多多使用JSP的include指令。

  • 相关阅读:
    <Docker学习>5. docker数据管理
    <Docker学习>4. docker容器的使用
    <Docker学习>3. docker镜像命令使用
    <Docker学习>2.Centos7安装docker
    java注解
    基于django的个人博客网站建立(七)
    强大的django-debug-toolbar,django项目性能分析工具
    一个简单的WebServer,socket+threading
    基于django的个人博客网站建立(六)
    基于django的个人博客网站建立(五)
  • 原文地址:https://www.cnblogs.com/fjdingsd/p/4915421.html
Copyright © 2011-2022 走看看