Servlet-jsp從入門到精通(四)

jsp(Java Server Pages)技術(shù)

簡(jiǎn)介

JSP是一種建立在Servlet規(guī)范功能之上的動(dòng)態(tài)網(wǎng)頁技術(shù)。也就是在網(wǎng)頁文件中嵌入java代碼和JSP標(biāo)記陕见,用于產(chǎn)生動(dòng)態(tài)內(nèi)容泣侮。 JSP文件在用戶第一次請(qǐng)求時(shí)即彪,會(huì)被編譯成Servlet,然后由這個(gè)Servlet處理用戶的請(qǐng)求活尊。

JSP的運(yùn)行機(jī)制

  1. JSP容器管理JSP頁面生命周期的兩個(gè)階段:

    • 翻譯階段:
      當(dāng)有一個(gè)對(duì)JSP頁面的客戶請(qǐng)求到來時(shí)隶校,JSP容器檢驗(yàn)JSP頁面的語法是否正確,將JSP頁面轉(zhuǎn)換為Servlet
      源文件 jsp--->java
    • 編譯階段:
      調(diào)用javac工具類編譯將Servlet源文件生成字節(jié)碼文件蛹锰。 java->class
      執(zhí)行階段:
      Servlet容器加載轉(zhuǎn)換后的Servlet類深胳,實(shí)例化一個(gè)對(duì)象處理客戶端的請(qǐng)求,在請(qǐng)求處理完成后铜犬,響應(yīng)對(duì)象被JSP容器接受舞终,容器將HTML格式的響應(yīng)信息發(fā)送到客戶端。 調(diào)用_jspService()
  2. 第一次加載JSP頁面時(shí)癣猾,因?yàn)橐獙SP文件轉(zhuǎn)換為Servlet類敛劝,響應(yīng)速度較慢,再次請(qǐng)求時(shí)纷宇,JSP容器就會(huì)直接執(zhí)行第一次請(qǐng)求時(shí)產(chǎn)生的Servlet攘蔽,不會(huì)重新轉(zhuǎn)換JSP文件,在JSP執(zhí)行期間呐粘,JSP容器會(huì)檢查JSP文件满俗,看是否有更新或修改,如果有作岖,JSP容器會(huì)再次編譯JSP或者Servlet唆垃,如果沒有更新或者修改,直接執(zhí)行前面產(chǎn)生的Servlet.

  3. JSP頁面轉(zhuǎn)換后的Servlet類必須實(shí)現(xiàn)javax.servlet.jsp.JspPage接口痘儡,絕大多數(shù)情況下辕万,JSP頁面都使用HTTP協(xié)議,所以在JSP頁面轉(zhuǎn)換后的Servlet類必須實(shí)現(xiàn)javax.servlet.jsp.HttpJspPage接口,該接口繼承自JspPage接口渐尿。

     _jspService(HttpServletRequest request, HttpServletResponse response);
     該方法用來處理業(yè)務(wù)邏輯醉途。
    

JSP語法

一個(gè)JSP頁面由元素和模板數(shù)據(jù)組成,元素是必須由JSP容器處理砖茸。元素有三種類型

