当前位置: 代码迷 >> Java Web开发 >> 动态include跟静态include的一些疑问
  详细解决方案

动态include跟静态include的一些疑问

热度:40   发布时间:2016-04-16 22:06:26.0
动态include和静态include的一些疑问
本帖最后由 mapei5566 于 2014-07-21 18:08:27 编辑
刚开始学JSP。。。。
在书中看到说“动态导入时,被导入页面的编译指令会失去作用,只会插入被导入页面的body内容”,我写了三个页面进行测试:
1.page1.jsp:
<%@page contentType="text/html;charset=GBK" language="java" 
%>

<html>
<head>
<title>page1</title>
</head>

<body>
这是page1.jsp页面
               
</body>
</html>

2.page2.jsp:
<%@page contentType="text/html;charset=GBK" language="java" 
%>
<%@include file="page1.jsp"%>
<html>
<head>
<title>page2</title>
</head>
<body>
这是page2.jsp页面
</body>
</html>

3.page3.jsp:
<%@page contentType="text/html;charset=GBK" language="java" errorPage=""%>
<html>
<head>
<title>page3</title>
</head>
<body>
               这是page3.jsp页面
<jsp:include page="page2.jsp" flush="true"/>
</body>
</html>

根据上面的代码,page2.jsp静态include了page1.jsp,page3.jsp动态include了page2.jsp,按照书上说的“动态导入时,被导入页面的编译指令会失去作用”,也就是说page3.jsp动态导入page2.jsp时,page2.jsp中的编译指令lnclude指令应该失去作用才对,但是为什么打开page3.jsp,页面显示的结果为“这是page3.jsp   这是page2.jsp   这是page1.jsp ”,不应该是“这是page3.jsp   这是page2.jsp”吗??
          求大神们讲解下其中的原理,多谢了!
------解决方案--------------------
 JSP中动态INCLUDE与静态INCLUDE的区别 动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true">它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,它不会检查所含文件的变化,适用于包含静态页面     静态include主要是对静态页面的引入,不会检查所包含文件的变化

<% @ include file="include.html" %>

动态include主要是对动态页面的引入,它总是会检查所引入的页面的变化,如果所包含的资源在请求间发生变化

,则下一次请求包含<jsp:include>动作的jsp时,将包含资源的新内容。

另一方面,include指令在转换时一次性地将内容复制到jsp中,如果所包含的资源发生变化,则使用include指令的jsp将不能反应出新的内容,除非重新编译该jsp 。

 

   所以我们可以总结出: jsp 中 include 有两种用法 , 分别是:

<%@ include file=” ”%>

<jsp:include page=” ” flush=”true”/>

前者是指令元素、后者是行动元素。具体它们将在哪里用?怎么用及它们有什么区别?这应该是很多人看到它都会想到的题目。下面一起来看看吧。

 

平常当利用程序中全部的页面的某些部分(例如题目、页脚和导航栏)都雷同的时候,我们就可以考虑用 include 。具体在哪些时候用 <%@ include file= ” ” %> ,哪些时候用

<jsp:include page= ” ” flush= ” true ” />. 这种情势。首先要知道的是它们中间的区别。只有了解了它们用法的不同才懂得该在何时去用以及怎么选择。

<%@ include file=” ”%>

jsp 的 include 指令元素读入指定页面的内容。并把这些内容和本来的页面融合到一起。(这个过程是在翻译阶段 : 也就是 jsp 被转化成 servlet 的阶段进行的。

这里对翻译阶段进行一下说明 : 我们知道, jsp 页面不能原封不动地被传送给浏览器,全部的 jsp 元素都必须首先由服务器进行处理。这是通过将 jsp 页面转达化成 servlet ,然后执行这个 servlet 来结束的。服务器需要一个 jsp 容器来处理 jsp 页面。 jsp 容器平常以 servlet 的情势来实现,这个 servlet 经过配置,可以处理对 jsp 页面的全部请求。

Jsp 容器重视将 jsp 页面转化成 servlet (称为 jsp 页面实现类— JSP Page implementation class ) , 并编译这个 servlet 。这两步就组成了翻译阶段 .

由此我们就会知道: jsp 页面是把 include 指令元素所指定的页面的实际内容(也就是代码段)参加到引入它的 jsp 页面中 , 合成一个文档后被 jsp 容器将它转化成 servlet 。可以看到这时会产生一个临时 class 文档和一个 java 文档。
------解决方案--------------------
楼上已经解释得相当好了,补充一点其他的
被引入的文件必须遵循JSP语法。
被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。 
由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。 
被引入的文件最好不要包含头,如<html><head><body>等,因为在第二个jsp页面中已经包含了
request有一个include方法,这个方法是动态导入,这样动态导入的效率没有静态导入高,一般页首页尾等相同的地方都用导入的方法
  相关解决方案