天天看點

JSP技術基礎

一、JSP簡介

JSP(Java Server Pages)是基于Java Servlet和整個Java體系的Web伺服器端開發技術

JSP網頁是在傳統的HTML檔案裡加入JSP标記或Java程式片段構成的,以

.jsp

作為擴充名。

當一個JSP頁面第一次被通路時,JSP引擎将執行以下步驟:

  1. 将JSP頁面翻譯成一個Servelet,這個Servelet時一個Java檔案,同時也是一個完整的Java程式
  2. JSP引擎調用Java編譯器對這個Servelet進行編譯,得到位元組碼檔案class
  3. JSP引擎調用Java虛拟機來解釋執行class,主要調用

    _jspService

    方法

以上三個步驟僅在JSP頁面第一次被通路時才會全部執行,以後通路不再建立新的Servelet,隻是新開一個服務線程。

JSP 頁面由兩部分組成:一部分是 JSP 頁面的靜态部分,如 HTML,CSS 标記等,常用 來完成資料顯示和樣式。另一部分是 JSP 頁面的動态部分,如腳本程式,JSP 标記等

JSP技術基礎

二、JSP标準文法

JSP技術基礎
JSP技術基礎

JSP注釋

JSP 程式中的的注釋包括兩種:

  • 一種是 HTML 注釋,文法格式:

    <!--這是 HTML 注釋,在用戶端源代碼中可檢視 -->

  • 另一種是 JSP 注釋,文法格式:

    <%--這是 JSP 注釋,在用戶端源代碼中不可見--%>

JSP 注釋不會發給浏覽器,在用戶端完全不可見,JSP 程式注釋的作用是供程式員閱 讀程式做注解的。

JSP 聲明

JSP 聲明用于聲明變量和方法,相當于對應的 Servlet 類的成員變量或成員方法。這 樣定義的變量或方法的作用域屬于網頁層,在 JSP 整個網頁中都能夠使用這些聲明過的變 量或方法。

JSP 聲明變量或方法的文法為:

<%! Java 變量或方法; %>

在 JSP 聲明中聲明的變量,相當于 static 變量,如果定義的 int 變量不賦初 值,則其初值預設為 0。如果同時打開多個浏覽器向該 JSP 頁面發請求,或在不同的機器 上打開浏覽器來請求這個 JSP 頁面,将發現所有用戶端通路該 JSP 中的 count 值是連續的, 即所有用戶端共享的是同一個 count 變量

下面是用新視窗打開的同一個jsp檔案

JSP技術基礎
JSP技術基礎

在 JSP 聲明部分

<%! %>

定義内的變量和方法是類的全局變量和方法, 也就是類的成員變量和成員方法,該變量在建立對應的 Servlet 執行個體時被初始化,且一直 有效,直到執行個體銷毀。聲明在 JSP 代碼段

<% %>

内的變量是

_jspService()

方 法内部的變量,即局部變量。

JSP表達式

JSP 表達式就是一個符合 Java 文法的表達式,JSP 表達式是直接把 Java 表達式的值 作為字元串輸出。

JSP 表達式的文法形式如下所示:

<%=Java 表達式%>

注意:不能用分号

來作為表達式的結束符。

JSP程式段

JSP 程式段實際上就是嵌入在頁面中的 Java 代碼,也稱 JSP 代碼段,JSP 程式段的具 體文法格式如下:

<% Java 代碼段 %>

在 JSP 聲明中定義的變量和在 JSP 程式段中所定義的變量對應着相應的 servlet 類的 全局變量和局部變量.

這種差別對于使用者的具體體驗是:在 JSP 聲明中定義的變量隻初始 化一次,且在所有運作這個 JSP 程式代碼的線程中共享該全局變量;而在 JSP 程式段中定 義的變量,為 sevlet 類中的

_ jspService()

方法裡的局部變量,局部變量不能使用 private 等通路控制符修飾,也不可使用 static 修飾,在每次新的請求線程産生的時候, 它都會重新建立和重新初始化。