指令元素隘擎,腳本元素,動(dòng)作元素凉夯。

  1. 腳本元素 :嵌套寫java代碼

    • 聲明(Declaration) (聲明各種變量货葬,方法和內(nèi)部類看生成的結(jié)果)

      • 語法: <%!聲明的內(nèi)容%>
      • 作用: 在servlet中聲明一些成員變量、成員方法和內(nèi)部類
      • 特點(diǎn): 聲明被翻譯進(jìn)servlet后變成了成員變量劲够、成員方法和內(nèi)部類
      • 注意: 不能使用表達(dá)式和隱含對(duì)象
    • 表達(dá)式(Expression)

      • 語法: <%=expression%>

      • 作用: 將expression輸出到out(輸出流)中震桶,

      • expression可以是算術(shù)、邏輯征绎、常量蹲姐、 關(guān)系表達(dá)式、變量人柿、有返回值的方法淤堵、jsp中的9種隱含對(duì)象。

      • 9種隱含對(duì)象:

        1. page:當(dāng)前的jsp頁面顷扩,指針this
        2. pageContext:當(dāng)前的jsp頁面的上下文
        3. request:封裝請(qǐng)求的信息
        4. response:封裝響應(yīng)
        5. session:會(huì)話
        6. application:指web應(yīng)用
        7. out:輸出流
        8. config:配置信息
        9. exception:異常信息。當(dāng)isErrorPage=true時(shí)慰毅,才可以使用該對(duì)象
          特點(diǎn): 表達(dá)式翻譯進(jìn)servlet后變成了out.print(expression),該代碼處于_jspService()方法中隘截。
          注意: expression都一律被轉(zhuǎn)換成字符串后再寫到輸出流out(JspWriter)中。另外汹胃,expression中不能有分號(hào)(;)婶芭。
    • 腳本(Scriptlet)
      * 語法: <%java code%>
      * 作用: 在jsp中嵌入java代碼,不能嵌入成員變量着饥、成員方法犀农。所以在此模塊申明的變量為局部變量。任何邏輯的代碼都可以放在腳本標(biāo)簽中宰掉。如for循環(huán),匿名內(nèi)部類,連接數(shù)據(jù)庫,創(chuàng)建對(duì)象等

      • 特點(diǎn): 腳本被翻譯進(jìn)servlet的_jspService()方法中呵哨。
  2. 指令元素:指令主要用來提供整個(gè)
    JSP網(wǎng)頁相關(guān)的信息,并且用來設(shè)定JSP頁面的相關(guān)屬性

    • page指令

      • 語法: <%@ page attributeName="attribuerValue"...%>

      • 作用: 利用page指令中的屬性可以和容器進(jìn)行通信轨奄,這些屬性的設(shè)置孟害,對(duì)整個(gè)jsp都有影響。

      • page指令中的屬性:

        1. language="java"
          定義當(dāng)前頁面使用的編程語言挪拟,目前只能是java
        2. contentType="text/html;charset=UTF-8"
          定義response中的內(nèi)容類型和編碼格式和jsp頁面的編碼格式挨务,翻譯后變成response.setContentType("text/html;charset=UTF-8")。
        3. pageEncoding="UTF-8"
          定義當(dāng)前jsp頁面的編碼格式
        4. isErrorPage="true|false" 默認(rèn)為false
          表明當(dāng)前的頁面是否為其它頁面的errorPage目標(biāo),如果設(shè)置為true谎柄,則可以使用exception對(duì)象丁侄。反之,如果設(shè)置為false朝巫,則不可以使用exception對(duì)象
        5. errorPage="error.jsp"
          默認(rèn)忽略,定義此頁面出現(xiàn)異常時(shí)調(diào)用的頁面
        6. import="package.class,package2.class2"
          和一般的java import意義一樣鸿摇,用","來隔開
        7. session="true|false" 默認(rèn)為true
          指定這個(gè)jsp中是否可以使用session
        8. buffer="none|8kb|sizekb" 默認(rèn)為8kb
          指定到客戶端輸出流的緩沖模式,如果是none則不緩沖捍歪,如果指定數(shù)值户辱,那么輸出就用不小于這個(gè)值的緩沖區(qū)進(jìn)行緩沖。
        9. autoFlush="true|false" 默認(rèn)為true
          true 當(dāng)緩沖區(qū)滿時(shí)糙臼,到客戶端的輸出被刷新
          false 當(dāng)緩沖區(qū)滿時(shí)庐镐,出現(xiàn)運(yùn)行異常,表示緩沖溢出
        10. isThreadSafe="true|false" 默認(rèn)為true
          用來設(shè)置jsp文件是否能支持多線程的使用变逃。如為true必逆,那么一個(gè)jsp能夠同時(shí)處理多個(gè)用戶的請(qǐng)求,反之揽乱,一個(gè)jsp只能一次處理一個(gè)請(qǐng)求名眉。
        11. info="text"
          關(guān)于jsp頁面的信息,定義一個(gè)字符串凰棉,可以使用getServletInfo()獲得
          l2. extends="package.class"
          指定jsp對(duì)應(yīng)的servlet類繼承某個(gè)父類
        12. isELIgnored="true|false"
          指定EL表達(dá)式語言是否被忽略损拢,如為true則忽略,反之可以使用EL撒犀。
    • include指令

      • 語法: <%@ include file="url"%>福压,稱為靜態(tài)導(dǎo)入(靜態(tài)包含)
        • 作用: 在一個(gè)頁面中導(dǎo)入另一個(gè)頁面的內(nèi)容(這些內(nèi)容一般不會(huì)有變化,如公司的標(biāo)題和版權(quán)等信息)或舞。

        • 特點(diǎn): 在jsp翻譯成servlet后就將被導(dǎo)入的頁面內(nèi)容嵌入到servlet中荆姆。導(dǎo)入時(shí)間發(fā)生在翻譯階段。被導(dǎo)入的資源:html映凳、xml胆筒、jsp等

        • 優(yōu)點(diǎn): 執(zhí)行效率高(只翻譯一次)

        • 缺點(diǎn): 當(dāng)被導(dǎo)入頁面的內(nèi)容發(fā)生變化,那么jsp必須要重新被翻譯诈豌。如果導(dǎo)入的多個(gè)頁面仆救,其中的一個(gè)頁面的內(nèi)容發(fā)生變化,就需要將所有的頁面都翻譯一次矫渔。

              static {
               _jspx_dependants = new java.util.ArrayList(1);
              _jspx_dependants.add("/day10/static.jsp");
              }
          
    • taglib指令
      <%@ taglib uri="" prefix=""%>
      例如: 導(dǎo)入jstl標(biāo)簽庫
      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
      指定在jsp中要使用的標(biāo)簽庫描述文件(*.tld)的路徑

  3. 動(dòng)作元素(jsp自帶的標(biāo)準(zhǔn)標(biāo)簽)
    語法: <jsp:tagName/>

  • 動(dòng)態(tài)導(dǎo)入(動(dòng)態(tài)包含)
    • 語法:
      <jsp:include page="url" flush="true|false"/>
      或者
      <jsp:include page="url" flush="true|false">
      {<jsp:param …/>}*
      </jsp:include>

    • 特點(diǎn): 動(dòng)態(tài)導(dǎo)入發(fā)生在執(zhí)行階段派桩,也就是在運(yùn)行serlvet的時(shí)候才動(dòng)態(tài)生成被導(dǎo)入頁面的內(nèi)容,然后嵌入到調(diào)用頁面蚌斩,最后將兩個(gè)頁面的內(nèi)容一起铆惑,返回給客戶端范嘱。
      注意: 在翻譯階段并沒有生成被導(dǎo)入頁面的內(nèi)容。沒有跳轉(zhuǎn)员魏,請(qǐng)求還是同一個(gè)

    • 缺點(diǎn): 執(zhí)行效率沒有靜態(tài)導(dǎo)入高

    • 優(yōu)點(diǎn): 如果被導(dǎo)入頁面的內(nèi)容發(fā)生變化丑蛤,調(diào)用頁面不必重新翻譯。

      _jspService(){
          org.apache.jasper.runtime.JspRuntimeLibrary
              .include(request, response, "dynamic.jsp", out, false);
      }
      
  1. JSP隱含對(duì)象
    JSP容器生成的Servlet類的_jspService()方法中撕阎,定義的幾個(gè)對(duì)象我們可以在編寫JSP頁面時(shí)使用的隱含對(duì)象受裹。

  2. page: 當(dāng)前的jsp頁面,指針this

  3. pageContext: 當(dāng)前的jsp頁面的上下文

  4. request: 封裝請(qǐng)求的信息

  5. response: 封裝響應(yīng)

  6. session: 會(huì)話

  7. application: 指web應(yīng)用

  8. out: 輸出流

  9. config: 配置信息

  10. exception: 異常信息

