纠正一个include问题的错误,这个错误在精华贴中也存在,希望版主重视!

Philzzf 2002-09-12 11:52:42
近日做一项目要用到JSP动态包含JSP,本想肯定很简单,但不想这么复杂,而且目前还没有求到好的答案,问题如下:
----------------------------------------
#文件:one.jsp
<%!
String var1="China";
%>
----------------------------------------
#文件 two.jsp
<%!
//String var1="America";
String var2="England";
%>
----------------------------------------
#文件 three.jsp
<%
int j=1;
if (j==1){
%>
<%@ include file="one.jsp"%>
<%
}else{
%>
<%@ include file="two.jsp"%>
<%}%>
<%=var1%>
<%=var2%>
----------------------------------------
执行three.jsp会出什么结果?
a.编译错误
b.显示China England

很多人理所当然的觉得肯定是a,因为j=1所以只包含one.jsp,two.jsp不会包含进来,但答案是b,上机测试就知道。
为什么?
因为@include要先于jsp的其他代码执行,所以两个文件都会被包含进来!
----------------------------------------
如果你说用jsp:include可以解决问题,好,把three.jsp改成如下:
#文件 three.jsp
<%
int j=1;
String includeFile="";
if (j==1){
includeFile = "one.jsp";
}else{
includeFile = "two.jsp";
}
%>
<jsp:include page='<%=includeFile%>' />
<%=var1%>

----------------------------------------
结果是什么?
a.编译错误
b.显示 China

是b吗,不,是a,编译错误!提示var1未定义。

为什么?因为jsp:include是动态包含,相当于把包含文件与被包含文件分开编译。
----------------------------------------

现把include的问题总结如下:
【引用 gfzhx(小小)的话】
动态包含相当于作了一个页面跳转,也就是相当于重新访问了另一个servlet,所以当然会提示变量没有定义,你想一想

,一个类中申明了一个变量,第二个类直接是用这个变量,你说可以吗?其实你的情况和这个例子很像,这就是动态包含,

而静态包含你可以看一看jsp编译后的java文件就知道了,它是直接将你包含的页面直接包含进去,然后再编译的。所以你的

问题采用静态包含就可以了。不过不管怎么,还是不推荐采用这种形式,会给程序造成很多问题,至少比较难以维护了,可

以说是一种不好的编程风格。建议采用其他方法解决问题。

【引用 xiao_yuer(小鱼儿)的话】
要使用引入文件中定义的变量,只能用@include指令。
也就是<%@ include file="one.jsp" %>,但这在一般情况下都不是动态的,是在jsp页面第一次编译时,把它导入的。而jsp

编译后,这两个文件再作修改很多jsp服务器都不会侦测到,因为包含这两的jsp的jsp文件本身并没有发生变化。但很奇怪,

weblogic6好像可以。你可以试试,不过不要抱太大希望,因为你这种要求不是很合理。向你这种情况,完全应该引入一个

java类,这个类中定义一些变量(按你的说法都应该算是常量了,jsp取出来直接用而不会修改它再存回去),然后再jsp中

得到那个类的实例,来进行处理。那样如果你要修改这些常量的值,就修改java类,而不用修改jsp.

【自己的:-))】
@include包含是静态包含,是把被包含文件加入到包含文件中然后进行编译,所以这种包含与解释执行的语言很象(例如

php),而且JSP中@开头的语句都要先于其他语句执行,所以如上,用if.else来判断然后包含是不行的,所以以前如果是做

PHP这种解释语言的人会觉得不适应(象我,:(()

jsp:include是既可以静态包含又可以动态包含,与@include不同的是,jsp:include没有@include那样的优先权,即不是现

于其他语句执行的,所以jsp:include可以又选择性的包含。不过更重要的一点是,用jsp:include相当于编译两个不同的文

件,所以如果被包含文件中仅仅是显示某些东西(例如被包含文件是纯HTML)的话,这种情况下,用jsp:include和@include

来包含文件的效果是一样的,但如果要用jsp:include来显示被包含文件中定义的变量就不行了(为什么?见上面的引用吧,

就不赘述了)。

【感谢】
gfzhx(小小)、xiao_yuer(小鱼儿)

【致版主】
问题贴地址如下:
http://www.csdn.net/Expert/FAQ/FAQ_Index.asp?id=1380
http://www.csdn.net/expert/topic/707/707524.xml?temp=1.226443E-02
希望版主能够更正一下。
...全文
42 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Philzzf 2002-09-12
  • 打赏
  • 举报
回复
首先,回答
你问我上机测试过吗?
我说测试过,所以才有长篇大论。

然后,发问
你又上机测试过没有呢?

再然后,你举的那个例子说明什么问题,没看明白。

最后,“能否将包含文件后的Jsp文件还没有转换成Servlet之前的情况详细告知”这句话是什么意思?没明白
study_body 2002-09-12
  • 打赏
  • 举报
回复
上机测试过吗?
#文件 three.jsp
<%
int j=1;
if (j==1){
%>
<%@ include file="one.jsp"%>
<%
}else{
%>
<%@ include file="two.jsp"%>
<%}%>
<%=var1%>
<%=var2%>
上面的文件是在执行JSP代码之前包含进来的,但是我觉得应该是包含进来后的
#文件 three.jsp如下:
<%
int j=1;
if (j==1){
%>
<%!
String var1="China";
%>

<%
}else{
%>
<%!
//String var1="America";
String var2="England";
%>

<%}%>
<%=var1%>
<%=var2%>
当然上面我指的是静态包含,如果是这样的话,不应该输出England,能否将包含文件后的Jsp文件还没有转换成Servlet之前的情况详细告知.

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