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