这里对堆栈溢出进行了很好的讨论,讨论了它们之间的差异。大概是这么说的 <jsp:include>
是动态的,而 <@ include>
是静态的。但是,我有一些问题。
1.第一个问题
说我用 <jsp include>
包含header.jsp文件。它的运行方式是这样的:container编译我的jsp文件,并在运行时调用header.jsp,header.jsp也会被编译。所以现在它使用它的内容作为对我的jsp文件的响应(并结合它)。但它是如何动态的呢?如果我更改header.jsp会发生什么?因为它已经编译过了,所以不会看到任何更改。我也是 <jsp: include page="header.jsp"/>
只需一次编译header.jspe以保持其动态行为?或者有不同的方法“告诉”容器重新编译它?
2.第二个问题
无论第一个问题的答案是什么,我都知道它是动态的,不管它是如何做的。好吧,直到我从headfirstjsp和servlets看到这张图片。
这是不是意味着 <@ include>
也可以是动态的?如果我在tomcat5(友好容器)中制作一个应用程序,为什么我会在意其他容器(旧版本)是否友好呢?我的意思是,我会使用一个容器并坚持使用它,而不是在其他容器中移动我的应用程序,对吗?所以为什么我不总是用 <@ include>
,让容器“处理”所包含文件中的任何更改,而且我不会因为使用requestdispatcher每个请求(如 <jsp:include
有)。
1条答案
按热度按时间fnx2tebb1#
这个
<%@ include %>
指令是静态的,因为它接受包含的文件的内容,并在指令的位置简单地“转储它”。这是在翻译时完成的,因此内容成为父jsp的一部分,就像您自己在那里编写的一样。这个
<jsp:include>
动作是动态的,因为您可以通过向它发送请求来“调用”它,并且它可以生成一个包含在父jsp输出中的响应。它的动态性在于,您可以使用<jsp:param>
子元素。因此,基本上,它不像在页面中转储某些内容,而是像一个可以用参数调用的函数。因此,它包含的内容不仅是内容,而且是使用模板生成的动态内容,您可以在不同时刻使用各种参数调用该模板。至于你的第二个问题,这与
<%@ include %>
指令或<jsp:include>
操作本身,这就是服务器的工作方式(我觉得很愚蠢,他们会称之为“友好的容器”,但好吧,书试图友好,我猜)。tomcat实现者决定,他们可以让它检测编译时包含的页面何时发生了更改,然后重新编译包含它的jsp,但其他servlet容器可能没有。规范没有指导实现者处理这个问题,所以这个行为对于其他servlet容器来说是不可移植的。如果你想利用这个事实,那是你的选择,假设你在所有的环境中运行同一台服务器,并且你可以保证这个事实不会改变,一个在开发环境中有效的语句,或者如果你想玩东西,但在运行面向用户的生产代码的专业环境中,使用限制可移植性的专有内容很可能是不受欢迎的做法。