日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Java Web(五) JSP详解(四大作用域九大内置对象等)

發(fā)布時(shí)間:2023/12/10 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java Web(五) JSP详解(四大作用域九大内置对象等) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

    前面講解了Servlet,了解了Servlet的繼承結(jié)構(gòu),生命周期等,并且在其中的ServletConfig和ServletContext對(duì)象有了一些比較詳細(xì)的了解,但是我們會(huì)發(fā)現(xiàn)在Servlet中編寫一些HTML代碼,是很不方便的一件事情,每次都需要out.println(HTML); 因此就出現(xiàn)了JSP,來(lái)解決這樣的問(wèn)題,JSP中的內(nèi)容就是html,但是能夠嵌套java語(yǔ)言,現(xiàn)在來(lái)詳細(xì)了解一下JSP。

                                  --WZY

一、JSP

    1、什么是JSP?

       JSP(Java Server Pages):是以Java語(yǔ)言為基礎(chǔ)的動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā)技術(shù),

       特點(diǎn):

          Servlet特點(diǎn):在Java源碼中嵌入html源碼

          JSP特點(diǎn):在html源碼中嵌入java代碼

       JSP就是Servlet

          1、tomcat獲得JSP文件后,先將JSP轉(zhuǎn)成servlet,變成xxx.java(servlet源碼),

            D:\java\tomcat7.0\apache-tomcat-7.0.53\apache-tomcat-7.0.53\work\Catalina\localhost\test01\org\apache\jsp

          |------------------------------------------------------------------------|   |---------|----------|-------|-----------------|

                tomcat安裝目錄                        引擎   主機(jī)  項(xiàng)目   固定包名  這個(gè)之下就是存放著jsp變成的servlet文件.java和編譯文件.class 

          2、tomcat將java文件編譯成class文件

             

          3、tomcat運(yùn)行class文件,并將結(jié)果輸出到瀏覽器,

?

       實(shí)例:

          創(chuàng)建一個(gè)jsp。查看其轉(zhuǎn)換后的servlet代碼。

          NewFile.jsp          

?View Code

          NewFile_jsp.java          

?View Code

            可以看到public final class?NewFile_jsp?extends?org.apache.jasper.runtime.HttpJspBase?implements org.apache.jasper.runtime.JspSourceDependent

            NewFile_jsp.java繼承自HttpJspBase。來(lái)看看HttpJspBase的源碼

          HttpJspBase.java         

?View Code

          public abstract class?HttpJspBase?extends?HttpServlet?implements HttpJspPage

            看到了一個(gè)熟悉的類,HttpServlet,我們編寫Servlet時(shí)就是繼承自該類,這里也是繼承HttpServlet,并且HttpJspBase的源碼會(huì)發(fā)現(xiàn),生命周期也是有init()方法,service()方法,destory()方法,相當(dāng)于_jspService()方法就是servlet的service()方法的執(zhí)行,所以說(shuō)JSP也是一個(gè)servlet。

        

          我們?cè)贘SP寫的所有html代碼,都會(huì)被轉(zhuǎn)換為servlet中的out.write(html)代碼來(lái)輸出。看圖

              

?

?

       小總結(jié):

              

           對(duì)于jsp轉(zhuǎn)換成的servlet源碼,之后我們會(huì)在進(jìn)行詳細(xì)分析,現(xiàn)在只需要知道jsp中的內(nèi)容在servlet中被轉(zhuǎn)換成什么了,在哪里被轉(zhuǎn)換了即可。其中_jspService()方法的詳細(xì)內(nèi)容下面會(huì)講解

           注意:jsp 生成java源碼,默認(rèn)第一次生成,之后直接執(zhí)行,除非內(nèi)容修改,具體點(diǎn)說(shuō),由于JSP只會(huì)在客戶端第一次請(qǐng)求的時(shí)候被編譯,因此第一次請(qǐng)求JSP時(shí)會(huì)感覺(jué)比較慢,而之后的請(qǐng)求因?yàn)椴粫?huì)編譯JSP,所以速度就快多了,如果將Tomcat保存的JSP編譯后的class文件刪除,Tomcat也會(huì)重新編譯JSP。在開(kāi)發(fā)Web程序的時(shí)候經(jīng)常需要修改JSP,Tomcat能夠自動(dòng)檢測(cè)到JSP程序的改動(dòng),如果檢測(cè)到JSP源代碼發(fā)生了改動(dòng),Tomcat會(huì)在下次客戶端請(qǐng)求JSP時(shí)重新編譯JSP,而不需要重啟Tomcat,這種自動(dòng)檢測(cè)功能默認(rèn)是開(kāi)啟的,檢測(cè)改動(dòng)會(huì)消耗少量的時(shí)間,在部署web應(yīng)用程序的時(shí)候可以在web.xml中將它關(guān)掉。這也就是為什么我們能夠在jsp頁(yè)面直接修改內(nèi)容,而不用重新啟動(dòng)服務(wù)器的原因。

           因?yàn)镴SP就是servlet,那么生命周期也就是跟serlvet一樣。

           JSP和servlet有一點(diǎn)區(qū)別就在于:jsp是先部署后編譯,而servlet是先編譯后部署。

