JSP概覽

JSP是Java Server Page的縮寫,是Servlet的簡化。由Sun公司提出的且許多公司共同參與制定的一種動態網頁標準。

表現層主要技術有:FreeMaker、Velocity、Tapestry、JSP等(不承擔業務邏輯組件及持久層組件的責任)。

1. JSP工作原理

當服務器上的一個JSP頁面被第一次請求執行時,服務器上的JSP引擎先將JSP頁面文件轉換成爲一個Java文件,在轉換時如果發現jsp文件有任何語法錯誤,轉換過程將中斷,並向服務端和客戶端輸出出錯信息;如果轉換成功, JSP引擎用javac把該Java源文件編譯成相應的字節碼class文件,然後執行字節碼文件響應客戶的請求。而當這個JSP頁面再次被請求執行時,JSP引擎將直接執行字節碼文件來響應用戶。

當多個線程請求一個JSP頁面時,服務器爲每個用戶啓動一個線程,該線程負責執行常駐內存的字節碼文件來響應相應客戶的請求。這些線程由web服務器來管理,將CPU的使用權在各個線程之間快速切換,以保證每個線程都有機會執行字節碼文件,這與傳統的CGI爲每個用戶啓動一個進程相比較,效率要高的多。

如果對JSP頁面進行了修改、保存,那麼web服務器會生成新的字節碼文件,並覆蓋原來的字節碼文件。

2. 一個JSP頁面可由5種元素組合構成:

普通的HTML標記、JSP標記,如指令標記和動作標記、變量和方法的聲明<%! %>、Java程序片<% %>、Java表達式<%= %>

3. 字節碼文件的主要工作有以下幾個方面:

把JSP頁面中的HTML標記符號(頁面的靜態部分)交給用戶的瀏覽器負責顯示
負責處理JSP標記、數據的方法的聲明、Java程序片(JSP頁面中的動態部分),並將有關的處理結果發送到用戶的瀏覽器
計算Java表達式,並將結果轉化爲字符串,然後把執行結果交給用戶的瀏覽器負責顯示

4. 在“<%!”和“%>”標記符號之間聲明變量和方法

變量的類型可以是Java語言允許的任何數據類型,聲明的變量在整個JSP頁面內都有效,並且與放置的位置無關,但習慣將標記符號<%! %>寫在Java程序片的前面。JSP引擎將JSP頁面轉譯成Java文件時,將<%! %>之間聲明的變量作爲類的成員變量,這些變量的內存空間直到服務器關閉時才被釋放(方法內定義的變量只在方法內有效,方法被調用時分配內存,調用完畢即釋放所佔的內存)。多個用戶請求一個JSP頁面時,JSP引擎爲每個用戶啓動一個線程,這些線程共享JSP頁面的成員變量,任何一個用戶對成員變量的修改都會影響到其他用戶。

5.  在“<%”和“%>”標記符號之間插入程序片

一個JSP頁面可以有許多程序片,這些程序片將被JSP引擎按順序執行。在程序片中聲明的變量稱作JSP頁面的局部變量,局部變量的有效範圍與其聲明的位置有關,即局部變量在JSP頁面的後繼的所有程序片及表達式部分內都有效。多個用戶訪問一個JSP頁面時,該JSP頁面中的Java程序片將被運行多次,分別運行在不同的線程中,互不干擾。當一個線程將程序片執行完畢,運行在該線程中的Java程序片中的局部變量釋放所佔的內存。

6. 在“<%=”和“%>”標記符號之間插入一個表達式

不可插入語句,這個表達式必須能求值。表達式的值由服務器負責計算,並將計算結果以字符串的形式發送到客戶端顯示。

7. JSP中的註釋:

<!--註釋內容-->爲HTML註釋,用戶通過瀏覽器查看JSP源文件時能夠看到HTML註釋。
<%--註釋內容--%>爲JSP註釋,JSP引擎在編譯JSP頁面時忽略JSP註釋。
這說明JSP註釋不會被髮送到客戶端。

8. JSP的3個指令標記:page、include、taglib

一般JSP指令用標籤<%@…%>表示,JSP指令包括page、include和taglib。page指令是針對當前頁面的指令,而include指令用來指定如何包含另外一個文件,taglib指令用來定義和訪問自定義標記庫。這三種指令通常都有默認值,這樣開發人員就不必顯式的使用每一個指令予以確認。

page指令:page指令對整個頁面都有效,與其書寫的位置無關,但習慣把page指令寫在JSP頁面的最前面。如:

