JavaWeb之JSP

概念:
1)JSP(Java Server Page)是Java服務(wù)器端動態(tài)頁面技術(shù)。是sun公司制訂的一種服務(wù)器端的動態(tài)頁面生成技術(shù)規(guī)范。

2)為什么要使用JSP:因?yàn)橹苯邮褂肧ervlet,雖然也可以生成動態(tài)頁面。但是,編寫繁瑣(需要使用out.println來輸出),并且維護(hù)困難(如果頁面發(fā)生了改變,需要修改Java代碼),所以sun指定了JSP規(guī)范。

3)與Servlet的關(guān)系:JSP其實(shí)是一個(gè)以.jsp為后綴的文件,容器會自動將.jsp文件轉(zhuǎn)換成一個(gè).java文件(其實(shí)就是一個(gè)Servlet),然后調(diào)用該Servlet。所以,從本質(zhì)上講,JSP其實(shí)就是一個(gè)Servlet。

4)編寫:
① 創(chuàng)建一個(gè)以“.jsp”為后綴的文件。
②在該文件里面,可以添加如下的內(nèi)容:
—> HTML(CSS、JS):直接寫即可
—> Java代碼:
形式一:Java代碼片段:<% Java代碼 %>
形式二:JSP表達(dá)式:<%= Java表達(dá)式 %>
形式三:JSP聲明:<%! %>
③指令:通知容器,在將.jsp文件轉(zhuǎn)換成.java文件時(shí),作一些額外的處理,比如導(dǎo)包。
—> 語法:<%@指令名稱 屬性名=屬性值 %>
—> import屬性:導(dǎo)包。
—> contenType屬性:設(shè)置response.setContentType的內(nèi)容。
—> pageEncoding屬性:告訴容器.jsp的文件的編碼格式,這樣,容器在獲取jsp文件的內(nèi)容(即解碼)時(shí),不會出現(xiàn)亂碼。最好加入,有些容器默認(rèn)以ISO-8859-1編碼。
—> session屬性:true/false,缺省值true,如果值為false,則容器不會添加獲得session的語句。
—> isELIgnored屬性:true/false,缺省值true,如果值為false,則告訴容器不要忽略el表達(dá)式。J2EE5.0需要使用isELIgnored=“false",否則EL表達(dá)式無效
—> isErrorPage屬性:true/false,缺省值false,如果值為true,表示這是一個(gè)錯(cuò)誤處理頁面(即專門用來處理其他JSP產(chǎn)生的異常,只有值為true時(shí),才能使用exception隱含對象去獲取錯(cuò)誤信息)。
—> include指令:<%@include file="head.jsp" %>

file屬性:
①對于頁面的公共部分,我們可以使用相同的jsp文件,并使用include指令導(dǎo)入,如此實(shí)現(xiàn)代碼的優(yōu)化。
②告訴容器,在將.jsp文件轉(zhuǎn)換成.java文件時(shí),在指令所在的位置插入相應(yīng)的文件的“內(nèi)容“(由file屬性來指定)。插入的頁面并未運(yùn)行,而是機(jī)械的將內(nèi)容插入。
—> errorPage屬性:設(shè)置一個(gè)錯(cuò)誤處理頁面。<%@page errorPage="a4.jsp" %>
—> taglib指令:<%@taglib uri="命名空間" prefix="前綴" %>
①uri:在standard.jar/META-INF/c.tld中查找,
②prefix:前綴,用于代表命名空間。
—> jsp:include: <jsp:include page="common/base.jsp" flush=“false"/>
【flush:默認(rèn)為 false。在同一個(gè) JSP 中,如果不斷 include 自己(源文件),在邏輯上會形成死循環(huán)。若默認(rèn)情況下,服務(wù)器會等待該文件被讀到底端,然后才輸出到客戶端,并且銷毀該次訪問的 request 和 response。而當(dāng)把flush 屬性賦為真值時(shí),在緩存累積了一定數(shù)據(jù)時(shí),服務(wù)器會先提供一部分?jǐn)?shù)據(jù)給瀏覽器,并等待后續(xù)內(nèi)容。
由此可以得出結(jié)論,在簡單頁面中,該屬性不納入考慮,而在頁面包含大量數(shù)據(jù)時(shí),為縮短客戶端延遲,可將一部分內(nèi)容先行輸出。該屬性在 Servlet 中也有對應(yīng)的應(yīng)用。】