?

二、JSP語(yǔ)法

?    JSP模版數(shù)據(jù):

        就是JSP中的HTML代碼,它的內(nèi)容給是固定的,無(wú)論程序如何運(yùn)行模版數(shù)據(jù)輸出到客戶端瀏覽器時(shí)都不會(huì)發(fā)生改變,當(dāng)我們創(chuàng)建一個(gè)JSP時(shí),模版就已經(jīng)固定了。

     元素:JSP中的java部分,包括腳本(JavaScript,或者java代碼)以及JSP指令(Directive)與JSP標(biāo)簽(Tag)等,元素決定著程序的流程,元素是不會(huì)顯示到瀏覽器的。這幾個(gè)都會(huì)在接下來(lái)講解到

    ?JSP腳本:

        1、使用<% 編寫java代碼 %>,中間java代碼必須遵循Java語(yǔ)法,

            

           為什么能夠使用out輸出?這里就涉及到了JSP的九大內(nèi)置對(duì)象了,后面會(huì)講解到,到時(shí)候回過(guò)頭來(lái)在看看這里,就會(huì)知道為什么可以使用。

           來(lái)看看,jsp變?yōu)閟ervlet時(shí)的代碼是如何編寫的。

            

          在JSP中JSP指令(后面會(huì)講):

                <%@ page language="java"?contentType="text/html; charset=UTF-8"?pageEncoding="UTF-8"%>

                  這句代碼在servlet就變?yōu)榱?/p>

                response.setContentType("text/html; charset=UTF-8");//這句代碼的意思就是通知tomcat和瀏覽器都使用UTF-8碼表,并且發(fā)送回瀏覽器的數(shù)據(jù)類型是text/html。這是有JSP指令中畫(huà)紅色部分代碼轉(zhuǎn)變的,而指令中的pageEncoding="UTF-8"的意思是JSP轉(zhuǎn)換為Servlet時(shí)采用UTF-8碼表編碼,因?yàn)榭赡躂SP中包含中文。

          對(duì)于JSP模版數(shù)據(jù)來(lái)說(shuō),就原封不動(dòng)的使用out.write()來(lái)輸出到瀏覽器

          而對(duì)于JSP元素來(lái)說(shuō),就會(huì)變成普通的java代碼,因?yàn)樵趕ervlet中,就可以直接編寫java代碼。

                        

       2、使用<%=xxx %>來(lái)輸出結(jié)果

            

          使用<%=result %>來(lái)輸出結(jié)果,servlet中就會(huì)將其轉(zhuǎn)換為out.print(result)進(jìn)行輸出。輸出各種類型數(shù)據(jù):int、double、boolean、String、Object等

              

       3、JSP注釋

          <%-- --%>  :jsp注釋,

          //  :java單行注釋

          /*? */  :Java多行注釋

          <!-- -->?  :這個(gè)注釋,會(huì)發(fā)送到瀏覽器端的源碼中顯示

          注釋分別在servlet中如何顯示的?

              

            

              

          JSP注釋不會(huì)在servlet文件中顯示,而java注釋則會(huì),但其所有的注釋到了瀏覽器端,都不會(huì)出現(xiàn)在源碼中,只有<!-- -->這個(gè)注釋會(huì)到瀏覽器的網(wǎng)頁(yè)源碼中去

