JSP頁面中能夠包含模板元素、腳本元素、EL表達式、註釋、指令、和行爲元素(JSP標籤)等內容。有三種類型的腳本元素:JSP腳本片段、JSP表達式和JSP聲明,它們內部使用的都是Java腳本代碼。html
JSP頁面中的靜態HTML內容被稱之爲JSP模板元素。java
將一個Java變量或表達式的計算結果輸出到客戶端的簡化方式,代碼位於<%= %>之中。express
嵌套在<% %>之中的一條或多條Java程序代碼,在這之中能夠直接使用JSP提供的隱式對象來完成Web應用程序特有的功能。瀏覽器
JSP頁面中的腳本片段、表達式、模板元素等都將轉換成Servlet的_jspService方法中的程序代碼,顯然,在腳本片段中聲明的變量都將成_jspService方法中的局部變量。另外,在腳本片段中聲明的方法也將被插入到_jspService方法中,這就會出如今方法中定義方法的語法錯誤。若是但願在JSP頁面中爲其轉換成的Servlet定義成員變量和方法,就要使用JSP聲明。JSP聲明將Java代碼封裝在<%! %>之中,裏面的代碼都將被插進_jspService方法的外面。安全
因此若是有:cookie
<%! private int globalVar = 0;//成員變量 %> <% int localVar = 0;//局部變量 %> globalVar:<%= ++globalVar %> localVar:<%= ++localVar %>
在JSP頁面沒有發生修改的狀況下,對應JSP頁面的每次訪問請求,Servlet引擎都會調用其所生成的Servlet的_jspService方法進行響應。每次調用_jspService方法時所訪問的globalVar都是同一個變量,因此其值不斷增加。而每次調用_jspService方法時所訪問的localVar是各自獨立的變量,因此其值老是1。session
EL表達式的基本語法格式爲」${表達式}「,它能夠出如今JSP自定義標籤和標準標籤的屬性值中,其計算結果將做爲標籤的屬性值或屬性值的一部分;EL表達式也能夠出如今模板元素中,其計算結果將插入進當前的輸出流中。EL表達式相比JSP腳本元素而言,具備如下優勢:jsp
一、使用EL表達式能夠很是方便地訪問JSP頁面相關的數據,例如要訪問名稱爲user的請求參數,JSP表達式爲:<%= request.getParameter("user") %>,而相應的EL表達式爲:${param.user}。在EL表達式中還能夠直接使用${cookie.user}來訪問名稱爲user的Cookie信息。在JSP表達式中卻沒法實現這樣的功能。編碼
二、若是表達式的計算結果爲null,將輸出「null」的字符文本。而EL表達式會將它強制轉換爲空字符串""後再輸出,而不是顯示「null」。spa
三、在EL表達式中還可使用empty操做符來判斷一個參數是否爲null,某個集合或字符串中的內容是否爲空。
四、EL表達式還具備js等腳本語言的優勢,可以對字符串、數字等各類類型的數據進行自動轉換。
JSP本身的註釋方式:<%-- --%>,不會在網頁源代碼中顯示。
<!-- -->是HTML的註釋,能夠在網頁源代碼中查看。
一、特殊字符序列的轉義處理:
EL表達式內的轉義:任何字符序列都不須要進行轉義處理,其中「${」和「}」與普通字符序列的處理方式徹底相同。例如,${'${' }和${"${" }均可以直接輸出${。
JSP腳本元素內的轉義:在<% %>中,能夠直接使用字符序列<%表達其字面意義,但爲了避免把%>當成結束分隔符處理,要表達字面意義的%>,必須用%\>進行轉義。同時,若是要表達%\>,則用%\\>。
JSP模板元素內的轉義:在HTML代碼中,爲了避免把<%看成腳本元素的開始,必須用<\%進行轉義。由於在模板元素JSP引擎沒有遇到腳本元素的開始分界符,因此可使用%>來表達字面意義。
二、JSP頁面中的錯誤通常可概括爲如下三類:
JSP頁面中的JSP語法格式有問題,致使其不能被翻譯成Servlet源文件,JSP引擎將提示這類錯誤發生在JSP頁面中的位置(行和列)及相關信息;
JSP頁面中JSP格式沒問題,但被翻譯成Servlet源文件中出現了Java語法問題,致使不能經過編譯。JSP引擎也將提示這類錯誤發生在JSP頁面中的位置(行和列)及相關信息;
JSP頁面翻譯成Servlet程序在運行時出現異常,這與普通Java程序的運行錯誤徹底同樣,Java虛擬機將提示錯誤發生在Servlet源文件中的位置(行和列)以及相關信息。
JSP指令必須嵌套在<%@ %>之中,其基本語法格式爲以下:
<%@ 指令 屬性名="值" %>
其中,屬性名是大小寫敏感。在JSP2.0中,定義了page、include、taglib三種指令,每種指令又都定義了一些各自的屬性。
若是要在一個JSP頁面中設置同一條指令的多個屬性,可使用多條指令語句單獨設置每一個屬性,也可使用同一條指令語句設置該指令的多個屬性,例子,
第一種方式:
<%@ page contentType="text/html";charset="GB2312"%> <%@ page import="java.util.Date"%>
第二種方式:
<%@ page contentType="text/html";charset="GB2312" import="java.util.Date"%>
<%@page language="java"|
extends="className"| --翻譯成的Servlet要繼承的父類,通常不要設置
import="importList"| --導入包或類(重要)
buffer="none|kb size"| --指定out隱式對象的緩衝區大小,none:不緩衝,默認8k
session=「true|false」| --是否可使用session,默認true
autoFlush="true|false" --設置out隱式對象的緩衝區已滿時,是將其中內容刷新到客戶端仍是拋出溢出的異常,默認true
isThreadSafe="true|false"| --用於設置JSP頁面是不是線程安全,默認true
info="infoText"| --定義Servlet的描述信息,可經過Servlet.getServletInfo方法得到該文本串,能夠是任何字符
errorPage="errorPageUrl"| --設置另一個JSP頁面處理當前JSP頁面發生的異常。設置值必須使用相對路徑
isErrorPage="true|false"| --設置當前頁面是不是專門用於處理其餘未捕獲的異常JSP頁面,默認值false
contentType="contentTyepInfo"| --設置響應正文的MIME類型,即指定Content-Type響應頭字段的值和說明JSP文件中的文本內容的字符集編碼。默認MIME類型爲text/html,默認字符集編碼爲ISO8859-1
pageEncoding="characterSet"| --指定JSP源文件中的字符所使用的字符集編碼。設置了該值,contentType屬性再也不具備說明JSP源文件的字符集編碼的做用。若是在JSP頁面中沒有設置page指令的contentType屬性,那麼該屬性還具備指定響應正文的字符集編碼的做用,默認ISO8859-1
isELIgnored="true|false" --當前JSP頁面是否支持EL表達式,默認true
%>
問:爲何要說明JSP源文件的字符集編碼?
答:由於JSP引擎將JSP源文件翻譯成的Servlet源文件默認採用UTF-8編碼,而JSP開發人員能夠採用各類字符集編碼來編寫JSP源文件,所以,JSP引擎將JSP源文件翻譯成Servlet源文件時,JSP引擎必需要知道JSP源文件所使用的字符集編碼,才能將源文件中的字符文本轉換成其正確的UTF-8字符集編碼。
include指令用於通知JSP引擎,在翻譯當前JSP頁面時,將其餘文件中的內容合併進當前JSP頁面轉換成的Servlet源文件中,這種方式稱爲靜態引入。簡單理解是:翻譯當前JSP頁面時,遇到這條語句,則把語句中引入的文件翻譯後Servlet代碼包含在當前JSP頁面翻譯成的Servlet裏。語法以下:
<%@ include file="relativeURL"%>
其中file屬性用於指定被引入文件的相對路徑(設置值是相對於引入文件自己在硬盤的路徑,而不是瀏覽器地址欄URL上的路徑)。若是以「/」開頭,表示相對於Web應用程序的根目錄,不然表示相對於當前文件
被引入的文件必須遵循JSP語法
被引入的文件可使用任意擴展名,JSP規範建議使用.jspf做爲靜態引入文件的擴展名
除了import和pageEncoding屬性以外,page指令的其餘屬性不能在這兩個頁面中有不一樣的設置值。注意utf-8和UTF-8被當成不一樣值。
插入include指令的位置與當前JSP頁面中的位置保持一致
引入文件與被引入文件是在被JSP引擎翻譯成Servlet過程當中進行合併的,而不是先合併源文件後再對合並的結果進行翻譯
JSP提供了一種稱之爲Action的元素,在JSP頁面中使用Action元素能夠完成各類通用的JSP頁面功能。Action元素採用XML元素的語法格式,因此,乾脆將Action元素稱之爲JSP標籤。
<jsp:include>標籤用於把另一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之爲動態引入。簡單理解是:翻譯當前JSP頁面時,遇到這條語句,調用一個include方法,把引入文件包含進來,並不會把引入的文件翻譯後的Servlet代碼包含在當前JSP頁面翻譯的Servlet中。其語法以下:
<jsp:include page="relativeURL | <%=表達式%>" flush="true | false" />
其中,page屬性用於指定被引入資源的相對路徑,也能夠經過執行一個表達式來得到,flush屬性指定在插入其餘資源的輸出內容時,是否先將當前JSP頁面已輸出的內容刷新到客戶端,其默認值是false,表示先不刷新已輸出的內容。
<jsp:include>標籤與include指令的比較:
<jsp:include>標籤的做用相似RequestDispatcher.include方法,被引入頁面不能改變響應狀態碼,也不能設置響應頭。include指令沒有這方面限制。
<jsp:include>標籤的執行效率低於include指令,但靈活性要好不少。
<jsp:include>標籤對JSP引擎翻譯JSP頁面的過程沒有影響,例如,引入頁面的page指令不影響被引入頁面的page指令。include指令則對JSP引擎翻譯JSP頁面的過程起做用。
詳細:http://www.jb51.net/article/47606.htm
注意:<jsp:include>標籤的page屬性的設置值必須使用相對路徑,若是以「/」開頭,表示相對於當前Web應用程序的根目錄,不然表示相對於當前頁面的訪問路徑(不是相對於文件的硬盤路徑)。
<jsp:include>標籤的特性
included.jsp
<%@ page contentType="text/html;charset=GB2312"%> <%Thread.sleep(5000);%> included.jsp內的中文<br>
dynamicInclude.jsp
<%@ page contentType="text/html;charset=GB2312"%> dynamicInclude.jsp內的中文<br> <jsp:include page="included.jsp" flush="true" />
用瀏覽器訪問dynamicInclude.jsp頁面,瀏覽器首先顯示出dynamicInclude.jsp頁面輸出的內容,等待5秒後,才又顯示出included.jsp頁面的輸出內容。
修改dynamicInclude.jsp文件,去掉flush屬性設置,用瀏覽器從新訪問dynamicInclude.jsp頁面,瀏覽器等待5秒之後同時顯示出了dynamicInclude.jsp和included.jsp頁面的內容。
總結:
RequestDispatcher.include方法:調用該方法先後,寫入到緩衝區的內容能夠被輸出到客戶端。
RequestDispatcher.forward方法(不能有內容已經被輸出到客戶端):調用該方法前,寫入到緩衝區的內容被清空,調用該方法後,寫入操做被忽略。因此在調用者程序中寫入到緩衝區的內容都不會被輸出到客戶端。
Request.sendRedirect方法(不能有內容已經被輸出到客戶端):在調用該方法先後寫入到緩衝區的內容都會被清空。
<jsp:forward>標籤用於把請求轉發給另一個資源,其語法以下:
<jsp:forward page="relativeURL | <%=表達式%>" />
其中,page屬性用於指定請求轉發到的資源的相對路徑,它也能夠經過執行一個表達式來得到。
<jsp:forward>標籤實際上被翻譯成了調用PageContext.forward方法的語句,並在調用forward方法後使用return語句結束了service方法的執行流程,從而再也不執行<jsp:forward>標籤後面的語句。
當使用<jsp:include>標籤和<jsp:forward>標籤引入或將請求轉發給的資源是一個能動態執行的程序時,還可使用<jsp:param>標籤向這個程序傳遞參數信息。語法以下:
<jsp:include page="relativeURL | <%=表達式%>"> <jsp:param name="paramterName" value="paramterValue | <%=表達式%>" /> </jsp:include>
或:
<jsp:forward page="relativeURL | <%=表達式%>"> <jsp:param name="paramterName" value="paramterValue | <%=表達式%>" /> </jsp:forward>
<% %>可替代爲:<jsp:scriptlet> code </jsp:scriptlet>
<%! %>可替代爲:<jsp:declaration> code </jsp:declaration>
<%= %>可替代爲:<jsp:expression> expression </jsp:exprission>
<jsp:directive.directiveType>標籤來替代<%@ directive ... %>語句(directive是指令的意思),如:<%@ page import="java.util.*"%>可替換爲:<jsp:directive.page import="java.util.*" />
能夠將模板內容封裝在這個標籤當中。
——JSP標籤不少,這裏只是簡單講述。