现在的位置: 首页 > 综合 > 正文

<%@include%>和的区别

2018年01月25日 ⁄ 综合 ⁄ 共 1873字 ⁄ 字号 评论关闭
1、作用阶段:
<%@ include%> 是在翻译阶段(将JSP页面转换成servlet的阶段),JSP的include指令会读入指定的页面中的内容,并将这些内容和原来的页面融合在一起,最后生成一个servlet。
<jsp:include> 这个指令是在请求处理阶段而不是在翻译阶段执行的,该行为并不是要引入指定页面的实际内容,它将引入执行该引入页面后所产生的应答,这意味着你可以指定任何能够产生文本应答的web资源动态引入资源,最后分别生成servlet。
2、数据共享
<%@ include%> 主页和被引入的页面共享所有的页面作用域(page)数据(包括在页面上可定义的变量等),因此,如果主页面中声明了一个变量,而在某个被引入的页面中也声明了一个同名的变量,那么在翻译阶段将会造成一个错误。
<jsp:include>主页和被引入页共享请求作用域(request)内的所有对象(以及session、application),以及所有的请求参数。但是要注意,它不能访问任何页面作用域(page)属性,或是在主页面中声明的脚本变量
3、使用场景
<%@ include%>的一个常见用法是引入应用程序的所有页面都需要的公共声明。
<jsp:include>利用被引入的资源可以帮助处理原来的请求。
4、引入页面的编码
<jsp:include>方式,引入页单独编译,所以自己要有contentType。
<%@
include%>方式,引入页面使用主页的contentType,但是如果引入一个html或txt,也保存成UTF-8格式了,有乱码问题,而引入一个jsp,jsp里通过pageEncoding或contentType定义为"UTF-8",就没问题了,jsp不定义文件编码有问题,初步分析是jsp引擎读取文件时按照"UTF-8"去读取,但是在输出servlet时,用"iso-8859-1"去输出,但是如果定义了pageEncoding或contentType则会按照UTF-8去输出,这也解释不通啊,求高手解答
5、注意事项
  • <%@ include%> 是在jsp页面第一次编译时,把引入文件导入的。
而jsp编译后,如果被导入文件修改,有些服务器都不会侦测到,因为包含引入文件的jsp文件本身并没有发生变化。因此如果引入的公共声明里增加了变量,在主页里可能获取不到,因为主页没有被重新编译。

  • <%@ include%>方式,主页并不是机械的将引入的文件内容放到<%@ include%>处
关于这一点引入一个例子来说明:
----------------------------------------
#文件:one.jsp
<%!
String var1="China";
%>
this is one !
----------------------------------------
#文件 two.jsp
<%!
String var2="England";
%>
this is two !
----------------------------------------
#文件 three.jsp
<%
int j=1;
if (j==1){
%>
<%@ include file="one.jsp"%>
<%
}else{
%>
<%@ include file="two.jsp"%>
<%}%>
<%=var1%>
<%=var2%>
----------------------------------------

执行three.jsp会出什么结果?
答案是:this is one ! China England

为什么?
因为<%@ include%>方式,翻译阶段,在主页融合引入页时,会发现one.jsp和two.jsp里有<%!----%>声明语句,就将声明代码放到了类的成员变量定义处,所以var1和var2作为类的成员变量,被定义了,剩下的代码,one.jsp和two.jsp里的this
is ...语句,则放到了<%@ include%>处,在_jspService()方法的if else 分支里,所以只能输出一个。

如果在one.jsp和two.jsp里,修改为脚本程序scriptlet方式定义变量,<% String var1 = "China"%><%
String var2 = 
"England"%>(注意没有!),那么会报编译错误。

----------------------------------------


参考文章:http://www.blogjava.net/renyangok/articles/56138.html

抱歉!评论已关闭.