(JavaEE-08)JSP九大隱式對象

#JSP運行原理html

  • 每一個JSP 頁面在第一次被訪問時,WEB容器都會把請求交給JSP引擎(即一個Java程序)去處理。JSP引擎先將JSP翻譯成一個_jspServlet(實質上也是一個servlet) ,而後按照servlet的調用方式進行調用
  • 因爲JSP第一次訪問時會翻譯成servlet,因此第一次訪問一般會比較慢,但第二次訪問,JSP引擎若是發現JSP沒有變化,就再也不翻譯,而是直接調用,因此程序的執行效率不會受到影響
  • JSP引擎在調用JSP對應的_jspServlet時,會傳遞或建立9個與web開發相關的對象供_jspServlet使用。JSP技術的設計者爲便於開發人員在編寫JSP頁面時得到這些web對象的引用,特地定義了9個相應的變量,開發人員在JSP頁面中經過這些變量就能夠快速得到這9大對象的引用
  • 這9個對象分別是哪些,以及做用也是筆試常常考察的知識點

#JSP九大隱式對象java

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

JSP九大隱式對象,其中七個已經在Servlet中講解過了,主要學習outpageContextweb

###outexpress

  • out隱式對象用於向客戶端發送文本數據
  • out對象是經過調用pageContext對象的getOut方法返回的,其做用和用法與ServletResponse.getWriter方法返回的PrintWriter對象很是類似
  • JSP頁面中的out隱式對象的類型爲JspWriter,JspWriter至關於一種帶緩存功能的PrintWriter,設置JSP頁面的page指令的buffer屬性能夠調整它的緩存大小,甚相當閉它的緩存
  • 只有向out對象中寫入了內容,且知足以下任何一個條件時,out對象纔去調用ServletResponse.getWriter方法,並經過該方法返回的PrintWriter對象將out對象的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中:
    • 設置page指令的buffer屬性關閉了out對象的緩存功能
    • out對象的緩衝區已滿
    • 整個JSP頁面結束

<body><%out.write("hehe");response.getWriter().write("gaga");%></body>緩存

out緩衝區與response緩衝區

  • 上面的代碼運行後,會首先輸出gaga,而後再輸出hehe。這是由於,隱式對象的緩衝區的內容不會直接回寫到客戶端,並且會跟Response的緩衝區合併在一塊兒(添加到後面),一次回寫到客戶端。
  • 在實際開發中,若是在JSP中須要顯示數據,使用隱式對象,不要使用Response輸出(JSP模版也存在這個問題)。
  • 同時使用out和response.getWriter()輸出數據
  • demo:使用JSP實現文件的下載

###pageContextsession

  • pageContext對象是JSP技術中最重要的一個對象,它表明JSP頁面的運行環境
  • 這個對象不只封裝了對其它8大隱式對象的引用,它自身仍是一個域對象,能夠用來保存數據,而且還能夠經過pageContext操做其它三個域
    • 使用pageContext能夠訪問別的三個域以及8大隱式對象,這種用法主要在自定義標籤技術中使用
    • 經過pageContext對象,能夠直接將數據添加到別的三個域中,也能夠直接從三個域中獲取
    • 使用 findAttribute方法,直接查找各個域中是否有該屬性(EL表達式)
  • 這個對象還封裝了web開發中常常涉及到的一些經常使用操做,例如引入和跳轉其它資源
    • pageContext類中定義了forward方法和include方法來分別簡化和替代RequestDispatcher.forward方法和include方法
    • 方法接收的資源若是以「/」開頭, 「/」表明當前web應用

#JSP標籤(JSP標準動做)架構

  • JSP標籤也稱之爲Jsp Action(JSP動做)元素,它用於在Jsp頁面中提供業務邏輯功能,避免在JSP頁面中直接編寫java代碼,形成jsp頁面難以維護

JSP經常使用標籤:app

  • <jsp:include>標籤
  • <jsp:forward>標籤
  • <jsp:param>標籤

