JSP页面两种include用法的区别是什么?



JSP页面两种include用法的区别是什么?选择使用哪种比较好?大部分人都知道,JSP页面可以进行包含嵌套,jsp页面嵌套有两种方法;<%@ include file=” ”%>;与<jsp:include page=” ” flush=”true”/>。那么它们的区别是什么有什么不同的地方呢?

我们先来看看JSP在首次执行的几个步骤,如下:
1、JSP代码翻译为Java代码;
2、Java代码编译为class;
3、class部署为Servlet;
4、调用该Servlet运行。

其中,1、2步骤可以在打包WAR的时候提前完成。

include用法区别分析
关键区别在于<%@ include file=” ”%>是编译指令,是JSP执行器在将JSP翻译为Java代码的时候进行处理的指令,因此会自动找到目标文件并将它插入到当前jsp文件中,就好像你通过文本编辑器的copy/paste操作一样;相反,<jsp:include page=” ” flush=”true”/>则是运行时代码(本质为Tag标签),要在主jsp页面被请求的时候才会去定位被包含的jsp文件。这种区别产生了不同的行为,我们来看些实例来了解一下,假设现在又a.jsp,在a中include文件b,请看下面:

1) jsp页面发生修改时
@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开发更为高效,简单的实现了jsp页面合并呢?但是这导致jsp程序的逻辑变得复杂混乱,所以,正规开发中,个人强烈反对使用@include指令,而建议使用<jsp:include page=” ” flush=”true”/>指令。