5)如何運(yùn)行:
①容器依據(jù).jsp文件生成.java文件(也就是先轉(zhuǎn)換成一個(gè)Servlet):
1)HTML(CSS、JS)放到service方法里,使用out.write輸出
2)<% %>也放到service方法里,照搬,不改動。
3)<%= %>也會放到service方法里,使用out.print輸出。
4)<%! %>給Servlet添加新的屬性或者新的方法(轉(zhuǎn)成.java文件后,聲明內(nèi)的部分添加在service方法之外)。 這樣就把一個(gè)JSP變成了一個(gè)Servlet容器。
②容器接下來就會調(diào)用Servlet來處理請求了(會將之前生成的.java文件進(jìn)行編譯、然后實(shí)例化、初始化、調(diào)用相應(yīng)的方法處理請求)
③隱含對象:
—> 所謂隱含對象(共9個(gè)),指的是在.jsp文件里面直接可以使用的對象,比如out、request、response、session、application(ServletContext上下文)、exception、pageContext、config、page。
**exception **:當(dāng)jsp頁面運(yùn)行時(shí)發(fā)生了異常,容器會將異常信息封裝到該對象,可以使用該對象提供的方法來輸出異常的信息。另外,必須在頁面設(shè)置isErrorPage=“true"指令才能使用該隱含對象。
**pageContext **:容器會為每一個(gè)JSP實(shí)例(JSP所對應(yīng)的那個(gè)Servlet對象)創(chuàng)建唯一的一個(gè)符合pageContext接口的對象,稱之為page上下文。該對象會一直存在,除非JSP實(shí)例被銷毀。它作用:
①綁定數(shù)據(jù)(綁定的數(shù)據(jù)只有對應(yīng)的JSP實(shí)例才可以訪問):setAttribute、removeAttribute、getAttribute。
②找到其他八個(gè)隱含對象
—> 之所以能直接使用這些對象,是因?yàn)槿萜鲿詣犹砑觿?chuàng)建這些對象的代碼。(JSP僅僅是個(gè)草稿,最終會變?yōu)橐粋€(gè)Servlet。)

**注釋: **

<c:when test="">
</c:when>
...
<c:otherwise>
</c:otherwise>
</c:choose>

  【注意:when和otherwise必須要放到choose標(biāo)簽里面才能使用;when可以出現(xiàn)1次或者多次,otherwise可以出現(xiàn)0次或者1次,表例外】


 —> forEach :
   1)遍歷集合: <c:forEach var="" items="" carStatus=""></c:forEach> 
    ① items 屬性:用來指定要遍歷的集合,可以使用EL表達(dá)式。
    ② var 屬性:指定綁定名,綁定范圍是pageContext,綁定值是從集合中取出的某個(gè)元素。
    ③ carStatus 屬性:指定綁定名,綁定范圍是pageContext,綁定值是一個(gè)由容器創(chuàng)建的一個(gè)對象,該對象封裝了當(dāng)前迭代的狀態(tài)。比如,該對象提供了getIndex、getCount方法,其中,getIndex會返回當(dāng)前迭代的元素的下標(biāo)(從0開始),getCount會返回當(dāng)前迭代的次數(shù)(從1開始)。
   2)指定位置迭代: <c:forEach var="" begin="" end=“"></c:forEach> 
      ① begin :如果指定了items,那么迭代就從items[begin]開始進(jìn)行迭代;如果沒有指定items,那么就從begin開始迭代。它的類型為整數(shù)。
      ② end :如果指定了items,那么就在items[end]結(jié)束迭代;如果沒有指定items,那么就在end結(jié)束迭代。它的類型也為整數(shù)。
      【注意:forEach還一個(gè)屬性為 step=“" :迭代的步長?!?
