标签:
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图解:
标签:
原文地址:http://www.cnblogs.com/chalk/p/4685246.html