首页 > 代码库 > jsp中的@include与jsp:include区别详解

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

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

image

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

image

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

image

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

image

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

image

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

image

         从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方式,这样两个页面时单独编译的,最后才将编译的结果合并起来。所有就不会出错。

收工,搞定,完毕!