<%@ page language="java" contentType=”text/html;charset=GB2312” import=”java.util.*,java.io.*,java.awt.*” session=“true” buffer="8kb" autoFlush="true" isThreadSafe="true" info="information" errorPage="/error.jsp" isErrorPage="false" isELIgnored="false"%>

language:定義JSP頁面所使用的腳本語言,該屬性的值目前只能取java。

contentType:設置jsp網頁輸出時數據時所使用的字符壓縮方式,以及所使用的字符集,此屬性的默認值爲”text/html;charset=ISO-8859-1”。contentType屬性指定的值有:

text/html、text/plain、image/gif、image/x-xbitmap、image/jpeg、image/pjpeg、application/x-shockwave-flash、application/vnd.ms-powerpoint、application/vnd.ms-excel、application/msword等。

import:指令是所有page指令中,唯一可以多次設置的指令,而且累加每個設置。它用來指定jsp網頁中所需要使用到的一些類。import屬性默認已有如下的值:

java.lang.*、javax.serlvet.*、javax.servlet.jsp.*、javax.servlet.http.*。

session:用於設置是否使用內置的session對象,默認爲true。

buffer:用來設置指定out設置的緩衝區的大小或不使用緩衝區(值爲none),默認大小爲8kb。

autoFlush:指定out的緩衝區被填滿時,緩衝區是否自動刷新,默認爲true。當設置成false時,如果out的緩衝區被填滿,就會出現緩存溢出異常。當buffer的值爲none時,就不能設置成false。

isThreadSafe:用來設置JSP頁面是否可以多線程訪問,默認爲true。當設置成false時,同一時刻只能響應一個用戶的請求,其他用戶需排除等待。

info:設置頁面的文本信息,可以通過Servlet.getServletInfo()的方法獲得該字符串。

errorPage:定義指向另一個JSP頁面的URL。當頁面出現一個沒有被捕獲的異常時,錯誤信息將以throw語句拋出,而被設置爲錯誤信息網頁的JSP頁面,將利用exception隱含對象,取得錯誤信息。默認沒有錯誤處理頁面。

isErrorPage:設置此jsp網頁是否爲錯誤處理頁面。默認值爲”false”。當設置爲”true”時,JSP頁面將可存取隱含的exception對象,並通過該對象取得從發生錯誤之網頁所傳出的錯誤信息。取得錯誤信息的語法如下:<% =exception.getMessage()%>

isELIgnored:用以設定JSP網頁中是否忽略Expression Language,默認是false,如果設定爲true,則Expression Language將會被轉譯。

include指令:

使用include指令可以在JSP頁面出現該指令的位置處插入一個靜態文件,與原頁面合併成一個新的JSP文件,然後再編譯整個文件,必須保證新合成的JSP頁面符合JSP語法規則。使用include指令可以實現代碼的複用,有助於實現JSP頁面的模塊化。

<%@ include file=”header.inc”%>

taglib指令:首先要在WEB-INF/tags文件目錄下建立xxx.tag文件,tag文件的結構與JSP文件一樣,可以被JPS頁面動態加載調用,但是用戶不能通過該Tag文件所在的Web服務目錄直接訪問這個Tag文件,可實現代碼複用。注意,在Tag中<%! %>標記符號之間聲明的變量與JSP中<%! %>之間聲明的變量類似,其有效範圍是整個Tag文件,但每當Tag文件對應的字節碼被執行完畢後,這些變量即可釋放所佔用的內存空間。

 <%@ taglib uri/tagdir="/WEB-INF/tags自定義標記庫的位置" prefix="前綴" %>

<Tag: 文件名字/>

[ 標記體 ]   <!-- 在Tag文件中通過使用<jsp:doBody/>引用標記體傳遞來的信息 -->

<Tag: 文件名字/>

Tag標記中常用的指令有:tag、taglib、include、attribute、variable

<%@ tag body-content="empty" language="java" import="java.lang.*" pageEncoding="ISO-8859-1" />

body-content:確定JSP頁面使用Tag標記時是否可以有標記體,如果允許有標記體,則該屬性會給出標記體內的類型,值有:empty(沒有標記體)、tagdependent(標記體的內容按純文本處理)、scriptless(默認,標記體內不能有Java程序片)。

language:指定Tag文件所使用的腳本語言,該屬性的值目前只能取java。

import:同JSP的page指令的import屬性。

pageEncoding:指定Tag文件的字符編碼,默認爲ISO-8859-1。

