博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
静态include与动态include的区别
阅读量:5872 次
发布时间:2019-06-19

本文共 1898 字,大约阅读时间需要 6 分钟。

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  

    
jsp:include <%@ include file="_02_date.jsp"%> <%= request + "--1--" + "
"%>

 

_01_include_02.jsp

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

 

_02_date.jsp

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

 

运行"_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图解:

转载于:https://www.cnblogs.com/chalk/p/4685246.html

你可能感兴趣的文章