jsp中的@include与jsp:include区别详解

时间:2022-03-09 22:49:41

1 前言

搞java开发的人也许都知道在jsp中引入项目中其他文件有如下两种方式

<%@include file="xxx.jsp"%>
   <jsp:include page="xxx.jsp"></jsp:include>

我们也许会使用这两种方式,但是也许很多人不名称这两种方式的区别。下面我们来看看下面的两个例子

2 开门见山引出问题

(1) /include/include.jsp

<%@ page language="java"  pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
%>
<h1>include页面</h1>

(2)/ index1.jsp页面

<%@ page language="java" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
%>
<!DOCTYPE HTML>
<html>
  <head>
  </head>
  <body>
      <h1>index页面</h1>
       <%@include file="/include/include.jsp"%>
  </body>
</html>

(3) /index2.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
%>
<!DOCTYPE HTML>
<html>
  <head>
  </head>
  <body>
      <h1>index页面</h1>
      <jsp:include page="/include/include.jsp"></jsp:include>
  </body>
</html>

现在我们访问index1.jsp,访问结果如下

jsp中的@include与jsp:include区别详解

那我们继续访问index2.jsp,结果如下

jsp中的@include与jsp:include区别详解

为什么呢,怎么index1.jsp为什么访问报错了啊,看来@include与jsp:include是有区别的吧。只有搞懂@include与jsp:include这两种方式的底层区别,我们就知道为什么index1.jsp页面会发生错误了。请继续看下去你就会明白了。

3 @include与jsp:include内部区别

为了演示出@include的正确效果,我们再写两个页面

(1)/include/include1.jsp

<%@ page language="java"  pageEncoding="UTF-8"%>
<h1>include1页面</h1>

(2) /index3.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
%>
<!DOCTYPE HTML>
<html>
  <head>
  </head>
  <body>
      <h1>index页面</h1>
      <%@include file="/include/include1.jsp" %>

  </body>
</html>

我们访问index3.jsp页面

jsp中的@include与jsp:include区别详解

OK,我们发现结果正确了,可以对比了include1.jsp与include.jsp看看哪里改动了。我们知道当我们访问jsp页面时,servlet容器(如tomcat)会把jsp编译成servlet java代码。下面我们来看看tomcat对index1.jsp与index3.jsp生成的servlet java代码。在tomcat中我们可以在 “/tomcat目录/work/Catalina/localhost/项目名称/“中找到tomcat将jsp编译成servlet的代码。

(1) index3.jsp对应的servlet代码

jsp中的@include与jsp:include区别详解

(2) index2.jsp页面对应的servlet代码

jsp中的@include与jsp:include区别详解

访问ndex2.jsp时候在也生成了include.jsp对应的servlet代码

jsp中的@include与jsp:include区别详解

从tomcat生成的servlet代码我们可以得出两者之间的区别

4 结论

     @include:页面请求之前预编译,所有代码包含进来之后,一起进行处理,把所有代码合在一起,编译成一个servlet

     jsp:include  所有代码分别处理,在页面被请求的时候才编译,被编译成多个servlet,页面语法相对独立,处理完成之后再将代码的显示结果(处理结果)组合进来。

5  再次回到问题

为什么本文中刚开始的那个问题index1.jsp页面报错呢,大家知道了吗,原因就是include.jsp页面中和index1.jsp页面中同时都包含如下代码。

<%
      String path = request.getContextPath();
   %>

因为我们采用的include的方式,这样页面请求之前所有代码先包含进来之后再一起处理,这样代码中就有两个path变量。这样就不符合java语法了。所有就报500错误了。为什么index2.jsp没有错误了,因为采用的jsp:include方式,这样两个页面时单独编译的,最后才将编译的结果合并起来。所有就不会出错。

收工,搞定,完毕!