<%@ taglib uri/tagdir="/WEB-INF/tags自定義標記庫的位置" prefix="前綴" %>

<%@ include file=”header.inc”%>

<%@ attribute name="xxxx" required="true | false" type="對象的類型" %>

在Tag文件中通過使用attribute指令,可以動態地向該Tag文件傳遞需要的數據,對象的類型必須帶有包名,默認爲java.lang.String;name爲<Tag 文件名字 對象名字="對象的引用"/>中的對象名字。

<@% variable name-given="對象名字" variable-class="對象的類型" scope="有效範圍" %>

jspContext.setAttribute("對象名字", "value");

通過使用variable指令Tag文件可以將數據的處理結果存放在某些對象中,並將這些對象返回給當前JSP頁面,由JSP頁面負責顯示這些對象,可以更好地實現數據處理和數據顯示分離。對象的類型必須帶有包名,默認爲java.lang.String;scope的值可以取:AT_BEGIN、NESTED、AT_END,說明JSP頁面可以在Tag標記的標記體中及結束後、標記體中、結束後使用該variable指令給出的對象。注意,JSP頁面中不可以再定義與Tag文件返回的對象具有相同名字的變量。

Tag標記的嵌套:當使用Tag標記時可以帶有標記體,而且標記體還可以是一個Tag標記。Tag標記中標記體由Tag文件是<jsp:doBody/>標記負責處理,而在Tag文件中,<jsp:doBody/>標記被替換成處理"標記體"後所得到的結果。

9. JSP的7種動作標記:forward, param, include, plugin,userBean, setProperty, getProperty

include動作標記:動態加載一個文件,與靜態插件文件的inclue指令不同,當JSP引擎把JSP頁面轉譯成Java文件時,不把JSP頁面中的動作指令所指定的文件與原JSP頁面合併爲一個新的JSP頁面,而是告訴Java解釋器,這個文件在JSP運行時才被處理。

<jsp:include page="文件的URL"flush="true"

[ <param name="屬性" value="值"/> ]

</jsp:include>

靜態導入與動態導入區別

①靜態導入是將被導入頁面的代碼完全融入,合成一個Servlet,而動態導入是在Servlet中使用include方法來引入被導入頁面的內容

②靜態導入時被導入頁面的編譯指令會起作用,而動態導入時被導入頁面的編譯指令則失去作用,只是插入被導入頁面的body內容

③動態導入還可增加額外的請求參數

param動作標記: 與include、、forward、plugin標記一起使用,用來傳參數,通過內置對象request調用getParameter("xxx')方法獲取參數。

<param name="屬性" value="值"/> 

forward動作標記:從該指令處停止當前頁面的繼續執行,而轉向執行page屬性指定的JSP頁面,地址欄用戶請求的URL不變。

<jsp:forward page="要轉向的頁面" >

[ <param name="屬性" value="值"/> ]

</jsp:forward >

plugin動作標記:指示JSP頁面加載Java Plugin插件,並使用該插件來運行Java Applet小應用程序。

<jsp:plugin type="bean | applet" 

code="小應用程序的字節碼文件" 

codebase="被執行文件所在的目錄"

name=”instanceName”      給該程序起一個名字用來標識該程序

archive=”URLToArchive”    指向一些要預先載入的將要使用到的類的路徑

align=”bottom|top|middle|left|right” 

width="小程序的寬度" 

height="小程序的高度"

hspace=”leftRightPixels”      顯示左右的留白

vspace=”topBottomPixels”     顯示上下的留白

jreversion="java虛擬機的版本號" 

nspluginurl=”URLToPlugin”      瀏覽器下載運行所需JRE的地址

iepluginurl=”URLToPlugin”      瀏覽器下載運行所需JRE的地址> 

<jsp:param name="xxx" value="xxx"> </jsp:params>

<jsp:fallback>提示信息:用來提示用戶的瀏覽器是否支持插件下載</jsp:fallback> 

</jsp:plugin>

useBean、setProperty、getProperty動作標記:在JSP頁面中使用bean,scope有取值有page、request、session、application,分別代表當前頁面、每個請求期間、用戶的會話期間(瀏覽器未關閉)、web目錄下的所有JSP頁面共享一個bean。

<jsp:useBean id="bean的id" class="創建bean的類" scope="bean的有效範圍"/>

<jsp:setProperty name=”BeanName” property=”PName”value=”value”/>

<jsp:getProperty name=” BeanName” property=” PName”/>
10. JSP的9個內置對象:application, config,exception,out, page, pageContext, request, response, session

















 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章