JSP代碼段裡不能定義方法,由于JSP代碼轉換成

_ jspService()

裡的可執行代碼,Java 文法不允許在 方法裡定義方法,是以 JSP 代碼段裡也不能定義方法

JSP與HTML的混合使用

HTML 代碼 主要是用于頁面的外觀組織與顯示,如顯示字型的大小、顔色、定義表格、是否換行、顯 示圖檔、插傳入連結接等。Java 代碼主要用于業務邏輯的處理,如對資料庫的操作、數值的 計算等,同時,也可以通過将 HTML 嵌入到 Java 的循環和選擇語句中來控制 HTML 的顯示

三、JSP編譯指令

JSP編譯指令的作用是設定 JSP 程式和由該 JSP 程式 編譯所生成的 Servlet 程式的屬性,它不直接生成輸出,而隻是告訴引擎如何處理 JSP 頁面中的某些部分。

基本文法格式:

<%@ 編譯指令名 屬性名="屬性值" %>

例如:

<%@ page contentType="text/html;charset=utf-8"%>

注意:屬性名部分是大小寫敏感的,在目前的 JSP 2.0 中,定義了 page、include 和 taglib 這三種指令,每種指令中又都定義了一些各自的屬性。

page編譯指令

page 指令用來設定整個 JSP 頁面的相關屬性和功能。包括:指定 JSP 腳本語言的種類、導入的包或類、指定頁面編碼的字元集等。

基本文法:

<%@ page 屬性 1=“屬性值 1” 屬性 2=“屬性值 2” 屬性 3=“屬性值 3” … %>

要在一個 JSP 頁面中設定同一條指令的多個屬性,可以使用多條指令語句單獨設 置每個屬性,也可以使用同一條指令語句設定該指令的多個屬性。兩種方式如下:

第一種(常用)

<%@ page contentType="text/html; charset=gb2312" import="java.util.Date"%>

第二種:

<%@ page contentType="text/html;charset=gb2312"%>

<%@ page import="java.util.Date"%>

使用 page 指令要注意以下幾點:

(1)<%@page %>指令作用于整個 JSP 頁面,包括靜态的包含檔案(用<%@include %>指令調用), 但不包括用指令指定的動态包含檔案,因為動态包含時,實際上仍是兩個獨立運作的 Servlet 檔案,而靜态包含實際上是将兩個 JSP 檔案合并為一個 Servlet。

(2)除了 import 屬性之外,其他的屬性都隻能用一次。

(3)無論把<%@page %>指令放在 JSP 的檔案的哪個地方,它的作用範圍都是整個 JSP 頁面。不過, 為了 JSP 程式的可讀性,最好還是把它放在 JSP 檔案的頂部。

JSP技術基礎
JSP技術基礎

include編譯指令

include 編譯指令用于通知 JSP 引擎在翻譯目前 JSP 頁面時将其他檔案中的内容與當 前 JSP 頁面合并,轉換成一個 Servlet 源檔案。 這種在編譯階段進行整合處理的合并操 作稱為靜态包含。

基本文法:

<%@ include file=“relative URL” %>

file 屬性是需要引用的 HTML 頁面或 JSP 頁面的相對路徑。如果 file 屬性的設定路 徑以“/”開頭,表示相對于目前 WEB 應用程式的根目錄而不是站點根目錄。

引入檔案與被引入檔案是在被 JSP 引擎翻譯成 Servlet 的過程中進行合并,而不是先 合并源檔案後再對合并的結果進行翻譯,除了 import 和 pageEncoding 屬性之外,page 指令的其他屬性不能在這兩個頁面中有不同的設定值。

除了指令元素之外,被引入的檔案中的其他元素都被轉換成相應的 Java 源代碼,然 後插入進目前 JSP 頁面所翻譯成的 Servlet 源檔案中,插入位置與 include 指令在目前 JSP 頁面中的位置保持一緻。

include 指令通常用來包含網站中經常出現的重複性頁面。

taglib編譯指令

<%@ taglib %>

