本篇继续来对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>标签),最后内容为:

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

如图所示:

  

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

      <body>
<%@ include file="/header.jsp" %>
这是内容。。。<br>
</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>标签内容:

     <body>
<%
   request.getRequestDispatcher("/header.jsp").include(request, response);
%>
这是内容。。。<br>
</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指令。

JSP的学习(5)——语法知识三之include指令的更多相关文章

  1. JSP的学习(3)——语法知识二之page指令

    本篇接上一篇<JSP的学习(2)——语法知识一>,继续来学习JSP的语法.本文主要从JSP指令中的page指令,对其各个属性进行详细的学习: JSP指令: JSP指令是为JSP引擎而设计的 ...

  2. JSP学习(2)---四种基本语法与三种编译指令

    JSP的异常可以不处理,即使是checked异常. 四种基本语法: jsp声明,jsp注释,jsp表达式,jsp脚本 三种编译指令: page,include,taglib 下面是具体的练习. sho ...

  3. Android学习之基础知识三(Android日志工具Log的使用)

    Android中的日志工具Log(android.util.Log): 1.打印日志的方法(按级别从低到高排序): Log.v():级别verbose,用于打印最为烦琐,意义最小的日志 Log.d() ...

  4. JSP的学习(6)——九大隐式对象及其out对象

    本篇将介绍JSP中的九大隐式对象,并重点介绍其中的out对象. 我们在之前的博客<JSP的学习(1)——基础知识与底层原理>一文中已经知道,JSP最终要被翻译和转换成Servlet,在转换 ...

  5. JSP的学习(4)——中文乱码的解决

    本篇将以JSP页面中可能存在的中文乱码问题进行分析和解决. 中文乱码的问题一直是国人在编程过程中的一大头疼问题,这点上在JSP.Servlet或Tomcat上随处可见.比如我们在写一个Servlet时 ...

  6. JSP的学习(2)——语法知识一

    上一篇<JSP的学习>讲述了JSP的一些基础知识和底层原理,本篇将来学习JSP所需掌握的语法知识等. JSP的语法主要包括以下几个部分的内容: 1)         JSP模板元素 2)  ...

  7. Java基础语法知识你真的都会吗?

    第一阶段 JAVA基础知识 第二章 Java基础语法知识 在我们开始讲解程序之前,命名规范是我们不得不提的一个话题,虽说命名本应该是自由的,但是仍然有一定的"潜规则",通过你对命名 ...

  8. JSP之静态include指令、动态Include指令

    (一)使用静态include指令 <%@ page language="java" contentType="text/html; charset=gb2312&q ...

  9. jsp学习--基本语法和基础知识

    一.JSP简单介绍 1.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于 ...

随机推荐

  1. 基于visual Studio2013解决算法导论之051区间树

     题目 区间树 解决代码及点评 #include <stdio.h> #include <string.h> #include <iostream> #def ...

  2. Git学习笔记总结和注意事项

    一.Git简单介绍 Git是眼下世界上最先进的分布式版本号控制系统.其特点简单来说就是:高端大气上档次! 二.Windows上Git安装 最早Git是在Linux上开发的.非常长一段时间内.Git也仅 ...

  3. shu_1548 悟空问题(大哥,主妖怪抓走的朋友!)

    http://202.121.199.212/JudgeOnline/problem.php?cid=1078&pid=17 分析:  直接暴力了.. . 代码: #include <s ...

  4. 2^x mod n = 1 【杭电-HDOJ-1395】 附题

    /* 2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. iTextSharp

    iTextSharp 116毫秒处理6G的文件   前言: 有一家印刷企业专为米兰新娘,微微新娘,金夫人这样的影楼印刷婚纱相册.通过一个B2B销售终端软件,把影楼的相片上传到印刷公司的服务器,服务器对 ...

  6. 轻量化ViewControllers,读文章做的总结

    推荐一个网站 http://objccn.io/ 我这两天才开始看 获益匪浅 看了第一篇文章 <更轻量的View Controllers>感觉写的不错 感觉作者 原文地址 http://o ...

  7. C/C++取出变量的每一位的值(第一次知道还有QBitArray)

    前写程序最多也只是字节级别操作,用char和memcpy进行一系列内存操作.此次一个sdk,其状态值直接是每位一个标示,所以需要取出每位进行操作.当然CPP也有丰富的位运算操作,但是虽然也学过,知道意 ...

  8. 统一横轴墨卡托投影(UTM)

    UTM 坐标系统使用基于网格的方法表示坐标.UTM 系统将地球分为 60 个区,每一个区基于横轴墨卡托投影.画图法中的地图投影方法能够在平面中表示一个两维的曲面,比如一个标准地图.图 1 展示了一个横 ...

  9. Swift - 网络请求报App Transport Security has blocked a cleartext错

    使用Xcode7编写iOS9应用时,如果获取http://数据时会报如下错误: App Transport Security has blocked a cleartext HTTP (http:// ...

  10. [置顶] Hibernate从入门到精通(七)多对一单向关联映射

    上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本次博文我们讲解一下多对一关联映射 多对一单向关联映射 多对一关联映射与一对一关联映射类似,只是在多 ...