?

      4、JSP中申明方法與屬性(全局變量)  使用<%!? 方法、屬性%>

          這個(gè)就不演示了,就是在JSP中編寫方法或者屬性時(shí),使用<%! %>括起來(lái)。

              

?     ?5、在JSP中使用if語(yǔ)句,或者使用for循環(huán),whilt循環(huán)等都可以實(shí)現(xiàn),也就是編寫腳本而已。     

?

三、JSP指令

?    指令用來(lái)申明JSP頁(yè)面的一些屬性,比如編碼方式,文檔類型。我們?cè)趕ervlet中也會(huì)申明我們使用的編碼方式和響應(yīng)的文檔類型的,而JSP就是用指令來(lái)申明。上面我們也說(shuō)到了一條指令,也就是page指令,

        JSP指令格式:<%@ directive {attribute=value}* %>

           解釋:

              directive:指令名稱,例如page指令

              attribute=value:緊跟指令名稱后面的就是各種屬性,以鍵值對(duì)的形式書(shū)寫

              *:代表后面能跟0個(gè)或多個(gè)屬性。

        例如:?page指令:用來(lái)聲明JSP頁(yè)面的屬性等。

           <%@ page language="java"?contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  page指令,后面跟著三個(gè)屬性,分別是language、contentType、pageEncoding。這只是其中的幾個(gè)屬性,并沒(méi)有寫全,page指令允許的屬性如下表所示

        屬性名稱        取值范圍          描述

        language        java      解釋該JSP文件時(shí)采用的語(yǔ)言,一般為java語(yǔ)言,默認(rèn)為java

        extends        任何類的全名   編譯該JSP文件時(shí)繼承哪個(gè)類,JSP為Servlet,因此當(dāng)指明繼承普通類時(shí)需要實(shí)現(xiàn)Servlet的init、destroy等方法

        import         任何包名、類名  引入該JSP中用到的類、包等,import是唯一可以聲明多次的page指令屬性,一個(gè)import可以引用uogelei,中間用英文逗號(hào)隔開(kāi),

                              如<%@ page import="java.util.List,java.util.ArrayList"%>

        session        true、false    該JSP內(nèi)是否內(nèi)置Session對(duì)象,如果為true,則內(nèi)置Session對(duì)象,可直接使用,否則反之,默認(rèn)為true

        autoFlush       true,false    是否運(yùn)行緩存,如果為true,則使用out.println()等方法輸出的字符串并不是立刻到達(dá)客戶端服務(wù)器的,而是暫時(shí)存到緩存里,緩存滿

                             了或者程序執(zhí)行完畢或者執(zhí)行out.flush()操作時(shí)才到客戶端,默認(rèn)為true。

        buffer        none或者數(shù)字KB   指定緩存大小,當(dāng)autoFlush設(shè)為true時(shí)有效,例如<%@ page buffer=10kb%>

        isThreadSafe      true,false    是否線程安全,如果為true,則運(yùn)行多個(gè)線程同時(shí)運(yùn)行該jsp程序,否則只運(yùn)行一個(gè)線程,其余線程等待,默認(rèn)為false

        isErrorPage      true,false     指定該頁(yè)面是否為錯(cuò)誤顯示頁(yè)面,如果為true,則該JSP內(nèi)置有一個(gè)Exception對(duì)象exception,可直接使用,否則沒(méi)有,默認(rèn)為false

        errorPage     某個(gè)JSP頁(yè)面的相對(duì)路徑  指明一個(gè)錯(cuò)誤頁(yè)面,如果該JSP程序拋出一個(gè)未捕捉的異常,則轉(zhuǎn)到errorPage指定的頁(yè)面,errorPage指定的頁(yè)面通常

                               isErrorPage屬性為true,且內(nèi)置的exception對(duì)象為未捕捉的異常

        contentType     有效的文檔類型    客戶端瀏覽器根據(jù)該屬性判斷文檔類型,例如 HTML格式為text/html、純文本格式為text/plain、JPG圖像為image/jpeg、GIF圖                              像為image/gif、WORD文檔為application/msword,該屬性常跟著charset設(shè)置編碼一起,作用是通知服務(wù)器和瀏覽器都使用同一                              個(gè)碼表

        info          任意字符串      指明JSP的信息,該信息可以通過(guò)Servlet.getServletInfo()方法獲取到

    trimDirective Whitespaces    true、false     是否去掉指令前后的空白字符,默認(rèn)為false

        pageEncoding    UTF-8,ISO-8859-1等    指定一張碼表來(lái)對(duì)該JSP頁(yè)面進(jìn)行編碼,

        

      include指令

          比較簡(jiǎn)單,只有一種形式?<%@ include file="relativeURL"%>  relativeURL:本應(yīng)用程序內(nèi)另一個(gè)JSP文件或者HTML文件的路徑,例如,網(wǎng)址內(nèi)所有頁(yè)面均有一個(gè)統(tǒng)一風(fēng)格的導(dǎo)航欄和頁(yè)腳版權(quán),那么就可以使用該指令將其包含進(jìn)來(lái),  

          特點(diǎn):include指令會(huì)將包含頁(yè)面的源代碼添加到使用include指令的頁(yè)面中來(lái),然后編譯成class文件,而等下會(huì)講到的一個(gè)JSP行為,<jsp:include page="relativeURL">作用跟include指令一樣,但是不同的是,include行為是運(yùn)行時(shí)單獨(dú)執(zhí)行包含頁(yè)面,然后把執(zhí)行的結(jié)果包含到本頁(yè)面來(lái),屬于先運(yùn)行后包含。

      taglib指令

          JSP支持標(biāo)簽技術(shù),后面會(huì)講到標(biāo)簽的用法,jstl標(biāo)簽庫(kù)的使用等,

          作用:用來(lái)指明JSP頁(yè)面內(nèi)使用的JSP標(biāo)簽庫(kù),taglib指令有兩個(gè)屬性,uri為類庫(kù)的地址,prefix為標(biāo)簽的前綴

          <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

