2.5.2 include指令
2.5.2 include指令
include
指令是一个动态include
指令,也用于包含某个页面,它不会导入被include
页面的编译指令,仅仅将被导入页面的body
内容插入本页面。
下面是include
动作指令的语法格式:
1 | <jsp:include page="{relative URL|<%=expression%>}" flush="true" /> |
或者
1 | <jsp:include page="{relative URL|<%=expression%>}" flush="true" > |
fush
属性用于指定输出缓存是否转移到被导入文件中。如果指定为true
,则包含在被导入文件中;如果指定为false
,则包含在原文件中。对于JSP1.1
以前版本,只能设置为false
对于第二种语法格式,则可在被导入页面中加入额外的请求参数。
jsp-include.jsp
下面的页面使用了动态导入语法来导入指定JSP
页面。
1 | <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> |
以上页面中代:
1 | <jsp:include page="scriptlet.jsp" /> |
码使用了动态导入语法来导入了criptlet.Jsp
。表面上看,该页面的执行效果与使用静态include
导入的页面并没有什么不同。但查看jsp-include.Jsp
页面生成Servlet
的源代码,可以看到如下片段
1 | public void _jspService(final javax.servlet.http.HttpServletRequest request, |
以上代码片段:
1 | org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "scriptlet.jsp", out, false); |
显示了动态导入的关键:动态导入只是使用一个include
方法来插入目标页面的内容,而不是将目标页面完全融入本页面中
静态导入和动态导入的区别
归纳起来,静态导入和动态导入有如下三点区别
- 静态导入是将被导入页面的代码完全融入,两个页面融合成一个整体
Servlet
;而动态导入则在Servlet
中使用include
方法来引入被导入页面的内容 - 静态导入时被导入页面的编译指令会起作用;而动态导入时被导入页面的编译指令则失去作用,只是插入被导入页面的
body
内容。 - 动态包含还可以增加额外的参数。
除此之外,执行include
动态指令时,还可增加额外的请求参数,如下面JSP
页面所示
jsp-include2.jsp
1 | <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> |
在上面的JSP
页面中的粗体字代码同样使用<jsp:include>
指令包含页面,而且在jsp:include>
指令中还使用param
指令传入参数,该参数可以在forward-result.jsp
页面中使用request
对象获取。forward-result.jsp
前面已经给出,此处不再赘述。页面执行的效果如图2.14所示。
forward动作指令和include动作指令的异同
实际上,forward
动作指令和include
动作指令十分相似(它们的语法就很相似),它们都采用方法来引入目标页面,通过查看JSP
页面所生成Servlet
代码可以得出:forward
指令使用jspxPageContext
的forward(()
方法来引入目标页面,而include
指令则使用通过JspRuntimeLibrary
的include()
方法来引入目标页面。区别在于:执行forward
时,被forward
的页面将完全代替原有页面;而执行include
时,被include
的页面只是插入原有页面。简而言之,forward
拿目标页面代替原有页面,而include
则拿目标页面插入原有页面。