首先明确的是jsp页面是不可以直接被访问的,jsp被首次访问时会被编译成相应的servlet(“pageName_jsp.java”文件),然后编译执行有servlet生成相应视图。
下面看两个指令:
1、include编译指令:
A.jsp:
<%@include file="B.jsp" %>
以上代码表示将B.jsp页面的内容包含到A.jsp中;在编译时起作用,将B.jsp页面的代码包含到A.jsp中后编译成一个servlet,名为“A_jsp.java”,其中包含对A、B页面的视图输出代码;
B甚至可以不是一个完整的jsp页面
2、include动作指令:
A.jsp
<jsp:include page="B.jsp">
<jsp:param name="userName" value="ren"/>
</jsp:include>
以上代码表示将B.jsp页面嵌入到A.jsp中,并给B.jsp传入一个“userName”参数,参数值为“ren”;由此可见A与B并不是同一个页面,至少不会是同一个servlet!事实正是如此,include动作指令只是将B.jsp页面的内容嵌入到了当前页面,并且可以为其传递参数。
//A_jsp.java中对B的引入
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "B.jsp", out, false);
两者区别:
1、静态导入(include编译指令)是将被导入页面代码嵌入,并编译成一个servlet;而动态导入(include动作指令)在servlet中使用include方法引入被导入页面内容;
2、静态导入是被导入页面编译指令起作用;动态导入时被导入页面的的编译指令不起作用;
3、动态导入可以传参给被导入页面
简单来说就是一个引入sp代码,一个引入页面(显示)内容
其实include动作与forward动作指令更像:
forward可将相应转发到B页面,url地址栏不会变,并且也可以传递参数给B页面,只显示B页面内容(A完全被代替),并且客户端给A的参数不会丢失,B页面可获取
include动作只是将B页面插入A,客户端传给A的参数B中也可以获取