?      

四、JSP行為

?    前面講了JSP語(yǔ)法,介紹了JSP頁(yè)面中的內(nèi)容有哪些,分別有什么作用,就兩個(gè)東西,模塊數(shù)據(jù)和元素。其中元素有包括腳本,指令,標(biāo)簽,腳本就是JSP中嵌入java代碼,指令作用就是申明頁(yè)面的屬性,那標(biāo)簽是干嘛的,標(biāo)簽分為JSP自帶內(nèi)置的標(biāo)簽,和通過(guò)taglib指令來(lái)使用JSP標(biāo)簽庫(kù),或者自定義標(biāo)簽。現(xiàn)在我們先來(lái)講一些JSP內(nèi)置的標(biāo)簽。

    ?JSP內(nèi)置的標(biāo)簽就被稱為JSP行為(JSP Actions)。只要書(shū)寫很少的標(biāo)記代碼就能使用JSP提供的豐富功能,JSP行為其實(shí)是對(duì)常用的JSP功能的抽象與封裝,可以取代jsp腳本,讓JSP中就少一些嵌入java代碼的地方。

      格式:<jsp:elements {attribute="value"}* />  

          jsp:標(biāo)簽的前綴,說(shuō)明是jsp內(nèi)置的標(biāo)簽,

          elements:行為的名稱,

          attribute=value:使用鍵值對(duì)來(lái)編寫屬性

          *:能指定0個(gè)或多個(gè)屬性對(duì)

    <jsp:include />行為

       include行為用于運(yùn)行時(shí)包含某個(gè)文件,如果被包含的文件為JSP程序,則先會(huì)執(zhí)行JSP程序,然后在把執(zhí)行的結(jié)果包含進(jìn)來(lái)。 作用是跟include指令一樣的,唯一的區(qū)別就在于,include指令是將被包含的文件的源碼加入到了本JSP程序中,然后在進(jìn)行編譯,屬于靜態(tài)包含,而include行為只是將被包含的文件的運(yùn)行結(jié)果包含進(jìn)自己。屬于動(dòng)態(tài)包含

          

    Java bean行為

       是一組與Java Bean 相關(guān)的行為,包括useBean行為、setProperty行為、getProperty行為等

       Java Bean就是普通的Java類,也被稱為POJO,只有私有的屬性與對(duì)應(yīng)的getter方法和setter方法,注意其中當(dāng)私有的屬性為boolean類型時(shí),習(xí)慣上一般把getter方法寫成isXxx();而不是getXxx();

       useBean行為  

          <jsp:useBean id="beanObject" class="className" scope="Value">  作用:在jsp中定義一個(gè)java bean對(duì)象,   

             id:指明Java Bean對(duì)象的名稱,JSP中可以使用該名稱引用該Java Bean對(duì)象,相當(dāng)于給new出來(lái)的對(duì)象取一個(gè)變量名,

             class:Java Bean類的全名

             scope:該java bean對(duì)象的作用范圍,可以寫的就四個(gè),也就是JSP的四大作用域,page、request、session、application

                  page:只能在當(dāng)前JSP頁(yè)面使用,如果不在JSP頁(yè)面,那么就會(huì)失效

                  request:這個(gè)前面學(xué)過(guò),A頁(yè)面請(qǐng)求轉(zhuǎn)發(fā)到B頁(yè)面,那么使用的是同一個(gè)request,那么A,B頁(yè)面都算是request的作用域,也就是通過(guò)請(qǐng)求轉(zhuǎn)發(fā)的頁(yè)面都是其作                       用域

                  session:該作用域在一個(gè)web項(xiàng)目下任何位置應(yīng)該讀訪問(wèn)的到,只要cookie不關(guān)閉,并且cookie設(shè)置  的訪問(wèn)路徑為"/",

                  application:其實(shí)就是Servlet中的servletContext,服務(wù)器下的所有項(xiàng)目都能訪問(wèn)到。

       setProperty行為

          <jsp:setProperty name="beanName" property="propertyName" value="">

            對(duì)Java Bean對(duì)象進(jìn)行屬性的設(shè)置

            name:java bean對(duì)象的名稱,也就是在useBean行為中的id

            property:對(duì)象中的屬性名,

            value:要對(duì)其屬性進(jìn)行賦值的值

              

       getProperty行為

          <jsp:getProperty name="beanName" property="propertyName" />

            獲取JavaBean對(duì)象的某個(gè)屬性值

            name:java bean 對(duì)象的名稱,也就是在useBean行為中的id

            property:對(duì)象的屬性名

      例子:  javabean:User.java  NewFile.jsp

      User.java