jsp中的@include与jsp:include区别详解的更多相关文章

  1. PHP 中 include 和 require 的区别详解

    require() 语句的性能与 include() 相类似,都是包括并运行指定文件.除了处理失败的方式不同之外.require 在出错时产生 E_COMPILE_ERROR 级别的错误,终止脚本运行 ...

  2. PHP中include和require的区别详解

    1.概要 require()语句的性能与include()相类似,都是包括并运行指定文件.不同之处在于:对include()语句来说,在执行文件时每次都要进行读取和评估:而对于require()来说, ...

  3. 2016&sol;3&sol;27 PHP中include和require的区别详解

    1.概要 require()语句的性能与include()相类似,都是包括并运行指定文件.不同之处在于:对include()语句来说,在执行文件时每次都要进行读取和评估:而对于require()来说, ...

  4. jsp中引用的jstl 和fmt标签-详解

    JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...

  5. JQuery中&dollar;&period;each 和&dollar;&lpar;selector&rpar;&period;each&lpar;&rpar;的区别详解

    PS:晚上在写页面时,发现了一个问题,$.each 和$(selector).each()有哪些区别?百度搜索关键词,首页显示出来一些前人的经验,总结一下,发上来. 1.$(selector).eac ...

  6. JS中escape&lpar;&rpar;、encodeURI&lpar;&rpar;、encodeURIComponent&lpar;&rpar;区别详解

    avaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decode ...

  7. php中const与define的使用区别 详解

    1.const用于类成员变量定义,一旦定义且不能改变其值.define定义全局常量,在任何地方都可以访问. 2.define不能在类中定义而const可以. 3.const不能在条件语句中定义常量 i ...

  8. java中&equals;&equals;和equals和hashcode的区别详解

    一.相同点 都是用来进行值或对象的比较. 二.不同点 对于“==”而言,对于基本类型(char,byte,short,int,long,float,double,boolean),对比的是值,所以是相 ...

  9. css中postion的fixed与absolute区别详解

    fixed:固定定位,参照位置是浏览器窗口的左上角,即坐标点为(0px, 0px) absolute:绝对定位,参展位置是离当前元素最近的定位方式为fixed,absolute,relative的祖先 ...

  10. jsp中的contentType与pageEncoding的区别和作用

    jsp中的contentType与pageEncoding的区别和作用   <%@ page contentType="text/html; charset=utf-8" p ...

随机推荐

  1. win7系统64位plsql的设置

    1. Instant Client Downloads for Microsoft Windows (32-bit) 我下载的是: instantclient-basic-win32-11.2.0.1 ...

  2. P3P解决cookie存取的跨域问题

    最近在做一个流量统计的东西的时候,偶然发现IE在对iframe里面的页面写Cookie的时候有一些安全限制,导致读取Cookie不成功,找了好长时间的解决办法,重要找到如下的办法: 1.页面里的COO ...

  3. How to support comparators in our sort implementations&quest;

    上图是普林斯顿算法课part1.Mergesort章节给出的参考代码,可以发现这个代码有三处警告.造成的隐患就是我们无法在类型检查时发现送入sort()函数的数组元素类型和Comparator的泛型不 ...

  4. Nanopi2基本使用

    1.首先刷系统,把TF卡放到读卡器中,根据官网教程(http://www.arm9.net/nanopi-m2.asp)下载固件,并烧写.   2.硬件连接:把TF卡插到Nanopi2的boot卡槽, ...

  5. appium运行报错java&period;net&period;SocketException&colon; socket write error

    这个错我调了 快两天一点头绪没有,脚本正常跑没问题,但是就是控制台输出信息报错,没法定位问题在哪.报错如图: 虽然这个报错不影响测试结果,但是本人有强迫症,一定要查出究竟: 我的尝试: 1.那天试验, ...

  6. Shell编程初步

      一:Hello World 新建一个文件,命名时以 .sh 为后缀.每个bash文件开头第一行表名文件类型: #!/bin/bash 然后在下面输入代码. 比如输出hello world: #!/ ...

  7. learngin uboot design parameter recovery mechanism

    pseudocode: if( getenv(“uboot_env_init”)  !=  NULL){ if(uboot_env_init  !=  HAVE_INIT){ Set uboot_en ...

  8. dumpbin 查看dll中的导出函数

    C:\Program Files (x86)\Microsoft Visual Studio 14.0>dumpbin -exports E:\20171110\Release\aa.dll h ...

  9. python目录&sol;文件操作

    目录操作 sys.argv[0] # 获得当前脚本路径,即当前工作目录\脚本名 os.getcwd() # 获得当前工作目录 os.path.abspath('.') # 获得当前工作目录 os.pa ...

  10. Spring MVC No converter found for return value of type 解决方法

    1.在pom中添加 jackson <properties> <jackson.version>2.8.5</jackson.version> </prope ...