指令定義一個标記庫以及自定義标記的字首,以便在頁面中使用基本 标記或自定義标記來完成指定的功能

tablib 指令的格式為:

<%@ tablib uri=“taglibURI” prefix=“tagPrefix” %>

其中屬性含義如下:

  • uri:唯一地指定标記庫的絕對 URI 或相對 URI,URI 用于定位這個标記庫資源的 位置。
  • prefix:名額記庫的識别符,用以差別使用者的自定義動作。

四、JSP動作指令

JSP 動作指令主要是一組動态執行的指令,以标記的形式使用。

與編譯指令不同,動作指令是運作時的腳本動作。

JSP技術基礎

forward動作指令

<jsp:forward page=“relativeURL”/>

動作的作用是實作伺服器端的頁面跳轉,即 從目前頁面轉發到另一個頁面,可以轉發到靜态的 HTML 頁面,也可以轉發到動态的 JSP 頁面,或者轉發到容器中的 servlet。

文法形式一:

<jsp:forward page="{relativeURL│<%=expression%>}"/>

文法形式二:

<jsp:forward page="{relativeURL│<%=expression%>}"/> 
<jsp:param name="parameterName" value=" {parameterValue│<%=expression%>}"/> 
</jsp:forward> 
           

page 屬性包含的是目标檔案的相對 URL,指定了要轉發的目标檔案的路徑。可用

<jsp:param>

設定參數。

jsp:forward 動作從目前頁面轉發到另一個頁面時,實際完成的還是同一個請求,是以在轉發過程中 request 對象在新的頁面中也是有效的,這種跳轉方式也稱為伺服器跳轉。

jsp:forward

動作常被用在使用者登入驗證中。

include動作指令

動作指令标記用于把另外一個資源的輸出内容插入進目前 JSP 頁面的 輸出内容之中,實際上是把指定頁面的 servlet 所生成的應答内容插入到本頁面相應位 置。

這種在 JSP 頁面執行時的引入方式稱之為動态引入。動作指令涉及到 的 2 個 JSP 頁面會被翻譯成 2 個 servlet,這 2 個 servlet 的内容在執行時進行合并。

指令格式一:

<jsp:include page="{relativeURL│<%=expression%>}" flush="true"/>

指令格式二:

<jsp:include page="{relativeURL│<%=expression%>}" flush="true"> 
 <jsp:param name="parameterName" value="patameterValue"/> 
 </jsp:include>``
           

其中

  • page:指定需要包含的檔案的相對路徑或絕對路徑。
  • flush 屬性指定在插入其他資源的輸出内容時,是否先将目前 JSP 頁面的已輸出 的内容重新整理到用戶端。必須設定 flush=“true”。
伺服器端頁面緩沖的意思是,在将生成的 HTML 代碼送到用戶端前,先在伺服器端内 存中保留,因為解釋 JSP 或 Servlet 變成 HTML 是一步步進行的,可以在伺服器端生成完 HTML 或生成一部分 HTML(所占用位元組數已達到指定的緩沖位元組數)後再送到客戶。如果 不緩沖,就會解釋生成一句 HTML 就向用戶端送一句。在 jsp:include 語句中,必須設定 flush=“true”,表示如果包含進來的頁面有變化,本頁面也随之重新整理。如果其值被設定 為“false”,可能會導緻意外錯誤。

<%include%>

<jsp:include>

的差別:

include 編譯指令是在 JSP 程式被 翻譯為 Servlet 程式的時期就先将 file 屬性所指定的程式内容“合并”到目前的 JSP 程 序中,使嵌入的檔案與主檔案成為一個整體,然後進行編譯。而動作指令 中 page 所指定的檔案隻有在用戶端請求時期才會被單獨進行編譯和載入,動态地與主文 件合并起來輸出。如果被嵌入的檔案經常改變的話,建議使用動作指令。 動作

<jsp:include>

也可與動作

<jsp:param>

一起使用,用來向被包含的頁面傳遞參 數。

plugin 動作指令

<jsp:plugin>

