jsp詳解

什么是jsp?

很久之前混埠,我們的網(wǎng)頁都是靜態(tài)的怠缸,就是我們所看到的頁面在編寫好之后總是唯一的。后來有人便提出動態(tài)頁面的概念钳宪,相應(yīng)的就提出了Servlet揭北。Servlet動態(tài)網(wǎng)頁技術(shù)扳炬,是可以把Java語言嵌入到HTML頁面上。那時候Servlet是個大忙人搔体,它既要處理顯示效果恨樟,又要處理數(shù)據(jù),又要處理頁面跳轉(zhuǎn)疚俱,耦合度高厌杜,不方便代碼維護(hù),為了解決這個問題计螺,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的運行機制

  1. jsp容器判斷URL中對應(yīng)的Servlet實例是否存在Servlet隊列圈纺,實則執(zhí)行第五步,否則執(zhí)行第二步麦射。
  2. jsp容器將jsp文件轉(zhuǎn)換成Servlet源程序(.java)蛾娶。
  3. jsp容器將Servlet源程序編譯成字節(jié)碼文件(.class)。
  4. Servlet容器加載字節(jié)碼潜秋,創(chuàng)建該Servlet實例(該實例實際是返回給客戶端的顯示效果),此時會調(diào)用jspInit()進(jìn)行初始化蛔琅。
  5. 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頁面能否進(jìn)行異常處理。

  • contentType:指定頁面支持的編碼方式和響應(yīng)的MIMe類型邢锯。默認(rèn)為"text/html扬蕊; charset = ISO-8859-1".

  • isELIgnored:指定是否支持EL表達(dá)式。

PS:導(dǎo)入多個包時用一個import指令丹擎,各個包之間用“,”隔開尾抑。

  • include指令include指令是加載文件指令,它在jsp被編譯前就將文件加載進(jìn)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表達(dá)式

  • jsp Scriptlets

  • jsp聲明語句
    jsp聲明語句用于聲明變量和方法抗悍,在jsp聲明語句中聲明的變量和方法對作為servlet的成員變量,在整個頁面都有效钳枕。格式如下:
    <%! 聲明變量或方法 %>

  • jsp表達(dá)式
    jsp表達(dá)式要求該表達(dá)式存在一個確定的值缴渊,該值會被顯示在HTML頁面上。格式如下:
    <%= 表達(dá)式 %>

  • jsp Scriptlets
    jsp Scriptlets是一段java代碼段鱼炒。當(dāng)需要對頁面輸出內(nèi)容進(jìn)行一些復(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)簽俐巴,它跟包含指令不一樣。包含指令是將包含頁面整合進(jìn)jsp頁面中再編譯硬爆。而包含元素包含的文件和jsp文件是兩個獨立的文件,在運行時單獨對包含文件進(jìn)行編譯擎鸠,把結(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í)行的類名滔迈。必須以擴(kuò)展名".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ī)范進(jìn)行初始化,主要有以下幾種:

  • 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ū)是否進(jìn)行自動清除。
    • 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()方法。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蝙斜,一起剝皮案震驚了整個濱河市名惩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孕荠,老刑警劉巖娩鹉,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異岛琼,居然都是意外死亡底循,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門槐瑞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熙涤,“玉大人,你說我怎么就攤上這事困檩§舸欤” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵悼沿,是天一觀的道長等舔。 經(jīng)常有香客問我,道長糟趾,這世上最難降的妖魔是什么慌植? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮义郑,結(jié)果婚禮上蝶柿,老公的妹妹穿的比我還像新娘。我一直安慰自己非驮,他們只是感情好交汤,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著劫笙,像睡著了一般芙扎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上填大,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天戒洼,我揣著相機與錄音,去河邊找鬼允华。 笑死施逾,一個胖子當(dāng)著我的面吹牛敷矫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汉额,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼榨汤!你這毒婦竟也來了蠕搜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤收壕,失蹤者是張志新(化名)和其女友劉穎妓灌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜜宪,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡虫埂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了圃验。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掉伏。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖澳窑,靈堂內(nèi)的尸體忽然破棺而出斧散,到底是詐尸還是另有隱情,我是刑警寧澤摊聋,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布鸡捐,位于F島的核電站,受9級特大地震影響麻裁,放射性物質(zhì)發(fā)生泄漏箍镜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一煎源、第九天 我趴在偏房一處隱蔽的房頂上張望色迂。 院中可真熱鬧,春花似錦薪夕、人聲如沸脚草。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馏慨。三九已至,卻和暖如春姑隅,著一層夾襖步出監(jiān)牢的瞬間写隶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工讲仰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慕趴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像冕房,于是被迫代替她去往敵國和親躏啰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 前面講了servlet入門實踐現(xiàn)在開始介紹jsp入門實踐耙册,開發(fā)環(huán)境的搭建請參考我前面的tomcat的文章给僵,jsp入...
    伊豚wall閱讀 3,371評論 2 56
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法详拙,內(nèi)部類的語法帝际,繼承相關(guān)的語法,異常的語法饶辙,線程的語...
    子非魚_t_閱讀 31,663評論 18 399
  • JSP(Java Server Pages)蹲诀,其根本是一個簡化的 Servlet 設(shè)計,實現(xiàn)了在 Java 當(dāng)中使...
    靜候那一米陽光閱讀 470評論 0 1
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,814評論 0 11
  • 丑奴兒·思夫山湖畔處 【作者】霍錦威 【朝代】21st 白發(fā)盡識愁滋味弃揽?厭上新舟脯爪。 厭上新舟。為守舊念強棄優(yōu)蹋宦。 孤...
    霍錦威Focus閱讀 258評論 0 4