其中pageContext 對(duì)象提供了以下方法:
訪問其他隱含對(duì)象的方法

  1. getRequest()
  2. getResponse()
  3. getSession()
  4. getServletContext()
  5. JspWriter getOut()
  6. getServletConfig()
  7. Object getPage()
  8. Exception getException()

還可以用來保存屬性虏束,但是只能在當(dāng)前頁面中獲取

  • setAttribute(String name,Object val);
  • Object getAttribute(String name);

還可以設(shè)置和得到其他范圍對(duì)象中保存的屬性

  • setAttribute(String name,Object val,int scope);

  • Object getAttribute(String name,int scope);

  • removeAttribute(String name,int scope)
    刪除指定范圍內(nèi)名字為name的屬性

  • removeAttribute(String name)
    刪除所有范圍內(nèi)名字為name的屬性

  • findAttribute(String name)
    該方法會(huì)按照page,request,session,application范圍順序搜索指定名字的屬性棉饶。

  • PageContext.PAGE_SCOPE 頁面范圍

  • PageContext.REQUEST_SCOPE 請(qǐng)求范圍

  • PageContext.SESSION_SCOPE 會(huì)話范圍

  • PageContext.APPLICATION_SCOPE 應(yīng)用程序范圍
    exception
    對(duì)象表示了JSP頁面運(yùn)行時(shí)產(chǎn)生的異常,該對(duì)象只有在錯(cuò)誤頁面(page指令中指定isErrorPage=true的頁面)中才可以使用镇匀。當(dāng)JSP頁面運(yùn)行發(fā)生錯(cuò)誤時(shí),JSP容器會(huì)自動(dòng)調(diào)用指定的錯(cuò)誤處理頁面照藻,如果JSP頁面使用errorPage屬性定義了錯(cuò)誤頁面,那么在web.xml文件中定義的任何錯(cuò)誤頁面將不會(huì)被使用

對(duì)象和范圍

