<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    yeafee@夜飛郎

    it's usually better to solve problems with simplicity and finesse rather than muscle.

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      33 隨筆 :: 3 文章 :: 2 評論 :: 0 Trackbacks

    ??? 我們都知道在jsp中include有兩種形式,分別是

    ??? <%@ include file=""%>? ?? <jsp:include page="" flush="true"/>

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

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

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

    ??? Jsp容器負(fù)責(zé)將jsp頁面轉(zhuǎn)化成servlet,并編譯這個servlet。這兩步就構(gòu)成了翻譯階段.

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

    ??? 服務(wù)器用tomcat,引入頁面的jsp文件叫test.jsp。被引入的頁面叫date.jsp.這個jsp文件里存放的是一個有關(guān)時間的jsp代碼,當(dāng)前的上下文根設(shè)為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服務(wù)器內(nèi)部錯誤。再看下面的提示。在date.jsp頁面中不能指定多個contentType.


    ??? 原因就在這里了。是因?yàn)樵诜g階段,date.jsp文件的代碼被原封不動地加入到了test.jsp頁面從而合成一個文件。合成后的文件中就會相同的:
    <%@ page language="java" contentType="text/html;charset=gb2312" %>
    這句代碼。解決的辦法是把date.jsp文件中的這句刪掉。刷新后再請求test.jsp頁面.請求test.jsp在頁面顯示如下

    2003年12月10日 13:12:40
    有關(guān)jsp中include的兩種用法.敬請關(guān)注。

    這時我們還不能發(fā)現(xiàn)什么。還是去查看tomcat下的臨時文件吧。到那里去看看date.jsp文件的內(nèi)容是否已被加入到了test.jsp文件中。<注.此處的tomcat裝在E盤根目錄下>
    目錄
    E:\tomcat\work\Standalone\localhost\test.
    在這個目錄下會看到test_jsp.java和test_jsp.class兩個文件。

    ?? 這里的java文件就是jsp容器將jsp轉(zhuǎn)化成了servlet而得到的test_jsp.java這個文件。

    ???? 相對應(yīng)的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
    有關(guān)jsp中include的兩種用法.敬請關(guān)注。

    ??? 此時會在頁面上看見.我們所引入date.jsp輸出的日期中中文出現(xiàn)了亂碼.什么原因?是因?yàn)閕nclude行為元素是在請求處理階段執(zhí)行的(此處要對 請求處理階段進(jìn)行說明一下.Jsp容器除了上面提到的負(fù)責(zé)將jsp頁面轉(zhuǎn)化成servlet外,還負(fù)責(zé)調(diào)用jsp頁面實(shí)現(xiàn)類以處理每個請求并產(chǎn)生應(yīng)答.這 個階段我們就稱為請求處理階段.請求處理階段僅執(zhí)行類文件)。

    ?? 所以在我們作include行為元素引入頁面時,實(shí)際只是引用了date.jsp這個文件被轉(zhuǎn)化并被編譯后產(chǎn)生的servlet類文件.既如此, date.jsp就是作為一個單獨(dú)的文件在執(zhí)行后才被test.jsp文件運(yùn)行時調(diào)用.由于date.jsp文件中沒有指定字符編碼.所以出現(xiàn)了亂碼.解 決辦法是在date.jsp文件中重新把剛才去掉的
    <%@ page language=”java” contentType=”text/html;charset=gb2312”%>
    這 行語句加入后刷新重新運(yùn)行.此時頁面顯示正確,并跟用include指令正常運(yùn)行時一樣.再查看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.

    ?? 只是在運(yùn)行時引入了date.jsp頁面執(zhí)行后所產(chǎn)生的應(yīng)答.這意味著我們可以指定任何能夠產(chǎn)生應(yīng)答的Web資源,(例如一個servlet或一個jsp 頁面),只要這些資源所產(chǎn)生的類型和jsp頁面產(chǎn)生的內(nèi)容類型相同.JSP容器將通過一個內(nèi)部的函數(shù)調(diào)用來執(zhí)行指定的資源.因此,這些被引入的資源可以幫 助處理原來的請求,所以這些資源可以訪問請求作用域內(nèi)的所有對象.以及所有原來的請求參數(shù).

    ??? 由于在主頁面被請求時,這些頁面還沒有被引入到主頁面中,所以你可以對page屬性使用一個請求時屬性值,以便根據(jù)運(yùn)行時的情況來決定要引入哪一個頁面.還可以添加一些將被引入的頁面讀取的請求參數(shù).
    <jsp:include page="<%=pageSelectedAtRuntime%>" flush="true">
    <jsp:param name=”fitstParamer” value=”firstvalue”>
    <jsp:param name=”lastParamer” value=”lastvalue”>
    </jsp:include>

    ??? 如果修改了被引入的jsp頁面,那么可以立刻使用該頁面的最新版本,這是因?yàn)閷Υ灰氲捻撁娴姆绞脚c對待由瀏覽器直接調(diào)用的jsp頁面的方式完全相同.即容器檢測頁面的變化,并自動進(jìn)入翻譯階段,以得到頁面的最新版本.

    (注意,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所生成的應(yīng)答文本.
    另 外在兩種用法中file和page屬性都被解釋為一個相對的URI.如果它以斜杠開頭,那么它就是一個環(huán)境相關(guān)的路徑.將根據(jù)賦給應(yīng)用程序的URI的前綴 進(jìn)行解釋,如果它不是以斜杠開頭,那么就是頁面相關(guān)的路徑,就根據(jù)引入這個文件的頁面所在的路徑進(jìn)行解釋.更多有關(guān)URL是如何解釋的請參考相關(guān)資料或書 籍.

    posted on 2007-06-05 10:35 @yeafee 閱讀(315) 評論(0)  編輯  收藏 所屬分類: 程序語言
    主站蜘蛛池模板: 日本特黄特黄刺激大片免费| 99re在线免费视频| 国产男女猛烈无遮挡免费视频网站 | 亚洲国产精品尤物YW在线观看 | 亚洲三级视频在线观看| 久久www免费人成看片| 亚洲精品人成电影网| 五月婷婷综合免费| 亚洲日本成本人观看| 在线免费观看污网站| 亚洲av最新在线观看网址| 女性无套免费网站在线看| 亚洲国产欧美国产综合一区| 又爽又高潮的BB视频免费看| 高h视频在线免费观看| 亚洲熟妇丰满多毛XXXX| 97精品免费视频| 亚洲s码欧洲m码吹潮| 亚洲精品网站在线观看不卡无广告| 一区二区在线免费视频| 亚洲国语精品自产拍在线观看 | 美女被免费视频网站a| 中文字幕亚洲无线码a| 日本免费人成视频在线观看| 国产亚洲精品成人AA片| 免费人成网站在线播放| 你好老叔电影观看免费| 亚洲成a人片在线网站| 特级淫片国产免费高清视频| 久久精品成人免费国产片小草| 久久亚洲私人国产精品| 成人免费无码大片A毛片抽搐| 成年网在线观看免费观看网址| 日本亚洲视频在线| 大地资源免费更新在线播放| 十八禁的黄污污免费网站| 亚洲一区二区在线视频| 国产片免费在线观看| 久久99精品国产免费观看| 亚洲国产AV无码一区二区三区 | 亚洲精品国精品久久99热|