<jsp:include>标签
在JSP页面中,为了把其它资源的输出内容插入到当前JSP页面的输出内容中,JSP技术提供了<jsp:include>标签,<jsp:include>标签的具体语法格式如下所示:
<jsp:include page="relativeURL" flush="true|false" />
在上述语法格式中,page属性用于指定被引入资源的相对路径,flush属性用于指定是否将当前页面的输出内容刷新到客户端,默认情况下,flush属性的值为false。
为了大家更好地理解<jsp:include>标签的特性,接下来,分步骤对<jsp:include>标签进行分析,具体如下:
(1)在工程chapter07的根目录下编写两个JSP文件,分别是included.jsp和dynamicInclude.jsp,其中dynamicInclude.jsp页面用于引入included.jsp页面。included.jsp是被引入的文件,让它暂停5秒钟后才输出内容,这样,可以方便测试<jsp:include>标签的flush属性。included.jsp具体代码如例1所示,dynamicInclude.jsp具体代码如例2所示。
例1 included.jsp
1 <%@ page contentType="text/html;charset=GB2312"%>
2 <%Thread.sleep(5000);%>
3 included.jsp内的中文<br>
例2 dynamicInclude.jsp
1 <%@ page contentType="text/html;charset=UTF-8"%>
2 dynamicInclude.jsp内的中文<br>
3 <jsp:include page="included.jsp" flush="true" />
(2)启动Tomcat服务器,通过浏览器访问地址http://localhost:8080/chapter07/dynamicInclude.jsp
,发现浏览器首先会显示dynamicInclude.jsp页面中的输出内容,等待5秒后,才会显示included.jsp页面的输出内容。说明被引用的资源included.jsp在当前JSP页面输出内容后才被调用。
(3)修改dynamicInclude.jsp文件,将<jsp:include>标签中的flush属性设置为false,修改后的文件如例3所示。
例3 dynamicInclude.jsp
1 <%@ page contentType="text/html;charset=UTF-8"%>
2 dynamicInclude.jsp内的中文<br>
3 <jsp:include page="included.jsp" flush="false" />
(4)重启Tomcat服务器,再次通过浏览器访问地址http://localhost:8080/chapter07/dynamicInclude.jsp
,这时,发现浏览器等待5秒后,将dynamicInclude.jsp和included.jsp页面的输出内容同时显示了出来。由此可见,Tomcat调用被引入的资源included.jsp时,并没有将当前JSP页面中已输出的内容刷新到客户端。
(5)将<jsp:include>标签中的flush属性设置为true,在工程chapter07的web.xml文件中,增加如下两段代码,具体如下所示:
<servlet>
<servlet-name>DynamicIncludeJspServlet</servlet-name>
<jsp-file>/dynamicInclude.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>DynamicIncludeJspServlet</servlet-name>
<url-pattern>/xxx/dynamicInclude.html</url-pattern>
</servlet-mapping>
(6)重启Tomcat服务器,通过浏览器访问地址http://localhost:8080/chapter07/xxx/dynamicInclude.html
,
浏览器的显示界面如图1所示。
图1 运行结果
从图1中可以看出,浏览器只显示出了dynamicInclude.jsp文件中的内容,而included.jsp页面中的内容没有显示。这是因为在访问dynamicInclude.jsp文件时,需要引入included.jsp文件的完整路径为http://localhost:8080/chapter07/xxx/included.jsp
,而Tomcat没有找到该路径所对应的资源,因此,included.jsp文件中的输出内容不会显示出来。
需要注意的是,虽然include指令和<jsp:include>标签都能够包含一个文件,但它们之间有很大的区别。接下来,将include指令和<jsp:include>标签进行比较,具体如下:
(1)<jsp:include>标签中要引入的资源和当前JSP页面是两个彼此独立的执行实体,即被动态引入的资源必须能够被Web容器独立执行。而include指令只能引入遵循JSP格式的文件,被引入文件与当前JSP文件需要共同合并才能翻译成一个Servlet源文件。
(2)<jsp:include>标签中引入的资源是在运行时才包含的,而且只包含运行结果。而include指令引入的资源是在编译时期包含的,包含的是源代码。
(3)<jsp:include>标签运行原理与RequestDispatcher.include方法类似,即被包含的页面不能改变响应状态码或者设置响应头,而include指令没有这方面的限制。