###include標籤jsp

  • <jsp:include>標籤用於把另一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之爲動態引入
  • 語法:<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
    • page屬性用於指定被引入資源的相對路徑,它也能夠經過執行一個表達式來得到
    • flush屬性指定在插入其餘資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端

<jsp:include>與include指令的比較

  • <jsp:include>標籤是動態引入, <jsp:include>標籤涉及到的2個JSP頁面會被翻譯成2個servlet,這2個servlet的內容在執行時進行合併
  • 而include指令是靜態引入,涉及到的2個JSP頁面會被翻譯成一個servlet,其內容是在源文件級別進行合併
  • 不論是<jsp:include>標籤,仍是include指令,它們都會把兩個JSP頁面內容合併輸出,因此這兩個頁面不要出現重複的HTML全局架構標籤,不然輸出給客戶端的內容將會是一個格式混亂的HTML文檔

###<jsp:forward>標籤函數

  • <jsp:forward>標籤用於把請求轉發給另一個資源
  • 語法: <jsp:forward page="relativeURL | <%=expression%>" />
    • page屬性用於指定請求轉發到的資源的相對路徑,它也能夠經過執行一個表達式來得到

<jsp:param>標籤

  • 當使用<jsp:include><jsp:forward>標籤引入或將請求轉發給其它資源時,可使用<jsp:param>標籤向這個資源傳遞參數

  • 語法1:

    <jsp:include page="relativeURL | <%=expression%>"> <jsp:param name="parameterName" value="parameterValue|<%= expression %>" /> </jsp:include>

  • 語法2:

    <jsp:forward page="relativeURL | <%=expression%>"> <jsp:param name="parameterName" value="parameterValue|<%= expression %>" /> </jsp:include>

  • <jsp:param>標籤的name屬性用於指定參數名,value屬性用於指定參數值。在<jsp:include><jsp:forward>標籤中可使用多個<jsp:param>標籤來傳遞多個參數

###映射JSP

<servlet>
    <servlet-name>SimpleJspServlet</servlet-name>
    <jsp-file>/jsp/simple.jsp</jsp-file>
    <load-on-startup>1</load-on-startup >
</servlet>

<servlet-mapping>
    <servlet-name>SimpleJspServlet</servlet-name>
    <url-pattern>/xxx/yyy.html</url-pattern>
</servlet-mapping>

###如何查找JSP頁面中的錯誤

  • JSP頁面中的JSP語法格式有問題,致使其不能被翻譯成Servlet源文件,JSP引擎將提示這類錯誤發生在JSP頁面中的位置(行和列)以及相關信息
  • JSP頁面中的JSP語法格式沒有問題,但被翻譯成的Servlet源文件中出現了Java語法問題,致使JSP頁面翻譯成的Servlet源文件不能經過編譯,JSP引擎也將提示這類錯誤發生在JSP頁面中的位置(行和列)以及相關信息
  • JSP頁面翻譯成的Servlet程序在運行時出現異常,這與普通Java程序的運行時錯誤徹底同樣,Java虛擬機將提示錯誤發生在Servlet源文件中的位置(行和列)以及相關信息

###重點

  • 到此爲止,web開發接觸到了4個域對象,這4個域對象是學習web的重點,也是筆試常常考察的知識點
    • pageContext(稱之爲page域)
    • request(稱之爲request域)
    • session(稱之爲session域)
    • servletContext(稱之爲application域)
  • 明確以下問題
    • 什麼是域?
    • 這4個對象的生命週期?
    • 哪一種狀況下用哪一種域對象