?View Code

      NewFile.jsp

?View Code

      可以查看NewFile.jsp變?yōu)閟ervlet后的源代碼,看看我們寫的javabean行為會(huì)被轉(zhuǎn)換為何種語(yǔ)句

          

      這里出現(xiàn)了一個(gè)JSP九大內(nèi)置對(duì)象中的一個(gè),pageContext。現(xiàn)在簡(jiǎn)單提一句,pageContext就是JSP頁(yè)面的管理者(上下文),其中的getAttribute(name,scope)方法是獲取指定作用域中的數(shù)據(jù)的,如果getAttribute(name)方法的話,默認(rèn)是對(duì)page作用域進(jìn)行操作,findAttribute(name)依次從page、request、session、application獲得內(nèi)容。 

      在第一個(gè)紅框中,就代表中我們的useBean行為,其中進(jìn)行了一次判斷,就是如果在page作用域中找不到user這個(gè)對(duì)象,那么就創(chuàng)建一個(gè)新的,否則就使用找到的這個(gè)user對(duì)象,

      第二個(gè)紅框中,代表著我們的setProperty行為,先找到user對(duì)象,然后在對(duì)其屬性進(jìn)行賦值

      第三個(gè)紅框中,代表著我們的getProperty行為,也是先找到user對(duì)象,然后在獲取其屬性的值。

