JSP中的include的兩種用法
1.兩種用法
<%@ include file=” ”%>
<jsp:include page=” ” flush=”true”/>
2.用法區別
(1)執行時間上區別
<%@ include file=”relativeURI”%> 是在翻譯階段執行
<jsp:include page=”relativeURI” flush=”true” /> 在請求處理階段執行.
(2)引入內容的不同
<%@ include file=” ”%>
jsp的include指令元素讀入指定頁面的內容。並把這些內容和本來的頁面融合到一起。(這個過程是在翻譯階段:也就是jsp被轉化成servlet的階段進行的。
<jsp:include page=”relativeURI” flush=”true” />引入執行頁面或servlet所天生的應答文本.
3.如何使include頁面攜帶入參
<jsp:include page=”<%=pageSelectedAtRuntime%>” flush=”true” >
<jsp:param name=”fitstParamer” value=”firstValue”>
<jsp:param name=”lastParamer” value=”lastValue”>
</jsp:include>
4. 說明:翻譯階段
翻譯階段:
jsp頁面不能原封不動地被傳送給瀏覽器,全部的jsp元素都必須首先由服務器進行處理。這是通過將jsp頁面轉達化成servlet,然后執行這個servlet來結束的。服務器需要一個jsp容器來處理jsp頁面。jsp容器平常以servlet的情勢來實現,這個servlet經過配置,可以處理對jsp頁面的全部請求。
Jsp容器重視將jsp頁面轉化成servlet(稱為jsp頁面實現類—JSP Page implementation class),並編譯這個servlet。這兩步就組成了翻譯階段.
請求處理階段:
Jsp容器除了上面提到的重視將jsp頁面轉化成servlet外,還重視調用jsp頁面實現類以處理每個請求並產生應答.這個階段我們就稱為請求處理階段.請求處理階段僅執行類文檔.
5.示例
服務器用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” %-->
<head>
<body>
<table><tr><td></td></tr></table>
</body>
</html>
先用<%@ 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頁面,正常。
查看tomcat下的臨時文檔,..\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”/>,然后請求test.jsp.此時會在頁面上看見.我們所引入date.jsp輸出的日期中中文出現了亂碼.
所以在我們作include行動元素引入頁面時,實際只是引用了date.jsp這個文檔被轉化並被編譯后產生的servlet類文檔.既如此,date.jsp就是作為一個單獨的文檔在執行后才被test.jsp文檔運行時調用.由於date.jsp文檔中無指定字符編碼.所以出現了亂碼.解決辦法是在date.jsp文檔中重新把剛才去掉的
<%@ page language=”java” contentType=”text/html;charset=gb2312”%>
再查看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.