在JSP中汗侵,有4中范圍

  • page范圍:
    具有page范圍的對(duì)象被綁定到j(luò)avax.servlet.jsp.PageContext對(duì)象中幸缕,在這個(gè)范圍中的對(duì)象,只能在創(chuàng)建對(duì)象的頁面中訪問晰韵。page范圍內(nèi)的對(duì)象发乔,在客戶端每次請(qǐng)求JSP頁面時(shí)創(chuàng)建,在頁面向客戶端發(fā)送回響應(yīng)或請(qǐng)求被轉(zhuǎn)發(fā)到其他資源后被刪除雪猪。
  • request范圍
    具有request范圍的對(duì)象被綁定到j(luò)avax.servlet.http.HttpServletRequest對(duì)象中栏尚。在調(diào)用forward()方法轉(zhuǎn)向的頁面或調(diào)用include()方法包含的頁面中,都可以訪問這個(gè)范圍內(nèi)的對(duì)象只恨。
  • session范圍
    具有session返回的對(duì)象被綁定到j(luò)avax.servlet.http.HttpSession對(duì)象中译仗,JSP容器為每次會(huì)話,創(chuàng)建一個(gè)HttpSession對(duì)象坤次,在會(huì)話期間,可以訪問session范圍內(nèi)的數(shù)據(jù)
  • application范圍
    具有application范圍的對(duì)象被綁定到j(luò)avax.servlet.ServletContext中斥赋,在web應(yīng)用程序運(yùn)行期間缰猴,所有頁面都可以訪問這個(gè)范圍內(nèi)的對(duì)象

serlvet-jsp從入門到精通(三)
serlvet-jsp從入門到精通(五)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市疤剑,隨后出現(xiàn)的幾起案子滑绒,更是在濱河造成了極大的恐慌,老刑警劉巖隘膘,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疑故,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡弯菊,警方通過查閱死者的電腦和手機(jī)纵势,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钦铁,你說我怎么就攤上這事软舌。” “怎么了牛曹?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵佛点,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我黎比,道長(zhǎng)超营,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任阅虫,我火速辦了婚禮演闭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘书妻。我一直安慰自己船响,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布躲履。 她就那樣靜靜地躺著见间,像睡著了一般。 火紅的嫁衣襯著肌膚如雪工猜。 梳的紋絲不亂的頭發(fā)上米诉,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音篷帅,去河邊找鬼史侣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛魏身,可吹牛的內(nèi)容都是我干的惊橱。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼箭昵,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼税朴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起家制,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤正林,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后颤殴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體觅廓,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年涵但,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杈绸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帖蔓。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蝇棉,靈堂內(nèi)的尸體忽然破棺而出讨阻,到底是詐尸還是另有隱情,我是刑警寧澤篡殷,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布钝吮,位于F島的核電站,受9級(jí)特大地震影響板辽,放射性物質(zhì)發(fā)生泄漏奇瘦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一劲弦、第九天 我趴在偏房一處隱蔽的房頂上張望耳标。 院中可真熱鬧,春花似錦邑跪、人聲如沸次坡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砸琅。三九已至,卻和暖如春轴踱,著一層夾襖步出監(jiān)牢的瞬間症脂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來泰國(guó)打工淫僻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诱篷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓雳灵,卻偏偏與公主長(zhǎng)得像棕所,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悯辙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

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

  • 1.什么是JSP (1)jsp全稱是Java Server Pages琳省,它和Servlet技術(shù)一樣都是sun公司定...
    yjaal閱讀 3,661評(píng)論 5 99
  • 1.學(xué)習(xí)內(nèi)容 JSP技術(shù)入門和常用指令 JSP的內(nèi)置對(duì)象&標(biāo)簽介紹 EL表達(dá)式&EL的內(nèi)置對(duì)象 2.JSP技術(shù)入門...
    WendyVIV閱讀 2,144評(píng)論 1 18
  • 一、JSP基礎(chǔ) 1.1什么是JSP JSP(Java ServerPage)是Java服務(wù)器端動(dòng)態(tài)頁面技術(shù)笑撞。是su...
    晨星資源閱讀 1,158評(píng)論 0 6
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法岛啸,類相關(guān)的語法钓觉,內(nèi)部類的語法茴肥,繼承相關(guān)的語法,異常的語法荡灾,線程的語...
    子非魚_t_閱讀 31,669評(píng)論 18 399
  • web技術(shù)的發(fā)展 早期的web應(yīng)用主要是靜態(tài)頁面的瀏覽瓤狐,這些靜態(tài)頁面使用HTML語言編寫瞬铸,放在服務(wù)器上,用戶使用瀏...
    清楓_小天閱讀 2,264評(píng)論 0 20