1. 程式人生 > >JSP中的兩種包含頁面的方法

JSP中的兩種包含頁面的方法

第一種:include指令:當JSP轉換成Servlet時引入指定檔案 <%@ page contentType="text/html; charset=GB2312" language="java" errorPage=""%> 
<%@ include file="head.jsp"%> 
<%@ include file="body.jsp"%> 
<%@ include file="tail.jsp"%> 
第二種:<jsp:include>動作元素:當JSP頁面被請求時引入指定檔案 
<%@ page contentType="text/html; charset=GB2312" language="java" errorPage=""%> 

<jsp:include page="head.jsp"/> 
<jsp:include page="body.jsp"/> 
<jsp:include page="tail.jsp"/> 


第二種方法可以很方便的用<jsp:param>來向所包含頁傳遞引數,方法如下: 
<%@ page contentType="text/html; charset=GB2312" language="java" errorPage=""%> 
<jsp:include page="head.jsp"/> 
<jsp:include page="body.jsp"> 

<jsp:param name="uid" value="username"/> 
<jsp:param name="pwd" value="password"/> 
</jsp:include> 

<jsp:include page="tail.jsp"/> 

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

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



通常當應用程式中所有的頁面的某些部分(例如標題、頁尾和導航欄)都相同的時候,我們就可以考慮用include。具體在哪些時候用<%@ include file=” ”%>,哪些時候用<jsp:include page=” ” flush=”true”/>.這種形式。首先要明白的是它們之間的區別。只有瞭解了它們用法的不同才理解該在何時去用以及如何選擇。
<%@ include file=” ”%>,jspinclude指令元素讀入指定頁面的內容。並把這些內容和原來的頁面融合到一起。(這個過程是在翻譯階段:也就是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”/>
<%[email protected] include file=”date.jsp” %-->
//我們在這裡用include的兩種不同形式來引入date.jsp這個檔案.
<head>
<body>
<table><tr><td>
有關jspinclude的兩種用法.敬請關注。
</td></tr></table>
</body>
</html>

test.jsp 檔案中,我們只輸出了一行文字“ 有關jspinclude的兩種用法.敬請關注。”,現在讓我們先用<%@ 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
有關jspinclude的兩種用法.敬請關注。

這時我們還不能發現什麼。還是去檢視tomcat下的臨時檔案吧。到那裡去看看date.jsp檔案的內容是否已被加入到了test.jsp檔案中。
<.此處的tomcat裝在E盤根目錄下>
目錄
E:"tomcat"work"Standalone"localhost"test.
在這個目錄下會看到
test_jsp.javatest_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
有關jspinclude的兩種用法.敬請關注。

    此時會在頁面上看見.我們所引入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所生成的應答文字.
另外在兩種用法中filepage屬性都被解釋為一個相對的URI.如果它以斜槓開頭,那麼它就是一個環境相關的路徑.將根據賦給應用程式的URI的字首進行解釋,如果它不是以斜槓開頭,那麼就是頁面相關的路徑,就根據引入這個檔案的頁面所在的路徑進行解釋.更多有關URL是如何解釋的請參考相關資料或書籍


相關推薦

JSP包含頁面方法

第一種:include指令:當JSP轉換成Servlet時引入指定檔案 <%@ page contentType="text/html; charset=GB2312" language="java" errorPage=""%> <%@ include

和-----JSP頁面引入方式的區別

         我們都知道在jsp中include有兩種形式,分別是 <%@ include file=” ”%>和<jsp:include page=” ” flush=”true”/> ,前者是指令元素,而後者是行為元素。具體它們將在何處用?

Jsp請求方式的區別

(1) Get方式的請求                       直接在瀏覽器的位址列中輸入訪問地址所傳送的請求或提交表單傳送請求時,該表單對應的的form元素 沒有設定method屬性,或設定method屬性為get,這幾種請求都是GET方式的請求。GET方式的請求會

jspinclude用法的區別

如果要實現一個網站。而且整個web站點,都需要選單,頁首,頁尾(HTML程式碼) 兩種實現方法:    1,在所有的jsp頁面中,寫上選單,頁首,頁尾的html程式碼(顯然這樣做時不合理的,如果後期要換一下頁首或選單,那麼工作量是很大的)     2 ,在所有的js

R常用並行方法——1. parallel

由於最近在進行一些論文的模擬,所以嘗試了兩種並行的方法:parallel與snowfall,這兩種方法各有優缺,但還是推薦snowfall,整體較為穩定,不容易因為記憶體不足或者並行執行緒過多等原因而報錯。 平行計算 平行計算: 簡單來講,就是同時使

JSP頁面頁面include方式及其區別

JSP頁面可以進行巢狀,巢狀有兩種方法<%@include %>(靜態的)與<jsp:include>(動態的) 【準備知識】 JSP在首次執行時主要有以下幾個步驟: 1、JSP程式碼翻譯為Java程式碼; 2、Java程式碼便宜為class; 3、

HTTP請求協議GET和POST基本請求方法的區別

GET在瀏覽器回退時是無害的,而POST會再次提交請求。   GET產生的URL地址可以被Bookmark,而POST不可以。   GET請求會被瀏覽器主動cache,而POST不會,除非手動設定。   GET請求只能進行url編碼

HTTP協議GET和POST基本請求方法的區別

GET和POST兩種基本請求方法的區別 GET和POST是HTTP請求的兩種基本方法,要說它們的區別,接觸過WEB開發的人都能說出一二。   最直觀的區別就是GET把引數包含在URL中,POST通過request body傳遞引數。   你可能自己寫過無數個G

java轉換時間的方法

將String ->util date - > sql date 在學過mvc後,可以新建一個工具類,把轉換程式碼寫到util包中 public class DateUtil { private static SimpleDateFormat sdf = new Sim

ajax請求 csrftoken的發送方法

NPU print req 空字符 ajax請求 提交 query style ces 通過ajax的方式發送兩個數據進行加法運算 html頁面 <body> <h3>index頁面 </h3> <input type="tex

MFC方法獲取系統時間

void CMFC2Dlg::OnBnClickedButton1() { // TODO: 在此新增控制元件通知處理程式程式碼 CTime t = CTime::GetCurrentTime(); int nYear=t.GetYear(); int nMonth=t.GetMonth(

jsp跳轉 jsp跳轉方式及區別

//注意:不推薦中文檔名如"目的頁面.jsp",此處僅為了教程需要而使用   // 帶session,不帶request的跳轉(客戶端跳轉)   responst.sendRedirect("目的頁面.jsp");   // 帶session,帶request的跳轉(

Windows多字元與寬字元的轉換方法

在Windows中經常需要用到多字元與寬字元的轉換方法,所以多字元(MultiChar)也就是ANSI編碼的方式,而寬字元(WideChar)也就是Unicode編碼的方式。 首先是兩種傳統的轉換方法,分別是MutiByteToWideChar和WideCharToM

JSP傳遞引數的方法

今天老師講了jsp中四種傳遞引數的方法,我覺得總結一下,挺好的,以備後用! 1、form表單 2、request.setAttribute();和request.getAttribute(); 3、超連結:<a herf="index.jsp"?a=a&b=b

excel的VBA呼叫工作表函式的方法

excel 的VBA中有兩種呼叫工作表函式的方法: Sub aa()   ActiveSheet.Range("b2") = Application.WorksheetFunction.Max(Rang

Linux系統安裝go環境的方法

在Linux系統中安裝go環境。下面介紹兩種方法: 一、基於Debian的發行版本,使用apt-get安裝go環境 1、安裝命令:$ sudo apt-get install golang 2、設定環

android/java 延時執行的方法

// 訊息處理方式實現延時        new Handler().postDelayed(new Runnable()        {            public void run()            {               myDialo

Java swing 控制元件的居中顯示方法

方式一: 核心程式碼: this.setLocationRelativeTo(null); 方式解讀:這段程式碼在初始化控制元件時,設定該控制元件相對其他控制元件為null,也就是不相對其他控制

C++常用的記錄程式執行時間的方法的總結

關於C++中計算時間的一些總結 方法一:clock()計時函式 clock()是C/C++中的計時函式,而與其相關的資料型別是clock_t。在MSDN中,查得對clock函式定義如下: clock

二叉樹如何根據已知的遍歷方法,求出第三遍歷的結果

此題的答案是B。詳細解析如下:知道先序是根->左->右,中序是左->根->右,後序是左->右->根,但是以前一直沒整明白怎麼根據已知兩個序遍歷求第三種遍歷(前提是一定要知道中序遍歷),今天做這個題的時候忽然腦袋開竅了。最重要的一點就是:找到