djxchen

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            4 Posts :: 3 Stories :: 3 Comments :: 0 Trackbacks
           我們都知道在jsp中include有兩種形式,分別是
          <%@ include file=” ”%>
          <jsp:include page=” ” flush=”true”/>

                前者是指令元素、后者是行為元素。具體它們將在何處用?如何用及它們有什么區(qū)別?這應該是很多人看到它都會想到的問題。下面一起來看看吧。

              通常當應用程序中所有的頁面的某些部分(例如標題、頁腳和導航欄)都相同的時候,我們就可以考慮用include。具體在哪些時候用<%@ include file=” ”%>,哪些時候用<jsp:include page=” ” flush=”true”/>.這種形式。首先要明白的是它們之間的區(qū)別。只有了解了它們用法的不同才理解該在何時去用以及如何選擇。
          <%@ include file=” ”%>,jsp的include指令元素讀入指定頁面的內(nèi)容。并把這些內(nèi)容和原來的頁面融合到一起。(這個過程是在翻譯階段:也就是jsp被轉(zhuǎn)化成servlet的階段進行的。)

              這里對翻譯階段進行一下說明:我們知道,jsp頁面不能原封不動地被傳送給瀏覽器,所有的jsp元素都必須首先由服務器進行處理。這是通過將jsp頁面轉(zhuǎn)達化成servlet,然后執(zhí)行這個servlet來完成的。服務器需要一個jsp容器來處理jsp頁面。jsp容器通常以servlet的形式來實現(xiàn),這個servlet經(jīng)過配置,可以處理對jsp頁面的所有請求。

              Jsp容器負責將jsp頁面轉(zhuǎn)化成servlet(稱為jsp頁面實現(xiàn)類?JSP Page implementation class),并編譯這個servlet。這兩步就構(gòu)成了翻譯階段.

              由此我們就會知道:jsp頁面是把include指令元素所指定的頁面的實際內(nèi)容(也就是代碼段)加入到引入它的jsp頁面中,合成一個文件后被jsp容器將它轉(zhuǎn)化成servlet。可以看到這時會產(chǎn)生一個臨時class文件和一個java文件。下面舉個例子。

              服務器用tomcat,引入頁面的jsp文件叫test.jsp。被引入的頁面叫date.jsp.這個jsp文件里存放的是一個有關(guān)時間的jsp代碼,當前的上下文根設為test
          //======date.jsp的源文件=====//
          <%@ page language=”java” contentType="text/html;charset=gb2312"%>
          <%
          java.util.Date date=new java.util.Date();
          String date_cn ="";
          String dateStr = "";
          switch(date.getDay())
          {
          case 0:date_cn ="日"; break;
          case 1:date_cn ="一"; break;
          case 2:date_cn ="二"; break;
          case 3:date_cn ="三"; break;
          case 4:date_cn ="四"; break;
          case 5:date_cn ="五"; break;
          case 6:date_cn ="六"; break;
          }
          dateStr = (1900+date.getYear()) + "年" + (date.getMonth()+1) + "月" + date.getDate() + "日(星期" + date_cn + ")";
          %>
          document.write("<%=dateStr%>");
          //======以下是test.jsp的源文件=============//
          <%@ page language=”java” contentType=”text/html;charset=gb2312”%>
          <html>
          <head>
          <title>include的兩種用法</title>
          <jsp:include page=”date.jsp” flush=”true”/>
          <%--@ include file=”date.jsp” %-->
          //我們在這里用include的兩種不同形式來引入date.jsp這個文件.
          <head>
          <body>
          <table><tr><td>
          有關(guān)jsp中include的兩種用法.敬請關(guān)注。
          </td></tr></table>
          </body>
          </html>

                在test.jsp 文件中,我們只輸出了一行文本“ 有關(guān)jsp中include的兩種用法.敬請關(guān)注。”,現(xiàn)在讓我們先用<%@ include file=”date.jsp” %>這種形式引入date.jsp這個文件。你想會出現(xiàn)什么問題了嗎?此時出現(xiàn)了錯誤提示:
          HTTP Status 500 ?
          org.apache.jasper.JasperException: /date.jsp(0,0) Page directive: can't have multiple occurrences of contentType
          以下還有一堆錯誤,但我們只要看這里就知道問題的所在了。狀態(tài)碼為http 500服務器內(nèi)部錯誤。再看下面的提示。在date.jsp頁面中不能指定多個contentType. 原因就在這里了。是因為在翻譯階段,date.jsp文件的代碼被原封不動加入到了test.jsp頁面從而合成一個文件。合成后的文件中就會相同的:
          <%@ page language=”java” contentType=”text/html;charset=gb2312”%>
          這句代碼。解決的辦法是把date.jsp文件中的這句刪掉。刷新后再請求test.jsp頁面
          請求test.jsp在頁面顯示如下
          2003年12月10日 13:12:40
              這時我們還不能發(fā)現(xiàn)什么。還是去查看tomcat下的臨時文件吧。到那里去看看date.jsp文件的內(nèi)容是否已被加入到了test.jsp文件中。
          在目錄下會看到test_jsp.java和test_jsp.class兩個文件.
           這里的java文件就是jsp容器將jsp轉(zhuǎn)化成了servlet而得到的test_jsp.java這個文件。相對應的test_jsp.class這個文件就是編譯test_jsp.java這個servlet文件產(chǎn)生的類文件了。打開所產(chǎn)生的servlet文件(test_jsp.java),此時我們會發(fā)現(xiàn),在test.jsp 文件被轉(zhuǎn)化成servlet文件時,在輸出的<haed>之間加入了一些不是test.jsp頁面里面的代碼,新加入的內(nèi)容就是 date.jsp里面的代碼: 新加入了哪些內(nèi)容或是否真的加入了新的內(nèi)容請自己測試去看一下就會一目了然了.在這里不再詳述.
          以上就是我們用<%@ include file=”date.jsp”%>這種形式得到的結(jié)果.

               下面我們換用<jsp:include page=”dae.jsp” flush=”true”/>也就是將
          <%@ include file=”date.jsp”%>換成<jsp:include page=”dae.jsp” flush=”true”/>,然后請求test.jsp.
          2003? ê 12??10?? 13:30:13
          此時會在頁面上看見.我們所引入date.jsp輸出的日期中中文出現(xiàn)了亂碼.什么原因?是因為include行為元素是在請求處理階段執(zhí)行的(此處要對請求處理階段進行說明一下,Jsp容器除了上面提到的負責將jsp頁面轉(zhuǎn)化成servlet外,還負責調(diào)用jsp頁面實現(xiàn)類以處理每個請求并產(chǎn)生應答.這個階段我們就稱為請求處理階段.請求處理階段僅執(zhí)行類文件)。
               所以在我們作include行為元素引入頁面時,實際只是引用了date.jsp這個文件被轉(zhuǎn)化并被編譯后產(chǎn)生的servlet類文件.既如此, date.jsp就是作為一個單獨的文件在執(zhí)行后才被test.jsp文件運行時調(diào)用.由于date.jsp文件中沒有指定字符編碼.所以出現(xiàn)了亂碼.解決辦法是在date.jsp文件中重新把剛才去掉的
          <%@ page language=”java” contentType=”text/html;charset=gb2312”%>
          這行語句加入后刷新重新運行.此時頁面顯示正確,并跟用include指令正常運行時一樣.再查看tomcat下的臨時文件會發(fā)現(xiàn).此時多出了一個 date_jsp.java文件和一個date_jsp.class文件.這兩個文件得來的方式跟test_jsp.java和 test_jsp.class文件得來的方式一樣.再查看一下此時test_jsp.java文件的代碼會發(fā)現(xiàn).此時只新增加了一句代碼:
          JspRuntimeLibrary.include(request, response, "date.jsp", out, true);
               它并沒有把date.jsp文件的代碼加入到test.jsp.只是在運行時引入了date.jsp頁面執(zhí)行后所產(chǎn)生的應答.這意味著我們可以指定任何能夠產(chǎn)生應答的Web資源,(例如一個servlet或一個jsp頁面),只要這些資源所產(chǎn)生的類型和jsp頁面產(chǎn)生的內(nèi)容類型相同.JSP容器將通過一個內(nèi)部的函數(shù)調(diào)用來執(zhí)行指定的資源.因此,這些被引入的資源可以幫助處理原來的請求,所以這些資源可以訪問請求作用域內(nèi)的所有對象.以及所有原來的請求參數(shù).
              由于在主頁面被請求時,這些頁面還沒有被引入到主頁面中,所以你可以對page屬性使用一個請求時屬性值,以便根據(jù)運行時的情況來決定要引入哪一個頁面.還可以添加一些將被引入的頁面讀取的請求參數(shù).
          <jsp:include page=”<%=pageSelectedAtRuntime%>” flush=”true” >
          <jsp:param name=”fitstParamer” value=”firstValue”>
          <jsp:param name=”lastParamer” value=”lastValue”>
          </jsp:include>
               如果修改了被引入的jsp頁面,那么可以立刻使用該頁面的最新版本,這是因為對待被引入的頁面的方式與對待由瀏覽器直接調(diào)用的jsp頁面的方式完全相同.即容器檢測頁面的變化,并自動進入翻譯階段,以得到頁面的最新版本.
          (注意,include行為元素同jsp其它元素一樣,沒有行為體時要以”/”結(jié)束.就像下面這樣.
          <jsp:include page=”<%=pageSelectedAtRuntime%>” flush=”true” />)

          以下是對include 兩種用法的區(qū)別
          主要有兩個方面的不同;
          一:執(zhí)行時間上:
          <%@ include file=”relativeURI”%> 是在翻譯階段執(zhí)行
          <jsp:include page=”relativeURI” flush=”true” /> 在請求處理階段執(zhí)行.
          二:引入內(nèi)容的不同:
          <%@ include file=”relativeURI”%>
          引入靜態(tài)文本(html,jsp),在JSP頁面被轉(zhuǎn)化成servlet之前和它融和到一起.
          <jsp:include page=”relativeURI” flush=”true” />引入執(zhí)行頁面或servlet所生成的應答文本.
          另外在兩種用法中file和page屬性都被解釋為一個相對的URI.如果它以斜杠開頭,那么它就是一個環(huán)境相關(guān)的路徑.將根據(jù)賦給應用程序的URI的前綴進行解釋,如果它不是以斜杠開頭,那么就是頁面相關(guān)的路徑,就根據(jù)引入這個文件的頁面所在的路徑進行解釋.
          posted on 2008-04-22 06:54 于元 閱讀(579) 評論(3)  編輯  收藏

          Feedback

          # re: include與jsp:include區(qū)別[未登錄] 2008-04-24 11:29 dd
          解釋的好清楚阿,厲害。  回復  更多評論
            

          # re: include與jsp:include區(qū)別 2008-05-09 13:59 唐林峰
          先收藏再提個問題:

          我最近遇到了include使用的問題.讓我頭痛.主要是感覺跟書籍上說的有出入
          我照著你給的例子試了試發(fā)現(xiàn)了得到的結(jié)果和您說的不一樣(您的說法和書上的一樣)
          <jsp:include>的用法和您的一致,問題就出在<%@ include file=""%>標簽中.

          當我不在date.jsp中添加<%@ page language=”java” contentType="text/html;charset=gb2312"%>在test.jsp中使用<%@ include file="date.jsp"%>
          時.得到的時間為亂碼.
          而當我在date.jsp中添加<%@ page language=”java” contentType="text/html;charset=gb2312"%>在test.jsp中使用<%@ include file="date.jsp"%>
          時卻能夠得到正確顯示的時間,并沒有得到預期的錯誤提示.

          我在不同的電腦上試過,在不同的瀏覽器上試過,都是這樣的.不知道問題究竟出在哪,請您幫忙指點一下  回復  更多評論
            

          # re: include與jsp:include區(qū)別 2008-11-11 08:41 WW
          好厲害
            回復  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 固镇县| 武宁县| 阜阳市| 荣成市| 长海县| 梅河口市| 石家庄市| 九龙坡区| 扬州市| 平果县| 嘉黎县| 神木县| 昌都县| 永仁县| 洪泽县| 开原市| 马山县| 萍乡市| 巴彦淖尔市| 岐山县| 壶关县| 专栏| 弥勒县| 威海市| 文安县| 从江县| 资阳市| 营口市| 左贡县| 双辽市| 屏东县| 沂南县| 息烽县| 江华| 吴江市| 获嘉县| 弥渡县| 台北县| 依兰县| 吉林市| 奈曼旗|