【问题】
大部分人都知道,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页面被请求的时候才会去定位被包含文件。
这种区别产生了不同的行为,我们来看些实例就能了解了,假设有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>指令。
两种JSP页面include用法的区别
最新推荐文章于 2020-04-23 08:58:16 发布