什么是jsp?
很久之前,我們的網(wǎng)頁都是靜態(tài)的,就是我們所看到的頁面在編寫好之后總是唯一的。后來有人便提出動態(tài)頁面的概念,相應(yīng)的就提出了Servlet。Servlet動態(tài)網(wǎng)頁技術(shù),是可以把Java語言嵌入到HTML頁面上。那時候Servlet是個大忙人,它既要處理顯示效果,又要處理數(shù)據(jù),又要處理頁面跳轉(zhuǎn),耦合度高,不方便代碼維護,為了解決這個問題,SUN公司聯(lián)合其他公司制定了JSP動態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)。事實上jsp是一個特殊的Servlet實例,它跟其他Servlet一樣被Servlet容器執(zhí)行,在這之前它需要先被jsp容器轉(zhuǎn)換成Servlet,這個過程是在服務(wù)器端產(chǎn)生的,在第一次編譯之后該Servlet實例便常駐內(nèi)存。
jsp的運行機制
- jsp容器判斷URL中對應(yīng)的Servlet實例是否存在Servlet隊列,實則執(zhí)行第五步,否則執(zhí)行第二步。
- jsp容器將jsp文件轉(zhuǎn)換成Servlet源程序(.java)。
- jsp容器將Servlet源程序編譯成字節(jié)碼文件(.class)。
- Servlet容器加載字節(jié)碼,創(chuàng)建該Servlet實例(該實例實際是返回給客戶端的顯示效果),此時會調(diào)用
jspInit()進行初始化。 - jsp容器將響應(yīng)返回到到客戶端。
jsp基本語法
注釋
注釋有以下兩種:
- HTML注釋:``,這種方法注釋在查看HTML源代碼時可以被顯示
- jsp注釋:
<%-- 注釋內(nèi)容 --%>,通過這種方法注釋用戶是看不到的
jsp指令
jsp指令有以下三種:
page指令
include指令
taglib指令
page指令page指令稱為頁面指令,用來定義jsp頁面的全局屬性。語法格式如下:
<%@ page [屬性="值" 屬性="值"]%>
比較重要的屬性有以下幾種:extends:指定jsp繼承的父類。
import:用于導(dǎo)入jsp需要的Java包。其中Java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*這幾個包本身已經(jīng)被導(dǎo)入,無需再導(dǎo)入。
session:指定該jsp頁面是否可用session對象。
isThreadSafe:指定該jsp頁面是否支持多線程。
info:設(shè)置頁面的相關(guān)信息。可以用
servlet.getServletInfo()獲取jsp頁面中的文本信息。Errorpage:當(dāng)jsp頁面出錯時,會調(diào)用該指令指定的錯誤處理頁面。
isErrorPage:指定jsp頁面能否進行異常處理。
contentType:指定頁面支持的編碼方式和響應(yīng)的MIMe類型。默認(rèn)為"text/html; charset = ISO-8859-1".
isELIgnored:指定是否支持EL表達式。
PS:導(dǎo)入多個包時用一個import指令,各個包之間用“,”隔開。
include指令include指令是加載文件指令,它在jsp被編譯前就將文件加載進jsp中合并成一個新的jsp文件,因此當(dāng)該文件改變時,jsp要重新被編譯一次。include指令的格式如下:
<%@ include file = "path"%>
該指令只有一個屬性file,該指令用于指向要加載的文件的相對地址。taglib指令taglib指令是用來引用標(biāo)簽庫并設(shè)置標(biāo)簽庫前綴,說白了就是自定義自己的jsp標(biāo)記。格式如下:
<%@ taglib uri="標(biāo)簽庫地址" prefix = "標(biāo)簽庫前綴" %>
使用標(biāo)記方式如下:
<標(biāo)簽庫前綴:標(biāo)簽名 參數(shù)>
jsp腳本元素
jsp腳本元素有以下三種:
jsp聲明語句
jsp表達式
jsp Scriptlets
jsp聲明語句
jsp聲明語句用于聲明變量和方法,在jsp聲明語句中聲明的變量和方法對作為servlet的成員變量,在整個頁面都有效。格式如下:
<%! 聲明變量或方法 %>jsp表達式
jsp表達式要求該表達式存在一個確定的值,該值會被顯示在HTML頁面上。格式如下:
<%= 表達式 %>jsp Scriptlets
jsp Scriptlets是一段java代碼段。當(dāng)需要對頁面輸出內(nèi)容進行一些復(fù)雜的操作的時候就需要用到j(luò)sp Scriptlets,在jsp Scriptlets聲明的變量在調(diào)用的時候分配內(nèi)存,調(diào)用結(jié)束內(nèi)存釋放。jsp Scriptlets格式如下:
<% java代碼片段 %>
jsp動作元素
jsp動作元素有以下幾種:
<jsp:include><jsp:forward><jsp:param><jsp:plugin><jsp:useBean><jsp:setProperty><jsp:getProperty>-
<jsp:include>是包含標(biāo)簽,它跟包含指令不一樣。包含指令是將包含頁面整合進jsp頁面中再編譯。而包含元素包含的文件和jsp文件是兩個獨立的文件,在運行時單獨對包含文件進行編譯,把結(jié)果發(fā)送到客戶端。只有在運行jsp頁面的時候才會加載這些包含文件。格式如下:
<jsp:include page="被包含的頁面" flush="true|false"></jsp:include>- page:是被包含的文件的相對地址。
- flush:指定當(dāng)緩沖區(qū)滿時,是否將其清空。默認(rèn)值為false。
<jsp:forward>是重定向標(biāo)簽,當(dāng)代碼運行到該標(biāo)簽會想客戶端發(fā)出響應(yīng),讓客戶端重新鏈接到指定的地址,之后的代碼不被執(zhí)行。格式如下:
<jsp:forward page="重定向的地址"></jsp:forward><jsp:param>是傳遞參數(shù)的標(biāo)簽。它是以"名-值"對的形式來表示參數(shù)的。格式如下:
<jsp:param name="參數(shù)名" value="參數(shù)值">向
<jsp:include>包含的文件傳遞參數(shù)
<jsp:include page="page name" flush="false">
<jsp:param name="parameter name" value="parameter value"></jsp:param>
...
</jsp:include>
- 向
<jsp:forward>頁面?zhèn)鬟f參數(shù)
<jsp:forward page="forward target">
<jsp:param name="parameter name" value="parameter value"></jsp:param>
...
</jsp:forward>
PS:
<jsp:param>傳遞的參數(shù)就會以“名-值”對的形式傳遞到調(diào)用它的頁面中,參數(shù)的調(diào)用方法跟調(diào)用成員變量一樣直接通過變量名調(diào)用。
-
<jsp:plugin>可以將服務(wù)器端的javaBean或Applet下載到本地客戶端執(zhí)行。語法格式如下:
<jsp:plugin type="bean|applet" code="classFileName" codeBase="classFileURL">
...
</jsp:plugin>
type:指定插件類型。是Bean還是Applet。
code:指定執(zhí)行的類名。必須以擴展名".class"結(jié)尾。
codeBase:指定被執(zhí)行的java類所在目錄。此外
<jsp:plugin>
相關(guān)的參數(shù)還有很多,這里只是舉例必不可少的三個。<jsp:useBean>用來裝載一個將在jsp頁面中使用額javaBean。語法格式如下:
<jsp:useBean id="beanInstanceName" class="className" scope="page|request|session|application"></jsp:useBean>
id:指定javaBean的實例名。
class:指定javaBean的全限類名。
-
scope:指定javaBean的作用域。
- page:指定javaBean實例只在本頁面有限。
- request:指定JavaBean實例僅在本次請求有效。
- session:指定javaBean實例在本次會話有效。
- application:指定javaBean實例在本應(yīng)用內(nèi)一直有效。
<jsp:setProperty>用于設(shè)置Bean內(nèi)屬性的值,它通過調(diào)用Bean的setter方法設(shè)置屬性值。語法格式如下:
<jsp:setProperty name="beanInstanceName" property="propertyName" value="propertyValue"></jsp:setProperty><jsp:getProperty>用于獲取bean的屬性值。語法格式如下:
<jsp:getProperty name="beanInstanceName" property="propertyName"></jsp:getProperty>
PS:bean中可以沒有屬性的聲明,但必須有setter和getter方法,因為
<jsp:getProperty>和<jsp:setProperty>是通過調(diào)用bean實例中的setter方法和getter方法實現(xiàn)取值和賦值工作的。
jsp內(nèi)置對象
jsp內(nèi)置對象由jsp規(guī)范進行初始化,主要有以下幾種:
request
response
pageContext
session
application
out
config
page
exception
-
request對象用于封裝請求數(shù)據(jù)。一般用戶在表單填寫的數(shù)據(jù)會被封裝成request對象,通過post方法傳遞給目標(biāo)頁面。request還相應(yīng)提供了一些方法用于訪問這些數(shù)據(jù)。主要方法有以下幾個:
-
void setAttribute(attributeName, attributeValue):用于設(shè)置屬性值。 -
Object getAttribute(attributeName, attributeValue):用于獲取屬性值。 -
String getParameter("parameterName"):獲取參數(shù)值。 -
Enumeration getParameterNames():獲取所有的參數(shù)名的集合。 -
String[] getParameterValues("parameterName"):獲取parameterName的所有屬性值的數(shù)組。 -
Map getParameterMap():獲取所有屬性名和屬性值的Map對象。 -
void setCharacterEncoding():設(shè)置編碼格式。
-
PS:setAttribute和getAttribute方法在轉(zhuǎn)發(fā)時使用,當(dāng)轉(zhuǎn)發(fā)一個頁面并傳遞參數(shù)時使用該方法設(shè)置和接受參數(shù);其他方法主要用于獲取表單數(shù)據(jù)。
-
response對象用于封裝響應(yīng)數(shù)據(jù),其作用域是本頁面。相關(guān)方法如下:
-
void addCookie(Cookie cookie):添加一個Cookie對象,用于在客戶端保存特定信息。 -
void addHeader(name, value):添加一個HTTP頭信息,該頭信息會被發(fā)送到客戶端。 -
void containsHeader(name):判斷是否含有名為"name"的頭信息。 -
void sendError(int):向客戶端發(fā)送錯誤的狀態(tài)碼。 -
void sendRedirect(url):向客戶端發(fā)送重定向的url鏈接,讓客戶端跳轉(zhuǎn)到該鏈接。 -
void setContentType(contentType):設(shè)置MIME類型和編碼方式。 - pageContext對象不僅可以設(shè)置page范圍的屬性,還可以設(shè)置其他范圍內(nèi)的屬性。通過pageContext可以訪問request、response、out等對象。
-
-
session對象是會話對象,用來記錄每個客戶端的訪問狀態(tài)。session對象主要方法如下:
-
Object getAttribute(name):獲取session范圍內(nèi)名為name的屬性值。 -
void setAttribute(name, value):設(shè)置session范圍內(nèi)的屬性。 -
void removeAttribute(name):刪除session范圍內(nèi)名為name的屬性。 -
Enumeration getAttributeNames():獲取session中保存的所有屬性名。 -
long getCreationTime():返回session被創(chuàng)建的時間。 -
String getId():返回session被創(chuàng)建時jsp容器分配的唯一標(biāo)識。 -
long getLastAccessedTime():返回最后一次通過session發(fā)送請求的時間。 -
int getMaxInactiveInterval():返回session的失效時間,即兩次請求間隔多長時間該session被取消,單位為秒。 -
boolean isNew():判斷是否是新的session。 -
void invalidate():清空session內(nèi)容。
-
application對象用于獲取和設(shè)置servlet相關(guān)信息,application的生命周期是從服務(wù)器啟動直到服務(wù)器關(guān)閉。主要方法如下:
void setAttribute(name, value):以"鍵-值"對的形式將一個對象的值存入application對象中。Object getAttribute(name):獲取application中保存的屬性的值。-
out對象是一個緩沖的輸出流,用來向客戶端返回信息。由于向客戶端輸出信息總是要連接,所以向客戶端輸出總是采用緩沖的形式。主要方法有以下幾個:
-
public abstract void clear() throws java.io.IOException:清除緩沖區(qū)的內(nèi)容,但不將緩沖區(qū)的內(nèi)容輸出到客戶端。 -
public abstract void clearBuffer() throws java.io.IOException:清除緩沖區(qū)的內(nèi)容,且將緩沖區(qū)的內(nèi)容輸出到客戶端。 -
public abstract void close() throws java.io.IOException:關(guān)閉輸出流并輸出緩沖區(qū)的數(shù)據(jù)。 -public abstract void flush() throws java.io.IOException:輸出緩沖區(qū)的數(shù)據(jù)。 -
public int getBufferSize():獲取緩沖區(qū)大小。 -
public abstract int getRemaining():獲取剩余緩沖區(qū)大小。 -
public boolean isAutoFlush():緩沖區(qū)是否進行自動清除。 -
public abstract void newLine() throws java.io.IOException:輸出一個換行符。 -
public abstract void print(String) throws java.io.IOException:打印信息。 -
public abstract void println(String) throws java.io.IOException:打印信息并換行。
-
-
config對象是ServletConfig類的一個實例,在servlet初始化時可以通過config對象想servlet傳遞信息。config常用的方法如下:
-
String getServletName():獲得servlet名稱。 -
ServletContext getServletContext():獲得一個包含服務(wù)器相關(guān)信息的ServletContext對象。 -
String getInitParameter(name):獲得servlet初始化參數(shù)。 -Enumeration getInitParameterNames():獲得servlet初始化時所有參數(shù)的名字的枚舉對象。
-
-
page對象是指當(dāng)前的jsp頁面本身,他是java.lang.Object類的對象,通過page對象可以很方便地調(diào)用servlet中定義的方法。常用方法如下:
-
class getClass():返回當(dāng)前的類名。 -
int getHashCode():返回當(dāng)前類的哈希碼。 -
String toString():將此對象轉(zhuǎn)換成字符串。 -
boolean equals(object):比較兩個對象是否是相等。 -
void copy(object):將該對象復(fù)制到指定的object對象中。
-
-
exception對象java.lang.Throwable類的對象,用來處理頁面錯誤和異常。常用方法如下:
-
String getMessage():返回異常對象的異常信息。 -
String getLocalizedMessage():返回本地化語言的異常信息。 -
void printStackTrace():打印異常的棧反向追蹤痕跡。 -
String toString():返回異常的簡單描述。
-
PS:使用異常對象時,應(yīng)將page的isErrorPage屬性設(shè)置為"true"。
javaBean的使用
javaBean是java語言描述的軟件組件模型,其實際是一個java對象,通過將業(yè)務(wù)邏輯和對數(shù)據(jù)庫的相關(guān)操作封裝成javaBean對象,實現(xiàn)了java代碼的復(fù)用,節(jié)省了程序員大量的寶貴時間。
javaBean的語法特征
- JavaBean是一個public類。
- JavaBean應(yīng)當(dāng)包含一個無參的構(gòu)造函數(shù)。
- JavaBean獲取或設(shè)置參數(shù)的方式都必須用標(biāo)準(zhǔn)的getter或setter函數(shù),對于布爾型的屬性可以用isXxx()方法。