—> url : <c:url value=""> 
     ①當(dāng)用戶禁止cookie以后,會自動在地址后面添加sessionId。
     ②當(dāng)使用絕對路徑時(shí),會自動在地址前添加應(yīng)用名。
      ③ value 屬性:指定地址,在表單提交、鏈接當(dāng)中,可以使用該標(biāo)簽。

—>  set : <c:set var="" scope="" value=“”> , 綁定一個(gè)對象到指定的范圍。 
      // value 屬性:綁定值。 

—> remove : <c:remove var="" scope=“"> , 解除綁定。 

—> catch : <c:catch var=“"> , 處理異常,會將異常信息封裝成一個(gè)對象,綁定到pageContext對象上。 

—> import : <c:import url=“"> 
   * url 屬性:指定一個(gè) jsp 文件的地址, jsp 會在運(yùn)行時(shí)調(diào)用這個(gè) jsp 。 

—> redirect : <c:redirect url=“"> ,重定向到另外一個(gè)地址。 
   * url 屬性:指定重定向的地址。 

—> out : <c:out value="" default="" escapeXml=“"> , 用于輸出 el 表達(dá)式的值。
  * value 屬性:指定輸出的值。
  * default 屬性:指定缺省值
  * escapeXml 屬性:設(shè)置成 true ,會將 value 中的特殊字符替換成相應(yīng)的實(shí)體。缺省值就是 true 。

**JSP標(biāo)簽運(yùn)行原理:**
  容器依據(jù)命名空間找到標(biāo)簽的描述文件( .tld 文件),接下來,依據(jù)標(biāo)簽的名稱找到標(biāo)簽類的類名,然后將該標(biāo)簽實(shí)例化,最后,調(diào)用標(biāo)簽實(shí)例的相應(yīng)的方法。
【注意:容器會從 WEB-INF 下查找,如果找不到,還會查找 WEB-INF\lib 下的 jar 文件?!?
** 自定義標(biāo)簽:**
  1) 寫一個(gè) Java 類(標(biāo)簽類),且必須繼承 SimpleTagSupport 類
 2)在 doTag 方法里面(覆蓋 doTag 方法),編寫相應(yīng)的處理邏輯。標(biāo)簽有哪些屬性,則標(biāo)簽類也有哪些屬性,并且類型要匹配。此外,這些屬性必須提供相應(yīng)的 set 方法
 3)在 .tld 文件當(dāng)中,描述該標(biāo)簽。 .tld 文件可以放在 WEB-INF 下(或它的子文件夾下),也可以放到 META-INF 下,可以參考 c.tld 文件來寫。

博客地址:[JavaWeb之JSP](http://xinping.me/#/post/49)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.學(xué)習(xí)內(nèi)容 JSP技術(shù)入門和常用指令 JSP的內(nèi)置對象&標(biāo)簽介紹 EL表達(dá)式&EL的內(nèi)置對象 2.JSP技術(shù)入門...
    WendyVIV閱讀 2,326評論 1 18
  • 一、JSP基礎(chǔ) 1.1什么是JSP JSP(Java ServerPage)是Java服務(wù)器端動態(tài)頁面技術(shù)。是su...
    晨星資源閱讀 1,268評論 0 6
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,706評論 18 399
  • 這部分主要是與Java Web和Web Service相關(guān)的面試題。 96、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,502評論 0 10
  • 關(guān)于這個(gè)想法,睡覺前聽著歌閉著眼突然就有了,一個(gè)年輕有活力的媽媽(我)蹲在一個(gè)可愛的萌寶寶(我女兒/兒子)面前喃喃...
    喜喜可樂閱讀 281評論 3 1

友情鏈接更多精彩內(nèi)容