?

      注意:對(duì)于javabean行為來(lái)說(shuō),有一個(gè)特點(diǎn)的地方,就是當(dāng)請(qǐng)求過(guò)來(lái)的參數(shù)對(duì)應(yīng)javabean的屬性時(shí),可以為其一次性設(shè)置所有的值

          <jsp:setProperty name="user" property="*" /> //設(shè)置user的所有屬性,屬性值從request中自動(dòng)取得,*代表所有屬性。

        

    <jsp:forward />行為

      實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)功能,Servlet中通過(guò)request.getRequestDispatcher("someServlet").forward(request,response);而在JSP中也能夠?qū)崿F(xiàn)相同的功能,只不過(guò)用的是<jsp:forward />行為,實(shí)際上forward行為就是對(duì)其進(jìn)行了封裝。

      格式:

        <jsp:forward page="someServlet">

           <jsp:param name="param1" value="value1"/>

           <jsp:param name="param2" value="value2"/>

        </jsp:forward>

        page:需要跳轉(zhuǎn)到的頁(yè)面或者servlet、 <jsp:param/>參數(shù)行為,帶一些參數(shù)過(guò)去,name、value是以鍵值對(duì)的形式帶過(guò)去的

      例如:

         NewFile.jsp

               

         MyServlet.java

           

         訪問(wèn):http://localhost:8080/test01/NewFile.jsp

           

          瀏覽器地址欄沒(méi)有改變,說(shuō)明是請(qǐng)求轉(zhuǎn)發(fā)

         NewFile_jsp.java

          

          使用return的好處是執(zhí)行完上面的轉(zhuǎn)發(fā),就直接return,沒(méi)有必要在執(zhí)行下面的代碼了,對(duì)參數(shù)使用了URLEncode進(jìn)行編碼,說(shuō)明該<jsp:param/>可以直接傳遞中文,但是前提是要設(shè)置request.setCharacterEncoding("UTF-8");為什么這樣做,看上面框起來(lái)中的代碼。

?

    <jsp:directive/>行為

       directive行為,就相當(dāng)于JSP指令,比如<jsp:directive.page/>相當(dāng)于<%@ page %>指令,等等其它指令是一樣的書(shū)寫格式。        

?

五、JSP隱藏的九大內(nèi)置對(duì)象和四大作用域

