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区别详解,布布扣,bubuko.com