include指令与jsp:include动作的区别
众所周知,我们编写的jsp页面到tomcat服务器会被转换为servlet,然后再编译为class字节码文件。现在我们结合这个过程看一下jsp中include指令与include动作的区别。

对比
include指令
jsp:include动作
总结补充


对比
直接看下面的表格,里面对比了二者的主要区别。 文章正文图片

其他的我们暂且不关心,直接看第三点和第四点,包含的内容和转换成的servlet。

include指令
为了方便叙述,先新建一个简单的web工程,里面新建一个index.jsp页面,然后再新建一个date.jsp页面,由于只需要简单的指令,所以date.jsp里面不需要包括HTML相关的东西。index.jsp如下:index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <h1>include指令测试</h1>
    <%@include file="jsp/date.jsp"%>

</body>
</html>

其次是date.jsp:
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
    String str = "hello";
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd E a hh:mm:ss");
    out.println(format.format(new Date()));
%>

date.jsp里面只是定义了一个字符串 str, 后面定义了一个日期格式,并将日期格式化输出。

将以上工程部署至服务器,然后启动服务器。访问项目,项目正常运行。接下来打开tomcat的安装目录,在“安装目录/work/Catalina/localhost”目录下面可以找到刚刚部署的项目,然后打开相应的包路径,可以看到生成了两个文件,分别为一个.java源文件和一个.class字节码文件。如下: 文章正文图片

那明明是两个jsp,为什么只有一个源文件和一个字节码文件呢,这就是表格中说的第三点和第四点的综述。即include指令是将包含的文件整个地包含进来,及包含的是目标文件地源码,所以部署地时候服务器只转换出一个servlet,自然也就只有一个与该servlet对应地字节码文件。 为了验证以上说法,我们打开目录下地.java文件,在其中可以看到如下内容: 文章正文图片

可以看到,其中红框之内的内容正是我们在date.jsp里面写的内容,所以二者合体转换为一个Servlet。下面再看看include动作又是什么情况。

jsp:include 动作
在之前地基础上新建一个jsp文件,取名为newPage.jsp。其内容如下: newPage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>jsp:include 动作测试</h1>
    <jsp:include page="date.jsp"></jsp:include>
    <%
        String str = "hello world";
        out.println(str);
    %>
</body>
</html>

更新部署的项目,保存访问,执行正常。接下来我们依旧打开tomcat的work目录,找到当前工程所在文件夹,然后可以看到在对应的路径下面生成了四个文件,显然,两个.java文件对应转化的servlet,其余为编译之后的字节码文件,如下: 文章正文图片

所以,结合表格中的内容可知include动作只是对包含的内容做了一个引用,并不是像include指令那样包含目标代码。在服务器上,每个用到的jsp页面都会被独立地转换为servlet,所以可以看到上述有两组文件(两组.java + .class)。为了证实以上说法,我们可以打开newPage_jsp.java,可以看到如下内容: 文章正文图片


总结补充
另外,还有一点是可以证明include是包含目标源码,而include动作是引用。date.jsp内我们定义了一个字符串 str, 接下来我们可以在index.jsp内也试着定义一个同名的变量,刚定义完eclipse就会提示重复的局部变量文章正文图片

而在newPage.jsp里面也试一下,完全没问题,访问也正确输出: 文章正文图片

这充分说明了include指令相当于将包含与被包含的目标融为一体,所以会有重复的局部变量。而include动作对于每个jsp来说,各自都是独立的,是调用关系。
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门