JSP中include指令和動作及區別詳解

來源:互聯網
上載者:User

先來看看文法及比較





//include_<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>My JSP 'include_command.jsp' starting page</title>        <meta http-equiv="pragma" content="no-cache">    <meta http-equiv="cache-control" content="no-cache">    <meta http-equiv="expires" content="0">        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">    <meta http-equiv="description" content="This is my page">    <!--    <link rel="stylesheet" type="text/css" href="styles.css">    -->  </head>    <body>      <h1>include命令</h1>      <hr>    <%@ include file="data.jsp" %>  </body></html>
//data.jsp<%@ page language="java" import="java.util.*, java.text.*" contentType="text/html; charset=utf-8"%><%    request.setCharacterEncoding("utf-8");    Date d = new Date();    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");    out.println(sdf.format(d));%>
//include_action.jsp<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>My JSP 'include_command.jsp' starting page</title>        <meta http-equiv="pragma" content="no-cache">    <meta http-equiv="cache-control" content="no-cache">    <meta http-equiv="expires" content="0">        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">    <meta http-equiv="description" content="This is my page">    <!--    <link rel="stylesheet" type="text/css" href="styles.css">    -->  </head>    <body>      <h1>include動作</h1>      <hr>    <jsp:include page="data.jsp" flush="false"/>  </body></html>





JSP中include指令和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的源檔案:

<%@ 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的首碼進行解釋,如果它不是以斜杠開頭,那麼就是頁面相關的路徑,就根據引入這個檔案的頁面所在的路徑進行解釋。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.