2.4.2 include指令

2.4.2 include指令

使用include指令,可以将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句(如果有的话)。这是个静态的include语句,它会把目标页面的其他编译指令也包含进来,但动态include则不会。
include既可以包含静态的文本,也可以包含动态的JSP页面。静态的include编译指令会将被包含的页面加入本页面,融合成一个页面,因此被包含页面甚至不需要是一个完整的页面。

include编译指令语法

include编译指令的语法如下:

1
<%@include file="relativeURLSpec" %>

如果被嵌入的文件经常需要改变,建议使用<jsp:include>操作指令,因为它是动态的include语句。
下面的页面是使用静态导入的示例代码。

staticInclude.jsp

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

以上页面中使用静态导入的语法:

1
<%@include file="scriptlet.jsp"%>

scriptlet.jsp页面导入本页,该页面的执行效果与scriptlet.jsp的执行效果相同。

scriptlet.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
<!DOCTYPE html>
<html>
<head>
<title> 小脚本测试 </title>
</head>
<body>
<table bgcolor="#9999dd" border="1" width="300px">
<!-- JSP小脚本,这些脚本会对HTML的标签产生作用 -->
<%
for(int i = 0 ; i < 10 ; i++)
{
%>
<!-- 上面的循环将控制<tr>标签循环 -->
<tr>
<td>循环值:</td>
<td><%=i%></td>
</tr>
<%
}
%>
<table>
</body>
</html>

测试

访问staticInclude.jsp,然后查看Tomcat生成的staticInclude_jsp.java(E:\apache-tomcat-8.5.35\work\Catalina\localhost\directive\org\apache\jsp\staticInclude_jsp.java),从staticInclude.jsp编译后的源代码可看到,staticlnclude.jsp页面已经完全将scriptlet.jsp的代码融入到本页面中。

staticInclude_jsp.java

下面是staticInclude_jsp.java文件的片段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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("<head>\r\n");
out.write("\t<title> 静态include测试 </title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("<!-- 使用include编译指定导入页面 -->\r\n");
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("\t<title> 小脚本测试 </title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("<table bgcolor=\"#9999dd\" border=\"1\" width=\"300px\">\r\n");
out.write("<!-- JSP小脚本,这些脚本会对HTML的标签产生作用 -->\r\n");

for (int i = 0; i < 10; i++) {

out.write("\r\n");
out.write("\t<!-- 上面的循环将控制<tr>标签循环 -->\r\n");
out.write("\t<tr>\r\n");
out.write("\t\t<td>循环值:</td>\r\n");
out.write("\t\t<td>");
out.print(i);
out.write("</td>\r\n");
out.write("\t</tr>\r\n");

}

out.write("\r\n");
out.write("<table>\r\n");
out.write("</body>\r\n");
out.write("</html>");
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
......

上面这些页面代码并不是由staticInclude.jsp页面所生成的,而是由scriptlet.jsp页面生成的。也就是说,scriptlet.Jsp页面的内容被完全融入staticInclude.jsp页面所生成的Servlet,这就是静态包含意义:页面在编译时将被包含页面的代码全都导入了

需要指岀的是,静态包含还会将被包含页面的编译指令也包含进来,如果两个页面的编译指令冲突,那么页面就会出错