JSP页面可以进行嵌套,嵌套有两种方法<%@include %>(静态的)与<jsp:include>(动态的)
【准备知识】
JSP在首次执行时主要有以下几个步骤:
1、JSP代码翻译为Java代码;
2、Java代码便宜为class;
3、class部署为Servlet;
4、调用该Servlet。
需要稍微说明下的是,1、2步骤可以在打包WAR的时候提前完成。
【分析】
关键区别在于<%@include %>是编译指令,是JSP执行器在将JSP翻译为Java代码的时候进行处理的指令,因此会自动找到目标文件并将它插入到当前jsp文件中,就好像你通过文本编辑器的copy/paste操作一样;相反,<jsp:include>则是运行时代码(本质是个Tag标签),要在主jsp页面被请求的时候才会去定位被包含文件。
这种区别产生了不同的行为,我们来看些实例就能了解了,假
。0设有a.jsp,在a中include文件b,那么:
1) 发生修改时
<%@include %>:如果b被修改了,a不会发现b的改变,除非a也被修改了。
<jsp:include>:执行时马上察觉到变化。
2) 允许包含的内容
<%@include %>:b必须是基本的文本或jsp片断等,不能是一个java servlet。
<jsp:include>:允许包括servlet(实际上,JSP最终将编译为servlet)。
3) 时间与空间
<%@include %>在某些情况下要比<jsp:include>更有效率,但是它占用更多的硬盘空间(指生成Servlet后)。当然,在此,两者的执行效率不太重要。
4) 变量作用域
<%@include %>:a、b是整合在一起的文件,所以变量是共享的(换句话说变量名会产生冲突问题),它们必须保持一致!
<jsp:include>:可以对不同的变量使用相同名字,对同一个标签库使用不同前缀,a、b是相互独立的文件。
5) 上下文
两种情况下,request和response均是持续的,所以request里面的attribute和parameter均是相同的,a和b可以利用request来传递数据。
看起来,用<%@include %>开发似乎更为高效,非常简单的实现了合并。但是这使得程序的逻辑变得复杂混乱,因此,正规开发中,个人强烈反对使用<%@include %>指令,而建议使用<jsp:include>指令。
<%@include %> 静态包含,变量不可以重复
<jsp:include> 动态包涵,变量可以重复
使用jsp:forward 可以使用jsp:param 子标签向b.jsp传入一些参数。