大家都知道,有两种引用页面的方法,一种是指示标签 “<%@ include file=""%>”,一种是动作标签“<jsp:include page=""/> ”。两种方法使用起来,乍一看效果相差一样,但还是一定区别的, 使用不当会出现错误.
比如我有两个jsp,分别是a和b, 两个页面上都定义了一个“String path = request.getContextPath()” 。现在我使用a页面用“ <%@ include file=""%>”引入b页面, 结果最后访问a页面时报错了,说path这个变量被重复定义了。咱们再设一个c.jsp,用 “<jsp:include page=""/>” 引入b页面,却运行正常。
回想书上说,说明标签是静态引入,动作标签是动态,当初不太明白,现在我的粗浅理解是这样的:“<%@ include file=""%>”是把b页面的源代码拼接到a页面中,再一块编译,所以“path”变量就形成了重复定义;而“<jsp:include page=""/>”则是分开编译两个页面,把它们生成的html加到一起。这应该是两者最大的不同。
再证实一下:在用“<%@ include ”时 ,把b页面的“path”变量定义去掉,结果它就可以使用a页面定义的“path”变量,没有错误;而用“<jsp:include”时,去掉b的变量定义语句,则访问的时候会“path”变量未定义,应该就是单独编译b.jsp时,发现有使用了"path"而“path”没有被定义。