<jsp:include>标签是在当前JSP页面的执行期间插入被引入资源的输出内容,当前JSP页面与被动态引入的资源是两个彼此独立的执行实体,被动态引入的资源必须是一个能独立被WEB容器调用和执行的资源。include指令只能引入遵循JSP格式的文件,被引入文件与当前JSP文件共同合并翻译成一个Servlet的源文件。
<jsp:include>标签的作用与运行原理类似RequestDispatcher.include方法,被引入页面不能改变响应状态码和设置响应头,与此相关的语句的执行结果将被忽略。include指令没有这方面的限制。
<jsp:include>标签的执行效率要比include指令稍微差一点,但它的灵活性却要好得多。
使用<jsp:include>标签和include指令都可以把一个页面的内容分成多个组件来生成,开发者不必再把页眉和页脚部分的相同HTML代码复制到每个JSP文件中,从而可以更轻松地完成维护工作,但是都应注意最终的输出结果内容应遵循HTML语法结构,例如,如果当前页面产生了<html>、</html>、<body>、</body>等标记,那么在被引入文件中就不能再输出<html>、</html>、<body>、</body>等标记。
<jsp:include>标签对JSP引擎翻译JSP页面的过程不起作用,它是在JSP页面的执行期间才被调用,因此不会影响两个页面的编译。由于include指令是在JSP引擎翻译JSP页面的过程中被解释处理的,所以它对JSP引擎翻译JSP页面的过程起作用,如果多个JSP页面中都要用到一些相同的声明,那么就可以把这些声明语句放在一个单独的文件中编写,然后在每个JSP页面中使用include指令将那个文件包含进来。
因为include指令引入的文件被合并翻译到当前JSP页面中,向被引入的文件传递参数信息的做法根本就没有任何意义,它们将被JSP引擎忽略。而<jsp:include>标签可以传递参数信息和接受通过表达式动态产生的被引入资源的名称,所以,如果要用参数来控制引入的结果或动态生成引入的资源名,只能使用<jsp:include>标签。
<jsp:include>标签使用page属性指定被引入资源的相对路径,而include指令使用file属性指定被引入资源的相对路径。
假设myweb应用程序的根目录下有一个a.jsp文件,其一般的访问路径形式为:
http://localhost:8080/myweb/a.jsp
在a.jsp页面中使用了如下语句引入b.jsp文件:
<jsp:include page="b.jsp" flush="true" />
请问:这时候JSP引擎调用的b.jsp文件的完整URL路径为什么?
如果将a.jsp页面映射为如下地址:
http://localhost:8080/myweb/dir1/a.html
请问:这时候JSP引擎调用的b.jsp文件的完整URL路径为:
http://localhost:8080/myweb/b.jspf
http://localhost:8080/myweb/dir1/b.jspf