?    之前那么一大段內(nèi)容,就是為了講解什么是JSP,JSP中的內(nèi)容是怎么樣的,到這里應(yīng)該知道的差不多了, 但我們還要深入了解一些東西,我們知道JSP中的內(nèi)容就只有兩種,模版數(shù)據(jù),和元素,元素就包括了指令呀,腳本呀,標(biāo)簽(行為)呀,腳本會(huì)慢慢被標(biāo)簽全部代替,也就是說(shuō)JSP中基本上不會(huì)嵌入Java代碼,但是我們也知道JSP會(huì)轉(zhuǎn)換為servlet,在Servlet中,輸出數(shù)據(jù)時(shí),都需要通過(guò)response.getWrite();但是在JSP中,直接使用out對(duì)象進(jìn)行輸出,為什么呢?這就是因?yàn)閛ut為JSP的一個(gè)隱藏對(duì)象,JSP中內(nèi)置了9個(gè)隱藏對(duì)象,使得JSP比Servlet使用起來(lái)更簡(jiǎn)單,更方便,

    page、config、application、request、response、session、out、exception、pageContext

      page:page對(duì)象代表當(dāng)前JSP頁(yè)面,是當(dāng)前JSP編譯后的Servlet類的對(duì)象。相當(dāng)于this。

      config:標(biāo)識(shí)Servlet配置,類型:ServletConfig,api跟Servlet中的ServletConfig對(duì)象是一樣的,能獲取該servlet的一些配置信息,能夠獲取ServletContext

      application:標(biāo)識(shí)web應(yīng)用上下文,類型:ServletContext,詳情就看Servlet中的ServletContext的使用

      request:請(qǐng)求對(duì)象,  類型:httpServletRequest

      response:響應(yīng)對(duì)象  類型:httpServletResponse

      session:表示一次會(huì)話,在服務(wù)器端記錄用戶狀信息的技術(shù)

      out:輸出響應(yīng)體 類型:JspWriter

      exception 表示發(fā)生異常對(duì)象,類型 Throwable,在上面我們介紹page指令中的一個(gè)errorPage屬性時(shí)就有說(shuō)到他

      pageContext:表示 jsp頁(yè)面上下文(jsp管理者) 類型:PageContext

     標(biāo)記了紅色的對(duì)象就是JSP獨(dú)有的,其他的都是Servlet中的老東西。

      

      在這個(gè)由jsp轉(zhuǎn)換為servlet的文件中,只能看到8個(gè)內(nèi)置對(duì)象,少了exception對(duì)象,因?yàn)槲覀冊(cè)趯age指令時(shí),說(shuō)過(guò)一個(gè)isErrorPage屬性,默認(rèn)是false,被關(guān)閉了,所以其中并沒(méi)有exception對(duì)象。

     JSP的四大作用域:page、request、session、application

      ? 這四大作用域,其實(shí)就是其九大內(nèi)置對(duì)象中的四個(gè),為什么說(shuō)他們也是JSP的四大作用域呢?因?yàn)檫@四個(gè)對(duì)象都能存儲(chǔ)數(shù)據(jù),比如request.setAttribute()注意和request.setParameter()區(qū)分開(kāi)來(lái),一個(gè)是存儲(chǔ)在域中的、一個(gè)是請(qǐng)求參數(shù),session.setAttribute()、application其實(shí)就是SerlvetContext,自然也有setAttribute()方法。而page作用域的操作就需要依靠pageContext對(duì)象來(lái)進(jìn)行了。在上面我們也有提到JSP的四大作用域,

        page作用域:代表變量只能在當(dāng)前頁(yè)面上生效

        request:代表變量能在一次請(qǐng)求中生效,一次請(qǐng)求可能包含一個(gè)頁(yè)面,也可能包含多個(gè)頁(yè)面,比如頁(yè)面A請(qǐng)求轉(zhuǎn)發(fā)到頁(yè)面B

        session:代表變量能在一次會(huì)話中生效,基本上就是能在web項(xiàng)目下都有效,session的使用也跟cookie有很大的關(guān)系。一般來(lái)說(shuō),只要瀏覽器不關(guān)閉,cookie就會(huì)一直生效,cookie生效,session的使用就不會(huì)受到影響。

        application:代表變量能一個(gè)應(yīng)用下(多個(gè)會(huì)話),在服務(wù)器下的多個(gè)項(xiàng)目之間都能夠使用。比如baidu、wenku等共享帳號(hào)。

     out對(duì)象:

        類型:JspWriter

        jsp 輸出底層使用 response.getWriter();什么意思呢?這里就要講解一下JSP緩存和Servlet緩存了,輸出的過(guò)程是這樣的

                 

        JSP頁(yè)面轉(zhuǎn)換為Servlet后,使用的out對(duì)象是JspWriter類型的,所以是會(huì)先將要發(fā)送的數(shù)據(jù)存入JSP輸出緩存中,然后,等JSP輸出緩存滿了在自動(dòng)刷新到servlet輸出緩存,等serlvet輸出緩存滿了,或者程序結(jié)束了,就會(huì)將其輸出到瀏覽器上。除非手動(dòng)out.flush()。

        驗(yàn)證servlet輸出緩存和JSP輸出緩存和我們上面所說(shuō)的是正確的。

            

            ?

          分析:如果按沒(méi)有jsp緩存和servlet緩存的話,輸出的結(jié)果應(yīng)該是aaaabbbbcccc,但是輸出的卻是bbbbaaaacccc,為什么呢?按照我們上面所說(shuō)的原理進(jìn)行分析,out對(duì)象是先將其輸出到JSP緩存中,所以aaaa加入了jsp緩存,而response.getWriter().print("bbbb")是直接將bbbb輸出到servlet緩存中,然后又使用out對(duì)象將cccc輸出到j(luò)sp緩存,到程序結(jié)束,servlet緩存中有bbbb,然后jsp會(huì)將緩存中的內(nèi)容就刷新到servlet緩存中,serlvet就是bbbbaaaacccc了,然后到瀏覽器也就得到我們的輸出結(jié)果了。如果在12行將注釋去掉,那么輸出的結(jié)果又會(huì)是什么呢?答案就是aaaabbbbcccc,過(guò)程自行分析。

            

