码迷,mamicode.com
首页 > 其他好文 > 详细

静态include与动态include的区别

时间:2015-07-29 11:52:55      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:

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图解:
技术分享

静态include与动态include的区别

标签:

原文地址:http://www.cnblogs.com/chalk/p/4685246.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!