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,访问结果如下

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

为什么呢,怎么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页面

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代码

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

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

从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/3/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中$.each 和$(selector).each()的区别详解

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

  6. JS中escape()、encodeURI()、encodeURIComponent()区别详解

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

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

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

  8. java中==和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. C#设计模式-策略者模式

    状态模式是对某个对象状态的抽象,而本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方法的抽象,下面具体分享下我对策略模式的理解. 一. 策略者(Stragety)模式 在现实 ...

  2. 将WordPress安装在网站子目录的相关问题

    May182013 将WordPress安装在网站子目录的相关问题 作者:xieyc   发布:2013-05-18 00:11   字符数:3423   分类:站长   阅读: 12,054 次   ...

  3. Dreamweaver 扩展开发:文档路径等信息的处理

    //browseFile(fieldToStoreURL){ //getFullPath(filePathURL){ //getSimpleFileName() { //fixUpPath(docUR ...

  4. SQL Server-聚焦EXISTS AND IN性能分析(十六)

    前言 前面我们学习了NOT EXISTS和NOT IN的比较,当然少不了EXISTS和IN的比较,所以本节我们来学习EXISTS和IN的比较,简短的内容,深入的理解,Always to review ...

  5. 搞定.NET MVC IOC控制反转,依赖注入

    一直听说IOC,但是一直没接触过,只看例子好像很高达上的样子,今天抽了点时间实现了下,当然也是借助博客园里面很多前辈的文章来搞的!现在做个笔记,防止自己以后忘记! 1.首先创建MVC项目 2.然后新建 ...

  6. springMVC+ajax 文件上传 带进度条

    前端代码: <form id= "uploadForm"> <p >指定文件名: <input type="text" name= ...

  7. Linux驱动开发——pr_fmt的用法

    作者:彭东林 邮箱:pengdonglin137@163.com 在阅读kernel代码的时候,总是看到有很多驱动都在第一行定义pr_fmt,闲来没事,分析了一下, 发现,确实挺方便的.下面记录分享一 ...

  8. 最适合作为Java基础面试题之Singleton模式

    看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...

  9. 如果你也会C#,那不妨了解下F#(5):模块、与C#互相调用

    F# 项目 在之前的几篇文章介绍的代码都在交互窗口(fsi.exe)里运行,但平常开发的软件程序可能含有大类类型和函数定义,代码不可能都在一个文件里.下面我们来看VS里提供的F#项目模板. F#项目模 ...

  10. Entity Framework 教程——概述

    Entity Framework 基础 本教材将手把手教你使用entity framework,我们将使用entity framework 6.0和visual studio 2012. 以下表格是e ...