(題外話:引入的文件如果是jsp則應(yīng)定義為***.jspf文件,如果其他文件可定義為***.inc文件,即include file。而且<%@ inlucde page="" %>除了可以引jspf還可以引servlet——很重要)
近日做一項(xiàng)目要用到JSP動(dòng)態(tài)包含JSP,本想肯定很簡(jiǎn)單,但不想這么復(fù)雜,而且目前還沒(méi)有求到好的答案,問(wèn)題如下:
----------------------------------------
#文件: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%>
----------------------------------------
執(zhí)行three.jsp會(huì)出什么結(jié)果?
a.編譯錯(cuò)誤
b.顯示China England
很多人理所當(dāng)然的覺(jué)得肯定是a,因?yàn)閖=1所以只包含one.jsp,two.jsp不會(huì)包含進(jìn)來(lái),但答案是b,上機(jī)測(cè)試就知道。
為什么?
因?yàn)?#64;include要先于jsp的其他代碼執(zhí)行,所以兩個(gè)文件都會(huì)被包含進(jìn)來(lái)!
----------------------------------------
如果你說(shuō)用jsp:include可以解決問(wèn)題,好,把three.jsp改成如下:
#文件 three.jsp
<%
int j=1;
String includeFile="";
if (j==1){
includeFile = "one.jsp";
}else{
includeFile = "two.jsp";
}
%>
<jsp:include page=′<%=includeFile%>′ />
<%=var1%>
----------------------------------------
結(jié)果是什么?
a.編譯錯(cuò)誤
b.顯示 China
是b嗎,不,是a,編譯錯(cuò)誤!提示var1未定義。
為什么?因?yàn)閖sp:include是動(dòng)態(tài)包含,相當(dāng)于把包含文件與被包含文件分開(kāi)編譯。
----------------------------------------
?現(xiàn)把include的問(wèn)題總結(jié)如下:
【引用 gfzhx(小小)的話】
??? 動(dòng)態(tài)包含相當(dāng)于作了一個(gè)頁(yè)面跳轉(zhuǎn),也就是相當(dāng)于重新訪問(wèn)了另一個(gè)servlet,所以當(dāng)然會(huì)提示變量沒(méi)有定義,你想一想,一個(gè)類中申明了一個(gè)變量,第二個(gè)類直接是用這個(gè)變量,你說(shuō)可以嗎?其實(shí)你的情況和這個(gè)例子很像,這就是動(dòng)態(tài)包含,而靜態(tài)包含你可以看一看jsp編譯后的java文件就知道了,它是直接將你包含的頁(yè)面直接包含進(jìn)去,然后再編譯的。所以你的問(wèn)題采用靜態(tài)包含就可以了。不過(guò)不管怎么,還是不推薦采用這種形式,會(huì)給程序造成很多問(wèn)題,至少比較難以維護(hù)了,可以說(shuō)是一種不好的編程風(fēng)格。建議采用其他方法解決問(wèn)題。
【引用 xiao_yuer(小魚(yú)兒)的話】
?要使用引入文件中定義的變量,只能用@include指令。
也就是<%@ include file="one.jsp" %>,但這在一般情況下都不是動(dòng)態(tài)的,是在jsp頁(yè)面第一次編譯時(shí),把它導(dǎo)入的。而jsp編譯后,這兩個(gè)文件再作修改很多jsp服務(wù)器都不會(huì)偵測(cè)到,因?yàn)榘@兩的jsp的jsp文件本身并沒(méi)有發(fā)生變化。但很奇怪,weblogic6好像可以。你可以試試,不過(guò)不要抱太大希望,因?yàn)槟氵@種要求不是很合理。向你這種情況,完全應(yīng)該引入一個(gè)java類,這個(gè)類中定義一些變量(按你的說(shuō)法都應(yīng)該算是常量了,jsp取出來(lái)直接用而不會(huì)修改它再存回去),然后再jsp中得到那個(gè)類的實(shí)例,來(lái)進(jìn)行處理。那樣如果你要修改這些常量的值,就修改java類,而不用修改jsp.
【自己的:-))】
?@include包含是靜態(tài)包含,是把被包含文件加入到包含文件中然后進(jìn)行編譯,所以這種包含與解釋執(zhí)行的語(yǔ)言很象(例如php),而且JSP中@開(kāi)頭的語(yǔ)句都要先于其他語(yǔ)句執(zhí)行,所以如上,用if.else來(lái)判斷然后包含是不行的,所以以前如果是做PHP這種解釋語(yǔ)言的人會(huì)覺(jué)得不適應(yīng)(象我,:(()
?
?jsp:include是既可以靜態(tài)包含又可以動(dòng)態(tài)包含,與@include不同的是,jsp:include沒(méi)有@include那樣的優(yōu)先權(quán),即不是現(xiàn)于其他語(yǔ)句執(zhí)行的,所以jsp:include可以又選擇性的包含。不過(guò)更重要的一點(diǎn)是,用jsp:include相當(dāng)于編譯兩個(gè)不同的文件,所以如果被包含文件中僅僅是顯示某些東西(例如被包含文件是純HTML)的話,這種情況下,用jsp:include和@include來(lái)包含文件的效果是一樣的,但如果要用jsp:include來(lái)顯示被包含文件中定義的變量就不行了(為什么?見(jiàn)上面的引用吧,就不贅述了)。
【感謝】
?gfzhx(小小)、xiao_yuer(小魚(yú)兒)
【致版主】
?問(wèn)題貼地址如下:
http://www.csdn.net/Expert/FAQ/FAQ_Index.asp?id=1380
http://www.csdn.net/expert/topic/707/707524.xml?temp=1.226443E-02
希望版主能夠更正一下。