隨筆 - 0, 文章 - 264, 評論 - 170, 引用 - 0

          導航

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          留言簿(6)

          隨筆分類

          文章分類

          文章檔案

          AI

          android+移動開發

          apache等開源類包,工具相關

          cdn

          concurrent

          C語言

          git、svn等工具使用

          groovy、grails

          Hadoop、Storm、Spark大數據相關

          hibernate、JPA等持久化技術

          html,dom,js,css、ext、mui等前端、移動前端相關

          HTTP、HTTPS、TCP、UDP等協議相關

          IM、openfire

          Java基礎

          java性能優化

          jquery

          linux相關

          lucene、solr等搜索技術相關

          maven gradle ant Jenkins自動化構建與持續集成

          memcache

          mongodb

          nginx、squid、haproxy、varnish

          OLAP

          python、shell、perl、php

          redis

          rmi相關

          spring

          struts、webwork

          tcp/ip

          tomcat,jsp,servlet相關

          velocity等實用工具相關

          業務相關

          互聯網安全、過濾、網絡

          修煉

          其他

          區塊鏈

          壓力、性能測試相關

          地圖相關

          基礎

          多線程

          開發工具相關

          數據庫

          架構

          移動互聯網

          設計模式

          搜索

          •  

          最新評論

          JSP中include指令和include行為區別(注:轉載于http://java.chinaitlab.com/ServletJsp/529740_2.html)

          我們都知道在jsp中include有兩種形式,分別是
          <%@ include file=” ”%>
          <jsp:include page=” ” flush=”true”/>

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

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

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

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

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

              服務器用tomcat,引入頁面的jsp文件叫test.jsp。被引入的頁面叫date.jsp.這個jsp文件里存放的是一個有關時間的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>
          有關jsp中include的兩種用法.敬請關注。
          </td></tr></table>
          </body>
          </html>

                在test.jsp 文件中,我們只輸出了一行文本“ 有關jsp中include的兩種用法.敬請關注。”,現在讓我們先 用<%@ include file=”date.jsp” %>這種形式引入date.jsp這個文件。你想會出現什么問題了嗎?此時出現 了錯誤提示:
          HTTP Status 500 ?
          org.apache.jasper.JasperException: /date.jsp(0,0) Page directive: can't have multiple occurrences of contentType
          以下還有一堆錯誤,但我們只要看這里就知道問題的所在了。狀態碼為http 500服務器內部錯誤。再看下面的提示。在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
          有關jsp中include的兩種用法.敬請關注。

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

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

               相對應的test_jsp.class這個文件就是編譯test_jsp.java這個servlet文件產生的類文件了。打開所產生的servlet文 件(test_jsp.java)。此時我們會發現,在test.jsp 文件被轉化成servlet文件時,在輸出的<haed>之間加入 了一些不是test.jsp頁面里面的代碼,新加入的內容就是 date.jsp里面的代碼: 新加入了哪些內容或是否真的加入了新的內容請自己測試去看一下就會一目了然了.在這里不再詳述.

          以上就是我們用<%@ include file=”date.jsp”%>這種形式得到的結果.
          下面我們換用<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
          有關jsp中include的兩種用法.敬請關注。

              此時會在頁面上看見.我們所引入date.jsp輸出的日期中中文出現了亂碼.什么原因?是因為include行為元素是在請求處理階段執行的(此處要對 請求處理階段進行說明一下.Jsp容器除了上面提到的負責將jsp頁面轉化成servlet外,還負責調用jsp頁面實現類以處理每個請求并產生應答.這 個階段我們就稱為請求處理階段.請求處理階段僅執行類文件)。

             所以在我們作include行為元素引入頁面時,實際只是引用了date.jsp這個文件被轉化并被編譯后產生的servlet類文件.既如 此, date.jsp就是作為一個單獨的文件在執行后才被test.jsp文件運行時調用.由于date.jsp文件中沒有指定字符編碼.所以出現了亂 碼.解決辦法是在date.jsp文件中重新把剛才去掉的
          <%@ page language=”java” contentType=”text/html;charset=gb2312”%>
          這 行語句加入后刷新重新運行.此時頁面顯示正確,并跟用include指令正常運行時一樣.再查看tomcat下的臨時文件會發現.此時多出了一 個 date_jsp.java文件和一個date_jsp.class文件.這兩個文件得來的方式跟test_jsp.java 和 test_jsp.class文件得來的方式一樣.再查看一下此時test_jsp.java文件的代碼會發現.此時只新增加了一句代碼:
          JspRuntimeLibrary.include(request, response, "date.jsp", out, true);

          它并沒有把date.jsp文件的代碼加入到test.jsp.

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

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

              如果修改了被引入的jsp頁面,那么可以立刻使用該頁面的最新版本,這是因為對待被引入的頁面的方式與對待由瀏覽器直接調用的jsp頁面的方式完全相同.即容器檢測頁面的變化,并自動進入翻譯階段,以得到頁面的最新版本.

          (注意,include行為元素同jsp其它元素一樣,沒有行為體時要以”/”結束.就像下面這樣.
          <jsp:include page=”<%=pageSelectedAtRuntime%>” flush=”true” />)

          以下是對include 兩種用法的區別
          主要有兩個方面的不同;
          一:執行時間上:
          <%@ include file=”relativeURI”%> 是在翻譯階段執行
          <jsp:include page=”relativeURI” flush=”true” /> 在請求處理階段執行.
          二:引入內容的不同:
          <%@ include file=”relativeURI”%>
          引入靜態文本(html,jsp),在JSP頁面被轉化成servlet之前和它融和到一起.
          <jsp:include page=”relativeURI” flush=”true” />引入執行頁面或servlet所生成的應答文本.
          另 外在兩種用法中file和page屬性都被解釋為一個相對的URI.如果它以斜杠開頭,那么它就是一個環境相關的路徑.將根據賦給應用程序的URI的前綴 進行解釋,如果它不是以斜杠開頭,那么就是頁面相關的路徑,就根據引入這個文件的頁面所在的路徑進行解釋.更多有關URL是如何解釋的請參考相關資料或書 籍.

          posted on 2010-10-28 12:30 小一敗涂地 閱讀(1710) 評論(0)  編輯  收藏 所屬分類: jsp,servlet相關

          主站蜘蛛池模板: 桦川县| 京山县| 井研县| 綦江县| 福贡县| 七台河市| 大安市| 赫章县| 马公市| 淮南市| 获嘉县| 会东县| 天全县| 昭通市| 富民县| 边坝县| 磐安县| 江口县| 红安县| 宽甸| 修文县| 崇左市| 唐河县| 常熟市| 德令哈市| 长顺县| 虹口区| 安宁市| 邵武市| 玉树县| 罗田县| 沙雅县| 贵溪市| 大姚县| 黑山县| 嘉祥县| 陕西省| 酒泉市| 庆安县| 如皋市| 九江市|