動作指令動态的下載下傳伺服器端的 JavaBean 或者 Java Applet 程式到客 戶端的浏覽器上執行。當 JSP 頁面被編譯并響應至浏覽器執行時,會根據浏 覽器的版本替換成或标記。

plugin 的基本文法如下:

<jsp:plugin 屬性 1=“值 1” 屬性 2=“值 2” 屬性 3=“值 3”…>
           
JSP技術基礎

param動作指令

<jsp:param>

經常和

<jsp:include>

<jsp:forward>

以及

<jsp:plugin>

一起使用,用于頁面間的參數資訊傳遞。

基本文法:

<jsp:param name=“parameterName” value=“parameterValue”>
           

其中 name 屬性就是參數的名稱,value 屬性就是參數值。這個參數值存放在頁面間 進行傳遞的資料。

相對基準位址

如果連結操作語句中提供的是相對 URL,則最終目标 URL 的生成方法是:

最終目标 URL = JSP 頁面相對基準 URL 位址 + 語句中的相對 URL
           

頁面相對基準 URL 位址的設定分如下兩種情況:

(1)通過标記設定的,即通過标記, 将本 JSP 頁面中的相對基準 URL 位址設為“basePathURL”。這樣固定後,本 JSP 頁面中的 所有連結均以此相對基準 URL 位址為基準點,再與連結語句中的相對 URL“合成”,得到 最終的目标 URL 位址。一般的 JSP 頁面通過如下語句将工程項目路徑設為頁面相對基準路徑。

<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+ 
request.getServerPort()+path+"/"; 
%> 
<base href="<%=basePath%>" target="_blank" rel="external nofollow" >
           

(2)在 JSP 程式中沒有使用标記設定頁面相對基準 URL 位址,這種情況 下,頁面中連結操作的相對基準位址就不固定了,而是以目前的 JSP 頁面的 URL 位址作為 本頁面中連結語句的相對基準位址。

超連結中表示的相對路徑與 DOS 系統的相對路徑概念一緻,它們的含義總結如下:

  • “ / ” 表 示 Web 服 務 的 根 路 徑 , 這 裡 的 Web 服 務 根 路 徑 為 “ http://localhost:8080/ ”, 本 例 中 , 如 果 鍊 接 寫 成

    “ <a href="\ch04\index.html" target="_blank" rel="external nofollow" >”

    , 則 合 成 後 的 目 标 URL 将 為 “http://localhost:8080/ch04/index.html”,運作時将會出現找不到目标檔案 的 HTTP404 類型錯誤;
  • “./”表示目前 JSP 頁面使用的相對基準 URL 路徑,要特别注意 JSP 頁面中是否通過設定過相對基準 URL,對于目前 JSP 頁面的相對基準 URL 路徑一般會有較大不同,使用不當,往往會找不到目标資源。
  • “…/”表示目前 JSP 頁面使用的相對基準 URL 路徑的上一級路徑。

五、JSP的隐含對象

JSP的内置對象是指在JSP頁面系統中已經預設内置的Java對線,這些對象不需要開發人員顯示聲明即可使用。

JSP的九個内置對象

JSP技術基礎
JSP技術基礎

JSP内置對象作用域

内置對象的作用域指:指每個内置對象在多長的時間和多大的範圍内有效,也即 在什麼樣的範圍内可以有效地通路同一個對象執行個體。這些作用域正好對應 JSP 的四個内置 對象 page、request、session 和 application 的生命周期。

request裡面存放的資料的生命周期 僅是一次請求的時間;session裡面存放的資料的生命周期較長;application裡面存放的資料生命周期最長,從伺服器啟動到伺服器關閉為 止。Page僅在一個 JSP 頁面中有效,它的作 用範圍最小或生命周期最短。

JSP 内置對象生命周期原理圖 :

