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
中,这就是静态包含意义:页面在编译时将被包含页面的代码全都导入了
需要指岀的是,静态包含还会将被包含页面的编译指令也包含进来,如果两个页面的编译指令冲突,那么页面就会出错