JSP運(yùn)行規(guī)則:先轉(zhuǎn)化成Java文件,然后編譯成class文件,最后才可以執(zhí)行。
了解了servlet之后,好多JSP的知識(shí)可以從JSP翻譯后的Java文件中看出。
JSP頁(yè)面轉(zhuǎn)化為Java文件后所在的位置:
Eclipse的工作目錄下的
.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\Demo0808\org\apache\jsp
介紹下我自己的Java學(xué)習(xí)群:548511899,不管你是小白還是大牛,小編我都挺歡迎,不定期分享干貨,包括我自己整理的一份2017最新的Java資料和零基礎(chǔ)到學(xué)成出山的全套教程,歡迎所有喜歡Java的小伙伴。
JSP中的代碼片段,翻譯到Servlet的方法中,所以可以寫Java方法中允許的代碼,
不能寫訪問標(biāo)識(shí)符等在方法中都不允許的代碼。
腳本中的代碼要保持結(jié)構(gòu)完整,可以分開寫到兩個(gè)腳本中,比如:
<% for(int I = 0; I < 10; I ++){ %> hello <% } %>
Java片段翻譯為Servlet的時(shí)候是按照從上向下的順序的。
JSP注釋:在JSP源碼界面可見,Java文件中不可見,頁(yè)面源碼中不可見。
HTML注釋:在各個(gè)界面都可見。
Java注釋,只有在頁(yè)面源碼中不可見
1.page指令
language屬性:指示當(dāng)前的JSP頁(yè)面會(huì)被翻譯成何種語(yǔ)言。
ContentType:指定瀏覽器的編碼方式,瀏覽器使用。
pageEncoding:指定當(dāng)前頁(yè)面的編碼方式,供瀏覽器使用。
autoFlush:是否自動(dòng)刷新,默認(rèn)true.
errorPage:當(dāng)前頁(yè)面發(fā)生錯(cuò)誤后,轉(zhuǎn)發(fā)到的頁(yè)面,地址欄不變化。
buffer:緩沖的大小
isErrorPage:指定當(dāng)前頁(yè)面是否為錯(cuò)誤頁(yè)面,默認(rèn)是false,此時(shí)內(nèi)置對(duì)象Exception不可用。true的時(shí)候才可以使用。
isELIgnored:是否忽略El表達(dá)式,默認(rèn)不忽略。
2.include靜態(tài)加載。
被包含頁(yè)面的代碼完全加到目標(biāo)頁(yè)面中,轉(zhuǎn)化為Java文件的時(shí)候只轉(zhuǎn)化目標(biāo)頁(yè)面,被包含頁(yè)面在Java文件中也有輸出。
file屬性
最終會(huì)被翻譯成Java代碼執(zhí)行。(Java學(xué)習(xí)交流群 548511899)
1.forword標(biāo)簽:
只有page屬性。此時(shí)路徑是相對(duì)于服務(wù)器端的。轉(zhuǎn)發(fā)。 這個(gè)標(biāo)簽可以訪問WEB-INF目錄下的文件 不帶參數(shù)其實(shí)標(biāo)簽和結(jié)束標(biāo)簽不可以分開。 可以通過param傳遞參數(shù)。
2.include標(biāo)簽:
和指令相比,為動(dòng)態(tài)包含,被包含界面和杰界面都生成Java文件和class文件
3.tablib標(biāo)簽
引入jstl時(shí)使用
pageContext(page域):作用范圍是整個(gè)JSP頁(yè)面,是四大作用域中最小的一個(gè);生命周期是當(dāng)對(duì)JSP的請(qǐng)求時(shí)開始,當(dāng)響應(yīng)結(jié)束時(shí)銷毀。
Request:作用范圍是整個(gè)請(qǐng)求鏈(請(qǐng)求轉(zhuǎn)發(fā)也存在);生命周期是在service方法調(diào)用前由服務(wù)器創(chuàng)建,傳入service方法。整個(gè)請(qǐng)求結(jié)束,request生命結(jié)束。
Session:作用范圍是一次會(huì)話。
servletContext(application域):作用范圍是整個(gè)Web應(yīng)用。當(dāng)Web應(yīng)用被加載進(jìn)容器時(shí)創(chuàng)建代表整個(gè)web應(yīng)用的ServletContext對(duì)象,當(dāng)服務(wù)器關(guān)閉或Web應(yīng)用被移除時(shí),ServletContext對(duì)象跟著銷毀。
四個(gè)域的作用域范圍大小:PageContext (page域) < request < session < servletContext(application域)
sp
1 什么是JSP
Java Server Pages : Java服務(wù)器端頁(yè)面,也和Servlet一樣,用于動(dòng)態(tài)web技術(shù)!
最大的特點(diǎn):
寫Jsp就像寫HTML
區(qū)別:
HTML只給用戶提供靜態(tài)的數(shù)據(jù)
JSP頁(yè)面中可以嵌套Java代碼,為用戶提供動(dòng)態(tài)數(shù)據(jù)
2 jSP原理
思路: JSP到底怎么執(zhí)行的!
代碼層面沒有任何問題
服務(wù)器內(nèi)部 工作
tomcat 中有一個(gè)work目錄
idea中使用tomcat會(huì)在idea中產(chǎn)生一個(gè)work目錄
這個(gè)是 idea tomcat的工作空間
路徑:
瀏覽器向服務(wù)器發(fā)送請(qǐng)求,不管訪問什么資源,起始都是在訪問Servlet
JSP最終也會(huì)被轉(zhuǎn)換成為一個(gè)Java類
JSP本質(zhì)上就是一個(gè)Servlet
1.判斷請(qǐng)求
2.內(nèi)置對(duì)象
3.輸出頁(yè)面前增加的代碼
以上的這些個(gè)對(duì)象我們可以在JSP頁(yè)面中直接使用
jsp原理圖
在JSP頁(yè)面中;
只要是Java代碼就會(huì)原封不動(dòng)的輸出
如果是HTML代碼,就會(huì)被轉(zhuǎn)換
這樣的格式,輸出到前端
3 JSP基礎(chǔ)語(yǔ)法
任何語(yǔ)言都有自己的語(yǔ)法,Java中有,JSP作為Java技術(shù)的一種應(yīng)用,它擁有一些自己的擴(kuò)容的語(yǔ)法,Java所有語(yǔ)法都支持
JSP表達(dá)式
述(最多18字
jsp 腳本片段
腳本片段的實(shí)現(xiàn)
JSP聲明
JSP聲明: 會(huì)被編譯到JSP生成Java類中! 其他的,就會(huì)被生成到 _jspService 方法中
在JSP中嵌入Java代碼即可
jsp的注釋,不會(huì)在客戶端顯示,HTML就會(huì)
4 JSP指令
總結(jié):
在實(shí)際開發(fā)中建議使用 下面 jsp:include/的方式
如果使用上面那一種的話 如果在header.jsp或者在footer.jsp中聲明了 int a=1; 又在當(dāng)前jsp中聲明了相同的變量 在jsp頁(yè)面不會(huì)報(bào)錯(cuò),去了瀏覽器里面 就報(bào)錯(cuò)了。
所以建議使用 jsp標(biāo)簽 進(jìn)行頁(yè)面拼接
5 九大內(nèi)置對(duì)象
>PageContext 存東西
>Request 存東西
>Response
>Session 存東西
>Application 【ServletContext 】 存東西
>config 【ServletConfig】
>out
>page
>exception
equest:客戶端向服務(wù)器發(fā)送請(qǐng)求,產(chǎn)生的數(shù)據(jù),用戶看完了就沒作用了,比如:新聞 用戶看完了沒作用了。
session:客戶端向服務(wù)器發(fā)送請(qǐng)求,產(chǎn)生的數(shù)據(jù),用戶用完了一會(huì)還有用,比如:購(gòu)物車;
application:客戶端向服務(wù)器發(fā)送請(qǐng)求,產(chǎn)生的數(shù)據(jù),一個(gè)用戶用完了,其他用戶還可能使用:比如:聊天數(shù)據(jù)
6 JSP標(biāo)簽 JSTL標(biāo)簽 EL表達(dá)式
開始之前導(dǎo)入所學(xué)的依賴
EL表達(dá)式: ${ }
>獲取數(shù)據(jù)
>執(zhí)行運(yùn)算
>獲取web開發(fā)的常用對(duì)象
JSP 標(biāo)簽
發(fā)送:
接收:
JSTL 表達(dá)式
JSTL表達(dá)式的使用就是為了彌補(bǔ)HTML標(biāo)簽的不足;它自定義許多標(biāo)簽,供我們使用,標(biāo)簽的功能和Java代碼一樣
核心標(biāo)簽
JSTL 標(biāo)簽庫(kù)使用步驟
引入對(duì)應(yīng)的taglib
使用其中的方法
在Tomcat也需要引入jstl的包,否則會(huì)報(bào)錯(cuò)
c:if
c:choose c:when
c:forEach
天千鋒廣州小編就給大家分享零基礎(chǔ)如何掌握J(rèn)SP技術(shù),下面一起來看看吧!
一、Java初級(jí)開發(fā)之jsp概述
1.關(guān)于jsp
JavaServer Pages簡(jiǎn)稱jsp,從“server”這個(gè)詞可以看出,這其實(shí)也是一門java服務(wù)端技術(shù),其實(shí)可以簡(jiǎn)單的把jsp認(rèn)為是servlet,一點(diǎn)錯(cuò)也沒有。Jsp的實(shí)質(zhì),就是客戶端需要的資源是通過jsp技術(shù)動(dòng)態(tài)生成的。
2.jsp的技術(shù)原理
1)當(dāng)客戶端在訪問一個(gè)jsp資源時(shí),服務(wù)器上有相應(yīng)的servlet來負(fù)責(zé)jsp資源,那么該servlet將會(huì)把jsp頁(yè)面翻譯成一個(gè)servlet,然后執(zhí)行該servlet的service方法。
2)服務(wù)器將jsp翻譯成java程序(就是一個(gè)Servlet),然后執(zhí)行該Servlet的service方法,在方法內(nèi)部動(dòng)態(tài)地向客戶端寫html代碼。
因此jsp就是一個(gè)servlet,也就是jsp頁(yè)面將被翻譯成servlet
3.jsp與servlet的選擇
jsp就是servlet,那么如果碰到需要寫繁多的html代碼,建議使用jsp,如果需要寫繁多的java代碼,建議使用servlet。
?二、JSP技術(shù)詳解
1.JSP腳本
就是怎樣在jsp頁(yè)面中使用java代碼,使用了腳本的地方,就不會(huì)作為輸出流的內(nèi)容,而是作為java代碼來執(zhí)行。使用方式有三種:
1) <% java代碼 %>
jav代碼會(huì)被作為程序的一部分來執(zhí)行,而不會(huì)被翻譯成out.write(),這是常用的。
2) <% java代碼 %>
會(huì)被翻譯成 out.print(java代碼)
3) <% java代碼 %>
聲明成員變量。
4)jsp的注釋方式
· html的注釋:
用戶看得到,程序員也看得到
· java的注釋:// 單行注釋 /多行注釋/
用戶看不到,但是會(huì)被翻譯
· jsp的注釋:
用戶看不到,不會(huì)被翻譯,只有程序員在寫jsp頁(yè)面時(shí)才看得到。
2.三大指令
1)page指令
page指令是用于告訴服務(wù)器該如何翻譯此jsp頁(yè)面。通過page指令的屬性來指明翻譯的效果。
· language: 指的是jsp頁(yè)面支持哪種語(yǔ)言,只支持java,所以該屬性可以省略
· pageEncoding和contentType寫一個(gè)就行,建議使用pageEncoding,更加簡(jiǎn)單
· session:默認(rèn)值是true,默認(rèn)情況下服務(wù)器會(huì)為該頁(yè)面開辟一個(gè)session空間
· import:用于導(dǎo)入該頁(yè)面中的java類需要用到的包
· errorPage:當(dāng)發(fā)生錯(cuò)誤時(shí)跳轉(zhuǎn)到的資源,注意,該地址是一個(gè)服務(wù)器地址。
· isErrorPage:默認(rèn)值是false。當(dāng)在web.xml中配置錯(cuò)誤頁(yè)面時(shí),需要將該jsp頁(yè)面的isErrorPage設(shè)為true.
404
/error.jsp
總結(jié):一般情況下,page指令就這么寫即可:
2)include指令:靜態(tài)包含,file屬性使用的是服務(wù)器地址。
include指令是用于在一個(gè)jsp頁(yè)面中包含另一個(gè)jsp頁(yè)面,兩個(gè)頁(yè)面組合成一個(gè)頁(yè)面發(fā)送給客戶端。
所謂的靜態(tài)包含,在翻譯時(shí)是把被包含的jsp頁(yè)面寫給客戶端。那么此時(shí)客戶端拿到的是兩套html標(biāo)簽。
3)taglib指令:標(biāo)簽庫(kù)
taglib指令用于引入第三方標(biāo)簽庫(kù),通過taglib指令中的prefix指明前綴,通過前綴來使用第三方標(biāo)簽庫(kù)中的標(biāo)簽
3.四大域?qū)ο?(jsp有四個(gè),servlet有三個(gè)(request,session,servletContext))
1) pageContext
(1)pageContext作為域?qū)ο?/p>
· 描述當(dāng)前page的上下文。那么pageContext對(duì)象是一個(gè)域?qū)ο螅^域?qū)ο螅褪翘峁┝艘粋€(gè)區(qū)域,用來存儲(chǔ)數(shù)據(jù)。因此當(dāng)前的page就能向pageContext對(duì)象中存儲(chǔ)數(shù)據(jù).
pageContext域?qū)ο蟮淖饔梅秶寒?dāng)前page(頁(yè)面)
setAttribute(String key,Object value);
getAttribute(String key);
removeAttribute(String key);
· 向其他域?qū)ο笾胁僮鲾?shù)據(jù).
pageContext.setAttribute(String key,Object value, int scope);向其他域?qū)ο笾写嬷?/p>
pageContext.getAttribute(String key, int scope);向其他域?qū)ο笾腥≈?/p>
pageContext.removeAttribute(String key, int scope);向其他域?qū)ο笾幸瞥?/p>
int scope來自于PageContext類的常量
REQUEST_SCOPE: 表示request域
SESSION_SCOPE: 表示session域
APPLICATION_SCOPE: 表示application域
· findAttribute(String key):Object :這是通過鍵,向所有域中搜索數(shù)據(jù)。
搜索的順序:
pageContext->request->session->application
(2)可以通過pageContext對(duì)象來獲取其他八個(gè)內(nèi)置對(duì)象
通過pageContext的get*()來獲得。
2)request
作用范圍:一次請(qǐng)求
3)session
作用范圍:一次會(huì)話
4)application
作用范圍:當(dāng)前web應(yīng)用
4.九大內(nèi)置對(duì)象
所謂的內(nèi)置對(duì)象,即在jsp頁(yè)面的腳本中能直接使用的java對(duì)象。
· out: 輸出流
當(dāng)通過out的write()寫內(nèi)容時(shí),實(shí)際是往out的緩沖區(qū)(默認(rèn)大小是8kb)中去寫,有兩種情況導(dǎo)致緩沖區(qū)的內(nèi)容會(huì)沖刷進(jìn)底層的輸出流中
1)out對(duì)象被銷毀
2)out的緩沖區(qū)不夠用了。其實(shí)我們可以設(shè)置out緩沖區(qū)的大小。如果緩沖區(qū)是0kb,那么out就把內(nèi)容直接寫到response緩沖區(qū)中。
· page:this,表示當(dāng)前的Servlet對(duì)象
· pageContext:重點(diǎn),表示當(dāng)前page的上下文對(duì)象,也是一個(gè)域?qū)ο?/p>
· session:當(dāng)jsp頁(yè)面的page指令的session屬性為true時(shí),才會(huì)有session對(duì)象
· request:
· response
· exception 當(dāng)jsp頁(yè)面的page指令的isErrorPage屬性為true時(shí),才會(huì)有exception對(duì)象
· application: 實(shí)際就是ServletContext對(duì)象
· config:實(shí)際就是ServletConfig對(duì)象
5.Jsp標(biāo)簽
1) jsp:include
動(dòng)態(tài)包含:在一個(gè)頁(yè)面中包含另一個(gè)頁(yè)面的內(nèi)容
和靜態(tài)的區(qū)別:
靜態(tài)包含會(huì)在翻譯的過程中直接翻譯被包含的頁(yè)面,被包含的頁(yè)面不會(huì)產(chǎn)生java文件。
而動(dòng)態(tài)包含會(huì)在翻譯的過程中只翻譯自己頁(yè)面的內(nèi)容,被包含的頁(yè)面的翻譯交給相應(yīng)的類來完成,被包含的頁(yè)面會(huì)產(chǎn)生java文件,實(shí)際開發(fā)中更加常用動(dòng)態(tài)包含。
2)jsp:forward
請(qǐng)求轉(zhuǎn)發(fā),與servlet中的請(qǐng)求轉(zhuǎn)發(fā)的效果一致。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。