2.5.2 include指令

2.5.2 include指令

include指令是一个动态include指令,也用于包含某个页面,它不会导入被include页面的编译指令,仅仅将被导入页面的body内容插入本页面。
下面是include动作指令的语法格式:

1
<jsp:include page="{relative URL|<%=expression%>}" flush="true" />

或者

1
2
3
<jsp:include page="{relative URL|<%=expression%>}" flush="true" >
<jsp:param name="parameterName" value="patametervalue "/>
</jsp:include>

fush属性用于指定输出缓存是否转移到被导入文件中。如果指定为true,则包含在被导入文件中;如果指定为false,则包含在原文件中。对于JSP1.1以前版本,只能设置为false
对于第二种语法格式,则可在被导入页面中加入额外的请求参数

jsp-include.jsp

下面的页面使用了动态导入语法来导入指定JSP页面。

1
2
3
4
5
6
7
8
9
10
11
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html>
<html>
<head>
<title> jsp-include测试 </title>
</head>
<body>
<!-- 使用动态include指令导入页面 -->
<jsp:include page="scriptlet.jsp" />
</body>
</html>

以上页面中代:

1
<jsp:include page="scriptlet.jsp" />

码使用了动态导入语法来导入了criptlet.Jsp。表面上看,该页面的执行效果与使用静态include导入的页面并没有什么不同。但查看jsp-include.Jsp页面生成Servlet的源代码,可以看到如下片段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void _jspService(final javax.servlet.http.HttpServletRequest request,
final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
......
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("\t<title> jsp-include测试 </title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("<!-- 使用动态include指令导入页面 -->\r\n");
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "scriptlet.jsp", out, false);
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");

以上代码片段:

1
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "scriptlet.jsp", out, false);

显示了动态导入的关键:动态导入只是使用一个include方法来插入目标页面的内容,而不是将目标页面完全融入本页面中

静态导入和动态导入的区别

归纳起来,静态导入和动态导入有如下三点区别

  1. 静态导入是将被导入页面的代码完全融入,两个页面融合成一个整体Servlet;而动态导入则在Servlet中使用include方法来引入被导入页面的内容
  2. 静态导入时被导入页面的编译指令会起作用;而动态导入时被导入页面的编译指令则失去作用,只是插入被导入页面的body内容。
  3. 动态包含还可以增加额外的参数。

除此之外,执行include动态指令时,还可增加额外的请求参数,如下面JSP页面所示

jsp-include2.jsp

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html>
<html>
<head>
<title> jsp-include测试 </title>
</head>
<body>
<jsp:include page="forward-result.jsp" >
<jsp:param name="age" value="32"/>
</jsp:include>
</body>
</html>

在上面的JSP页面中的粗体字代码同样使用<jsp:include>指令包含页面,而且在jsp:include>指令中还使用param指令传入参数,该参数可以在forward-result.jsp页面中使用request对象获取。
forward-result.jsp前面已经给出,此处不再赘述。页面执行的效果如图2.14所示。

forward动作指令和include动作指令的异同

实际上,forward动作指令和include动作指令十分相似(它们的语法就很相似),它们都采用方法来引入目标页面,通过查看JSP页面所生成Servlet代码可以得出:forward指令使用jspxPageContextforward(()方法来引入目标页面,而include指令则使用通过JspRuntimeLibraryinclude()方法来引入目标页面。区别在于:执行forward时,被forward的页面将完全代替原有页面;而执行include时,被include的页面只是插入原有页面。简而言之,forward拿目标页面代替原有页面,而include则拿目标页面插入原有页面。