JSP技術基礎
有一個容易産生的錯誤了解,就是認為關閉浏覽器就關閉了 session。正是由于 關閉浏覽器并不等于關閉了 session,才會出現設定 session 有效時間的解決方法。
  • out對象

    out 對象是 javax.servlet.jsp.JspWriter 類的執行個體,主要作用是用來向用戶端輸出 内容,同時管理應用伺服器輸出緩沖區。

  • page 對象

page 對象代表 JSP 頁面本身,或者說它代表了被轉換後的 Servlet。是以它可以調用 任何被 Servlet 類所定義的方法。在 JSP 頁面的 JSP 程式段以及 JSP 表達式中可以使用 page 對象。

在 JSP 頁面中,this 關鍵字表示目前 JSP 頁面這個對象,可以調用的常見方法如下

JSP技術基礎
  • request 對象

    用戶端的 請求資訊被封裝在 request 對象中,通過它才能了解到客戶的需求,然後做出響應。

    request對象常見方法

    JSP技術基礎
    JSP技術基礎

    在 request 對象的方法中,比較常用的有 getParameter()和 getParameterValues() 二個方法。

    getParameter()方法可以擷取用戶端送出頁面中的某一個控件的值,這個函數的傳回 值是一個 String 對象,如:文本框、單選按鈕、下拉清單框等。

    getParameterValues()方法可以擷取用戶端送出頁面中的一組控件的值,傳回值是一 個 String 數組。

  • response 對象

    response 對象是 javax.servlet.http.httpServletResponse 接口的執行個體,是伺服器 對 request 對象請求的回應,負責向用戶端發送資料。

    通過調用 resposne 對象的方法還 可以獲得伺服器端的相關資訊,如狀态行、head 和資訊體等。其中狀态行包括使用的協 議和狀态碼,head 包含關于伺服器和傳回的文檔的消息,如服務名稱和文檔類型等。

    使用 response 對象的 sendRedirect()方法,可向伺服器發送一個重新定向的請求。 當用它轉到另外一個面頁時,相當于從用戶端重新發出了另一個請求,重定向後在浏覽器 位址欄上會出現重定向後頁面的 URL,這種跳轉屬于用戶端跳轉,伺服器會為此重新生成 另一個 request 對象,是以原來的 request 參數轉到新頁面之後就失效了。需要注意的是, 此語句之後的其他語句仍然會繼續執行。是以,為了避免錯誤,往往會在此方法後使用 “return”中止其他語句的執行。

    JSP技術基礎
  • session對象

    HTTP 協定本 身是無狀态,無狀态是指協定對于事務處理沒有記憶能力,HTTP 無狀态的特性嚴重阻 礙了 WEB 應用程式的實作,畢竟互動是需要承前啟後的。

    session 對象的管理細節如下:

    (1)新用戶端向伺服器第一次發送請求的時候,request 中并無 sessionidID 。

    (2)此時,伺服器端會建立一個 session 對象,并配置設定一個 sessionID,serssion 對象會儲存在伺服器端。此時 session 對象的狀态處于 new state 狀态,如果調用 session.isNew()方法,則傳回 true。

    (3)伺服器端處理完畢後,将此 sessionID 随同 response 一起傳回到用戶端,并将 其存入到用戶端的 cookie 對象中。

    (4)當用戶端再次發送請求時,會将 sessionID 同 request 一起傳送給伺服器。

    (5)伺服器根據傳遞過來的 sessionID,将與該請求與儲存在伺服器端的 session 對象進行關聯,此時,伺服器上的 session 對象已再不處于 new state 狀态,如果調用 session.isNew(),則傳回 false。

    session 對象生成後,隻要使用者繼續通路,伺服器就會更新 session 對象中的該客戶 的最後通路時間資訊,并維護該 session 對象。也就是,使用者每通路伺服器一次,無論是 否讀寫 session 對象,伺服器都認為該使用者的 session 對象“活躍(active)”了一次。

    由于浏覽器從來不會主動在關閉之前通知伺服器它将要被關閉,是以伺服器不會有機 會知道浏覽器是否已經關閉。是以,伺服器為 session 設定了一個失效時間,當距離客戶 上一次“活躍時間”超過了這個失效時間時,伺服器就可以認為用戶端已經停止了活動, 就會把 session 删除以節省存儲空間。JSP 程式一般都是在使用者做 logoff 的時候,使用 session.invalidate()方法去删除 session 對象。

    JSP技術基礎
    JSP技術基礎
    void invalidate() 使該 Session 立即失效,原來會話中存儲的所有對象都不能再被訪 問。 Tomcat 中 Session 的預設逾時時間為 30 分鐘。可以通過修改 tomcat→conf→ conf/web.xm 中的,修改預設逾時時間,機關為分鐘,例如修改預設超 時時間為 60 分鐘:
    <session-config> 
    <session-timeout>60</session-timeout> <!-- 機關:分鐘 --> 
    </session-config> 
               
  • application對象

    application 對象是在 Web 伺服器啟動時由伺服器自動建立的,它的生命周期是 JSP 所有隐含對象中最長的,一旦建立了 application 對象,那麼這個 application 對象将會 永遠保持下去,直到伺服器關閉為止。正是由于 application 對象的這個特性,我們可以 将要在多個使用者中共享的資料放在 application 對象中,如目前的線上人數的統計,實作 聊天室的功能等。

    JSP技術基礎
    JSP技術基礎
  • config 對象

    config 對象中存儲着一些 servlet 初始的資料結構,它跟 page 對象一樣,很少被用 到。config 對象實作了 javax.servlet.ServletConfig 接口,如果在 web.xml 檔案中, 針對某個 Servlet 檔案或 JSP 檔案設定了初始化參數,則可以通過 config 對象來擷取這 些 初 始 化 參 數 。 config 對 象 提 供 了 兩 個 方 法 來 獲 取 Servlet 初 始 參 數 值 : config.getInitParamenterNames()、config.getInitParamenter (String name)。

    JSP技術基礎
  • exception 對象

    當 JSP 頁面發生錯誤時,會産生異常。exception 對象就是用來針對異常作出相應處 理的對象。

    JSP技術基礎
  • pageContext 對象

    pageContext 能夠存取其他内置對象,當内置對象包括屬性時,pageContext 也支援 對這些屬性的讀取和寫入。

    JSP技術基礎
    JSP技術基礎

    pageContext 對 象 在 使 用 Object getAttribute(String name, int scope) 、 Enumeration getAttributeNamesInScope(int scope)、void removeAttribute(String name, int scope)、void setAttribute(String name, Object value, int scope)這些 方法時,需要指定作用範圍。

    範圍的指定就使用 JSP 内置對象的 4 個作用域範圍參數:PAGE_SCOPE 代表 Page 範圍, REQUEST_SCOPE 代 表 Request 範 圍 , SESSION_SCOPE 代 表 Session 範 圍 , APPLICATION_SCOPE 代表 Application 範圍。

  • Cookie 對象

    Cookie 對象雖然不是 JSP 的内置對象,使用時需要顯 式建立該對象,但 JSP 設計時也經常使用 Cookie 技術來實作一些特殊功能。

    Cookie 是 WEB 伺服器通過浏覽器在客戶機的硬碟上存儲的一小段文本,用來記錄用 戶登入的使用者名、密碼、登入時間等資訊。當使用者下次再次登入此網站時,浏覽器根據用 戶輸入的網址,在本地尋找是否存在與該網址比對的 Cookie,如果有,則将該 Cookie 和 請求參數一起發送給伺服器做處理,實作各種各樣的個性化服務。

    JSP 可通過 Cookie向已注冊使用者提供某些專門的服務,比如通過 Cookie 技術手段, 讓網站“記住”那些曾經登入過的使用者,實作自動登入。利用 Cookie 實作使用者自動登入 的思路是:當使用者第一次登入網站的時候,網站向用戶端發送一個包含有使用者名的 Cookie,當使用者在之後的某個時候再次通路,浏覽器就會向網站伺服器回送這個 Cookie, 于是,JSP 可以從這個 Cookie 中讀取到使用者名,進而實作自動為使用者登入。