静态include与动态include的区别

jsp中的include有两种形式,分别是:
<%@ include file=""%>
<jsp:include page="" flush="true" />
前者是指令元素,后者是行为元素.
<%@ include file=""%>,jsp的include指令元素读入指定页面的内容,并把这些内容融合到一起(这个过程在翻译阶段:也就是jsp被转化成servlet的阶段进行的),也就是说,jsp页面不能原封不动地被传送给浏览器,所有的jsp元素都必须首先由服务器进行处理.这是通过将jsp页面转达化成servlet,然后执行这个servlet来完成的.服务器需要一个jsp容器来处理jsp页面.jsp容器通常以servlet的形式来实现,这个servlet经过配置,可以处理对jsp页面的所有请求.
     Jsp容器负责将jsp页面转化成servlet,并编译这个servlet.这两步就构成了翻译阶段.
     由此我们就会知道:jsp页面是把include指令元素所指定的页面的实际内容(也就是代码段)加入到引入它的jsp页面中,合成一个文件后被jsp容器将它转化成servlet.可以看到这时会产生一个临时class文件和一个java文件.
<jsp:include page="" flush="true" />,是在jsp页面运行时才处理文件,被处理的文件在逻辑和语法上独立于当前JSP页面.会编译成不同的java文件
下面用代码测试动、静态include的区别:

_01_include_01.jsp 

<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jsp:include</title>
</head>
<body bgcolor="white">
    <font>
        <%@ include file="_02_date.jsp"%>
        <%= request + "--1--" + "<br>"%>

    </font>
</body>
</html>

_01_include_02.jsp

<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jsp:include</title>
</head>
<body bgcolor="white">
    <font>
         <%/*
        * 注意:jsp标签需要自己关闭,不要忘了关闭的横线
        * jsp:include 是动态加载,在jsp编译的时候,加载页面和被加载页面会被解析两个java,Servlet文件
        * javac编译器会编译两次,生成两个class文件
        * 然后再jvm运行的过程中,这个时候包含文件才去调用被包含的class文件
        * 这就是动态包含
        *
        */%>
        <jsp:include page="_02_date.jsp" flush="true" />
        <%/*
        * 上面例子可以看出,因为生成是两个不同的Servlet文件-->不同的class-->所以每个Servlet都有自己的request对象,不是同一个.但是第一个是生成一个Servlet所以是同一个
        */%>
        <%/*
        * 不同的页面,不同的request之间可以传值
        * 传值别忘了写flush,这里传值也是IO流,需要flush
        * 然后把值传递到第二个页面输出
        */%>
        <jsp:include page="_02_date.jsp?username=‘123‘" flush="true" />
    </font>
</body>
</html>

_02_date.jsp

<%@ page import="java.util.*"%>
<%= (new Date()).toLocaleString() + "<br />"%>
<%= request + "--2--" + "<br />"%>
<%= request.getParameter("username") + "<br />"%>

运行"_01_include_01"的结果:

从结果可以看出两个request对象是同一个,同一个对象之间是不能够传参的,再看看编译的java、class文件

可以看到这里只有一个java和一个class文件.

再运行"_01_include_02",

从结果可也看出两个request对象显然不是同一个,既然不是同一个,那肯定可以传参了,再看看编译的java、class文件

可以看到有两个java文件和对应的class文件.

为什么呢?
因为静态include的结果是把其他jsp引入当前jsp,两者合为一体      
动态include的结构是两者独立,直到输出时才合并( 看看jsp生成的java文件就可以知道了)
下面两幅图,是动态和静态include的区别的图解

静态include图解:

动态include图解:

时间: 2024-08-07 09:02:36

静态include与动态include的区别的相关文章

JSP页面静态包含和动态包含的区别与联系

---恢复内容开始--- JSP页面静态包含和动态包含的区别与联系: 1.<%@ include file=" " %> 是指令元素,<jsp:include page=" "/> 是行为元素. 2.静态包含: 语法:<%@ include file=" " %>, 包含文件先是要直接复制一份内容到主体页面内,然后被包含的内容一起和主体转换成.class文件.只出现一个.class文件一个java文件,最终编译

iOS 中的静态库与动态库,区别、制作和使用

如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名. 静态库与动态库的区别 静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝.动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内

静态库和动态库的区别

real framework中不可以使用类别 或 不可以不包含类文件 real framework 中直接调用NSClassFromString函数会返回null  需要强制加载指定类 或 直接通过类名引用 linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见

静态库、动态库的区别汇总

real framework中不可以使用类别 或 不可以不包含类文件 real framework 中直接调用NSClassFromString函数会返回null  需要强制加载指定类 或 直接通过类名引用 linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见

VS中Debug和Realease、及静态库和动态库的区别整理(转)

原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用. Debug 和 Release 的真正区别,在于一组编译选项. Debug 版本 参数 含义 /MDd /MLd 或 /MTd 使用 Debug ru

静态资源与动态资源的区别

静态资源:一般客户端发送请求到web服务器,web服务器从内存取到相应的文件,返回给客户端,客户端解析并渲染显示出来. 动态资源:一般客户端请求的动态资源,先将请求交于web容器,web容器连接数据库,数据库处理数据之后,将内容交给web服务器,web服务器返回给客户端解析渲染处理. 静态资源和动态资源的区别静态资源一般都是设计好的html页面,而动态资源依靠设计好的程序来实现按照需求的动态响应:静态资源的交互性差,动态资源可以根据需求自由实现:在服务器的运行状态不同,静态资源不需要与数据库参于

JSP中静态include和动态include的区别

JSP中引入别的页面或者代码段使用include命令.主要分为静态和动态. 静态引入格式:<%@ include file="test.jsp"%> 又成为指令元素 动态引入格式:<jsp:include file="test.jsp" flush="true"/> 又成为行为元素 各自优势: 静态:处理速度快:由于页面不需要变化,静态化,不容易出错:常用于公共资源设置 动态:功能模块细化好:灵活性好:易于管理和编码. 区

jsp里面include的静态导入和动态导入的区别

静态导入就是将被导入页面完全融入到导入的页面中:而动态导入只是在servlet里面插入了include方法,导入的这是被导入页面的body标签里面的内容 1.什么是静态导入? 静态导入指的是,将一个外部文件嵌入到当前JSP文件中,同时解析这个页面的JSP语句,它会把目标页面的其他编译指令也包含进来.include的静态导入指令使用语法: 复制代码 代码如下: <%@include file="relativeURLSpec"%> 静态导入使用范例include1.jsp:

JSP静态include和动态include的区别

静态include是指令元素.include指令的语法格式:<%@ include file="filename" %>.include指令的作用是在JSP页面中静态包含一个文件,同时由JSP解析包含的文件内容静态包含的含义.涉及到的2个JSP页面会被翻译成一个Servlet,也就是.java文件,再一起编译成.class文件对外显示.总结:先包含,后翻译,最后编译. 动态include即是<jsp:include file="filename"