jsp两个include的区别

来源:互联网 发布:平安科技 云计算 编辑:程序博客网 时间:2024/05/17 03:17
 

Jsp: 静态包含和动态包含的区别(两个include的区别);

 

1.主要有两个方面的不同;

    1.执行时间上:

   指令元素 < %@ include file=”relativeURI”%> 是在翻译阶段执行

    行为元素< jsp:include page=”relativeURI” flush=”true” /> 在请求处理阶段执行.

    2.引入内容的不同:

    指令元素< %@ include file=”relativeURI”%>

    引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起.

   行为元素 < jsp:include page=”relativeURI” flush=”true” />引入执行页面或servlet所生成的应答文本.

 

 1.< %@ include file=” ”%>     (指令元素)

2.< jsp:include page=” ” flush=”true”/>(行为元素)

 1.< %@ include file=” ”%>

指令元素,< %@ 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程序,a.jsp  b.jsp 然后在a.jsp 用指令元素的方式引用b.jsp  运行a程序:查看tomcat下的临时文件看看b.jsp文件的内容是否已被加入到了a.jsp文件中。在这个目录下会看到a_jsp.java和a_jsp.class两个文件    这里的java文件就是jsp容器将jsp转化成了servlet而得到的a_jsp.java这个文件。相对应的a_jsp.class这个文件就是编译a_jsp.java这个servlet文件产生的类文件了。在a.jsp 文件被转化成servlet文件时,在输出的< haed >之间加入了一些不是a.jsp页面里面的代码,新加入的内容就是 b.jsp里面的代码:。

需注意的错误:http 500服务器内部错误。在b.jsp页面中不能指定多个contentTypeb.   在翻译阶段b.jsp文件的代码被原封不动地加入到了a.jsp页面从而合成一个文件。合成后的文件中就会相同的:

解决的办法:把相应的那句相同的话删掉

 

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

行为元素,< jsp:include page=” ” flush=”true”/>

编写两个jsp程序,a.jsp  b.jsp。对a进行编译,此时会在页面上看见.我们所引入b.jsp输出的日期中中文出现了乱码因为include行为元素是在请求处理阶段执行的,Jsp容器除了上面提到的负责将jsp页面转化成servlet外,还负责调用jsp页面实现类以处理每个请求并产生应答.这个阶段我们就称为请求处理阶段.

所以在我们作include行为元素引入页面时,实际只是引用了b.jsp这个文件被转化并被编译后产生的servlet类文件. b.jsp就是作为一个单独的文件在执行后才被a.jsp文件运行时调用.由于b.jsp文件中没有指定字符编码.所以出现了乱码.解决办法是在b.jsp文件中重新把刚才去掉的加上去。此时页面显示正确,并跟用include指令正常运行时一样.再查看tomcat下的临时文件会发现.此时多出了一个 b_jsp.java文件和一个b_.class文件.这两个文件得来的方式跟a_jsp.java和 a_jsp.class文件得来的方式一样.再查看一下此时ta_jsp.java文件的代码会发现.此时只新增加了一句代码:

    JspRuntimeLibrary.include(request, response, "b.jsp", out, true);

    它并没有把b.jsp文件的代码加入到a.jsp.

 只是在运行时引入了b.jsp页面执行后所产生的应答.这意味着我们可以指定任何能够产生应答的Web资源,(例如一个servlet或一个jsp页面),只要这些资源所产生的类型和jsp页面产生的内容类型相同.JSP容器将通过一个内部的函数调用来执行指定的资源.因此,这些被引入的资源可以帮助处理原来的请求,所以这些资源可以访问请求作用域内的所有对象.以及所有原来的请求参数.

 由于在主页面被请求时,这些页面还没有被引入到主页面中,所以你可以对page属性使用一个请求时属性值,以便根据运行时的情况来决定要引入哪一个页面.还可以添加一些将被引入的页面读取的请求参数.

 

 

 

 

参考心得感悟:

两个include之间的区别

 1.指令元素 < %@ include file=”relativeURI”%>  在翻译阶段执行即在,(jsp容器负责把jsp文件转换成server,然后在编译他)   这个过程也叫做翻译阶段。

然后在源代码目录处打开(.java文件)会发现,可以看到那个被指令调用的那个页面的代码代码。 指令元素的作用就在这里体现了。

2.< jsp:include page=” ” flush=”true”/>(行为元素)在请求处理阶段执行(Jsp容器除了上面提到的负责将jsp页面转化成servlet外,还负责调用jsp页面实现类以处理每个请求并产生应答.这个阶段我们就称为请求处理阶段.)打开源代码目录(.java文件) 会发现行为元素的作用 就是在哪里看不到请求页面的代码。

 

答案:

(1)      形式不同

<%@ include file=” ”%>

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

(2)      一个是是指令元素、一个是行为元素。

<%@ include%>指令是编译时语法,在编译的时候,把指令所指向的目标文件的内容拷贝到指令所在的位置,最终形成一个文件,在运行的时候只有一个文件。

<jsp:include>动作是运行时语法,执行时,会转向执行标签所指向的目标文件,执行完目标文件之后,再接着执行标签后的内容,在运行的时候,涉及到两个文件,就像方法调用一样。

 

原创粉丝点击