###JavaBean相關標籤

  • JavaBean是一個遵循特定寫法的Java類,它一般具備以下特色

    • 這個Java類必須具備一個無參的構造函數
    • 屬性必須私有化
    • 私有化的屬性必須經過public類型的方法暴露給其它程序,而且方法的命名也必須遵照必定的命名規範
  • JavaBean在J2EE開發中,一般用於封裝數據,對於遵循以上寫法的JavaBean組件,其它程序能夠經過反射技術實例化JavaBean對象,而且經過反射那些遵照命名規範的方法,從而獲知JavaBean的屬性,進而調用其屬性保存數據

  • Javabean的屬性

    • JavaBean的屬性能夠是任意類型,而且一個JavaBean能夠有多個屬性。每一個屬性一般都須要具備相應的setter、 getter方法,setter方法稱爲屬性修改器,getter方法稱爲屬性訪問器
    • 屬性修改器必須以小寫的set前綴開始,後跟屬性名,且屬性名的第一個字母要改成大寫,例如,name屬性的修改器名稱爲setName,password屬性的修改器名稱爲setPassword
    • 屬性訪問器一般以小寫的get前綴開始,後跟屬性名,且屬性名的第一個字母也要改成大寫,例如,name屬性的訪問器名稱爲getName,password屬性的訪問器名稱爲getPassword
    • 一個JavaBean的某個屬性也能夠只有set方法或get方法,這樣的屬性一般也稱之爲只寫、只讀屬性
  • JSP中的JavaBean

    • JSP技術提供了三個關於JavaBean組件的動做元素,即JSP標籤,它們分別爲:
    • <jsp:useBean>標籤:用於在JSP頁面中查找或實例化一個JavaBean組件
    • <jsp:setProperty>標籤:用於在JSP頁面中設置一個JavaBean組件的屬性
    • <jsp:getProperty>標籤:用於在JSP頁面中獲取一個JavaBean組件的屬性
  • <jsp:useBean>標籤

    • <jsp:useBean>標籤用於在指定的域範圍內查找指定名稱的JavaBean對象
      • 若是存在則直接返回該JavaBean對象的引用
      • 若是不存在則實例化一個新的JavaBean對象並將它以指定的名稱存儲到指定的域範圍中
    • 經常使用語法:<jsp:useBean id="beanName" class="package.class" scope="page|request|session|application"/>
      • id屬性用於指定JavaBean實例對象的引用名稱和其存儲在域範圍中的名稱
      • class屬性用於指定JavaBean的完整類名(即必須帶有包名)
      • scope屬性用於指定JavaBean實例對象所存儲的域範圍,其取值只能是page、request、session和application等四個值中的一個,其默認值是page
  • <jsp:useBean>執行原理

    • <jsp:useBean id="currentDate" class="java.util.Date"/>
    • 查看翻譯後的Servlet源碼
  • 帶標籤體的jsp:useBean標籤

    • 語法:<jsp:useBean ...> Body </jsp:useBean>
    • 功能:Body部分的內容只在jsp:useBean標籤建立JavaBean的實例對象時才執行
  • <jsp:setProperty>標籤

    • <jsp:setProperty>標籤用於設置和訪問JavaBean對象的屬性。
    • 語法格式: <jsp:setProperty name="beanName" { property="propertyName" value="{string | <%= expression %>}" | property="propertyName" [ param="parameterName" ] | property= "*" }/>
      • name屬性用於指定JavaBean對象的名稱。
      • property屬性用於指定JavaBean實例對象的屬性名
      • value屬性用於指定JavaBean對象的某個屬性的值,value的值能夠是字符串,也能夠是表達式。爲字符串時,該值會自動轉化爲JavaBean屬性相應的類型,若是value的值是一個表達式,那麼該表達式的計算結果必須與所要設置的JavaBean屬性的類型一致
      • param屬性用於將JavaBean實例對象的某個屬性值設置爲一個請求參數值,該屬性值一樣會自動轉換成要設置的JavaBean屬性的類型
  • <jsp:getProperty>標籤

    • <jsp:getProperty>標籤用於讀取JavaBean對象的屬性,也就是調用JavaBean對象的getter方法,而後將讀取的屬性值轉換成字符串後插入進輸出的響應正文中
    • 語法:<jsp:getProperty name="beanInstanceName" property="PropertyName" />
      • name屬性用於指定JavaBean實例對象的名稱,其值應與jsp:useBean標籤的id屬性值相同
      • property屬性用於指定JavaBean實例對象的屬性名
    • 若是一個JavaBean實例對象的某個屬性的值爲null,那麼,使用jsp:getProperty標籤輸出該屬性的結果將是一個內容爲「null」的字符串
相關文章
相關標籤/搜索