1.<%@ include file="../top/top.jsp"%>
2.<jsp:include page="coupon.jsp"/>
3.<iframe src="" width="100%" height="200" ></iframe>
4.<s:include value="/CMS/headers/wrap/header.jsp"/>
5.<s:action name="cmsPoint" namespace="/include"/>
jsp開發時,這五種經常使用的頁面引入標籤,到底有什麼區別,各自適應場合是什麼,相信不少人都不陌生,但又感受莫林兩可的,本文將作一個全面的彙總。
注:本文雖然各方面都涉及到了,可是不少細節還沒列出來,後續在開發中還會不斷總結不斷完善,但願與廣大it從業的朋友們多交流,共同進步。
------------------------------------------------------------------------------
首先看include和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的源文件=====// html
//======如下是test.jsp的源文件=============// java
在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
這時咱們還不能發現什麼。仍是去查看tomcat下的臨時文件吧。到那裏去看看date.jsp文件
的內容是否已被加入到了test.jsp文件中。
在目錄下會看到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
此時會在頁面上看見.咱們所引入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的前綴進行解釋,若是它不是以斜槓開頭,
那麼就是頁面相關的路徑,就根據引入這個文件的頁面所在的路徑進行解釋.
-------------------------------------------------------------------------
若是用了struts2框架,則還有如下的用法。
<s:include value="/header.jsp">
<s:param name="mKeywords">
<s:property value="couponDetailVO.storeName"/>團購</s:param>
</s:include>
<s:action name="cmsPoint" namespace="/include" executeResult="true"
ignoreContextParams="true">
<s:param name="type" value="'headers/new/include'"></s:param>
<s:param name="match" value="'footer_950'"></s:param>
<s:param name="query" value="'city='+oldCity"></s:param>
</s:action>
使用action標籤,能夠容許在jsp頁面中直接調用Action,在調用Action時候,能夠指定須要被
調用的Action的name和namespace.若是指定了executeResult參數的屬性值爲true,該標籤會
把Action的處理結果(視圖資源)包含到本頁面中. 使用action標籤指定屬性有:
id: 可選屬性,做爲該Action的引用ID
name:必選屬性,指定調用Action
namespace:可選屬性,指定該標籤調用Action所屬namespace
executeResult:必選屬性,指定是否將Action的處理結果包含到本頁面中.默認值爲false,不
包含.
ignoreContextParam:可選參數,指定該頁面的請求參數是否須要傳入調用的Action中,默認
值是false,即傳入參數.
下面看一個完整的調用示例: apache
struts.xml 瀏覽器
head.jsp tomcat
-----------------------------------
s:include的用法
s:include的效果與jsp:include效果是同樣的,通常我習慣用jsp:include
下面給一個完整示例:
s-include.jsp 服務器
foot.jsp 框架
-------------------------------------------------------------------
iframe用法
iframe的src能夠指向任何地址,它加載的是一個完整的dom模型。
include與jsp:include的概括參考了一個兄弟的博客,他總結的很是清晰:
http://www.cnblogs.com/Ghost-Draw-Sign/articles/1835974.html
總的來講:
include與jsp:include用的比較多,基本能夠知足要求了.
s:action在與s:include用的相對少一點。
iframe也很經常使用,不過聽說它不利於搜索引擎。dom