?

     pageContext對(duì)象:重點(diǎn)

        這個(gè)功能就比較強(qiáng)大了,比較牛逼,基本上什么他都有,因?yàn)槭撬荍SP頁(yè)面的管理者(上下文),所以JSP中的內(nèi)置對(duì)象呀,它統(tǒng)統(tǒng)能夠獲得,下面介紹它的api。

        1、獲得其它八大內(nèi)置對(duì)象 getXxx()

          pageContext.getOut();  //獲得out對(duì)象

          pageContext.getApplication();  //獲得application對(duì)象

          等等....

        2、對(duì)作用域的屬性進(jìn)行操作(四大作用域)

          對(duì)默認(rèn)作用域的屬性進(jìn)行操作。page

          pageContext.getAttribute(name);  //獲得page作用域數(shù)據(jù)

          pageContext.setAttribute(name,value);  //給page作用域設(shè)置內(nèi)容

          pageContext.removeAttribute(name);  //給page作用域移除內(nèi)容

        3、對(duì)指定作用域的屬性進(jìn)行操作

          getAttribute(name,scope);  //獲得 指定作用域中的數(shù)據(jù)

          setAttribute(name,value);  //給指定作用域設(shè)置內(nèi)容

          removeAttribute(name ,scope)? 移除指定作用域的內(nèi)容(page/request/session/application)

        4、提供作用域常量

          PageContext.PAGE_SCOPE  page

          PageContext.REQUEST_SCOPE  request      

          PageContext.SESSION_SCOPE  response

          PageContext.APPLICATION_SCOPE  application

        5、一次獲得指定名稱內(nèi)容

          findAttribute(name);  //依次從page、request、session、application 獲得內(nèi)容

?

     response對(duì)象:

        就是響應(yīng)對(duì)象,、如果不了解就看看講解request和response的這一章節(jié)的內(nèi)容

?

     config對(duì)象:

        類型:ServletConfig

        能夠獲取servlet的初始化參數(shù),獲取servletContext對(duì)象,獲取servletName

        api詳情請(qǐng)看講解servlet這一章節(jié)

?

     exception異常對(duì)象:

        包含了異常的信息

        使用它,必須結(jié)合page指令中的isErrorPage屬性和errorPage屬性。

        exception.jsp  拋異常的一個(gè)NullPointException,并且跳轉(zhuǎn)到error.jsp錯(cuò)誤顯示頁(yè)面  errorPage屬性的意思是如果發(fā)生未捕捉到的異常,將會(huì)跳轉(zhuǎn)到error.jsp頁(yè)面

            

        error.jsp  isErrorPage屬性說(shuō)明該頁(yè)面是一個(gè)錯(cuò)誤顯示頁(yè)面,則可以使用exception對(duì)象

            

        訪問(wèn)http://localhost:8080/test01/exception.jsp

            

六、總結(jié)

    通過(guò)上面一大堆一大堆的學(xué)習(xí),我們應(yīng)該知道這些東西

    1、什么是JSP?

      JSP本質(zhì)上就是一個(gè)servlet,因?yàn)閟ervlet輸出html太麻煩了,所以就有了JSP,JSP就是專門用來(lái)書(shū)寫html的,當(dāng)然其中也能寫java代碼。

    2、JSP的內(nèi)容包括什么?

      模版數(shù)據(jù)和元素。其中元素有包括腳本(java代碼)、指令(頁(yè)面屬性)、和行為(標(biāo)簽,為了JSP中不嵌入那么多java代碼衍生的)

    3、JSP中九大內(nèi)置對(duì)象是哪九個(gè)?

      九大內(nèi)置對(duì)象,page、config、appliction、request、response、session、out、exception、pageContext

    4、九大內(nèi)置對(duì)象和servlet中對(duì)象的關(guān)系

      page就是jsp轉(zhuǎn)換為servletservlet對(duì)象本身,也就是this

      config -- Servlet中的servletConfig

      application -- Servlet中的ServletContext

      request  -- Servlet中的request

      response  -- Servlet中的response

      session  -- Servlet中的session    

      out  -- JspWriter

      exception  -- 異常對(duì)象

      pageContext  --?表示 jsp頁(yè)面上下文(jsp管理者) 類型:PageContext,

        其中pageContext對(duì)象最牛逼,有了他就擁有了天下,哈哈~

   5、JSP中的四大作用域。

      page、request、session、application

      其中操作page域中屬性需要借助pageContext對(duì)象。

   6、JSP中還有其他兩大塊內(nèi)容

      一個(gè)是EL表達(dá)式,很重要,

      另一個(gè)是jstl標(biāo)簽庫(kù)的使用,也很重要,在接下來(lái)的兩節(jié)中,就會(huì)講解到。敬請(qǐng)期待。

?

總結(jié)

以上是生活随笔為你收集整理的Java Web(五) JSP详解(四大作用域九大内置对象等)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。