Sunrays

Blogger Template by ThemeLib.com

JSP 模型

Published by Will under on 上午8:17

JSP 模型


  • JSP 簡介 : JSP是
    以JAVA語言為基礎的
    網頁開發技術。它充許您在 HTML 或 XML 網頁內嵌入 Java
    程式碼,籍此開發各種強大的 Java 動態網頁。
    • JSP : [ 展示邏輯 ] 在 HTML 內嵌 Java程式碼
    • Servlet : [ 商業邏輯 ] 在 Java程式碼內產生 HTML 輸出結果



  • JSP 的組成 :
  • 組成要素 :
    1. JSP 標準指令 ( Standard Directive )
    2. JSP 程式嗎元素 ( Scripting Elements )
    3. JSP 標準動作 ( Standard Action )
    4. JSP 陣述語言 ( Expression Language )
    5. 標籤函式庫 ( Tag Libary )

    註解 : <%-- -->


  • JSP 的運作方式 :

    • JSP生命週期方法 : SP 是以 Servlet 的形式被執行,因此 JSP 在第一次執行時會先解譯成 Servlet
      原始檔,然後編譯成 Servlet 類別檔,接著才會載入 Servlet 容器執行。

    • 在 javax.servlet.jsp 套件定義了一個 JspPage 介面 ( 繼承自 Servlet 介面 ),此介面定義兩個方法 : jspInit() 與 jspDestroy()。
      以進行資源初始化與資源釋放的動作。
      javax.servlet.jsp 套件內另外定義一個 HttpJspPage 介面,此介面只定義一個 _jspService() 方法。 通常我們將 jspInit()、_jspService() 與 jspDestory() 這三個方法稱為 JSP生命週期方法。

    • JSP 生命週期的七個階段
      1. 網頁解譯 ( Page Translation )
      2. JSP 編譯 ( JSP Compilation )
      3. 載入類別 : 由類別載入器 ( Class Loader ) 將 Servlet 類別檔載入 Servlet 容器的 JVM
      4. 建立 Servlet 實體
      5. 呼叫 jspInit() 方法 : 初始化
      6. 呼叫 _jspService() 方法 : 當使用者送出 JSP 執行請求,會被呼叫,並且傳入 request 與
        response 物件。當 JSP 被解譯成 Servlet 時,所有 HTML 標籤、Script Tag 與 Expression Tag
        的內容都會包含在這個方法裡。

      7. 呼叫 jspDestroy() 方法 : 當 JSP 所對應的 Servlet
        被清除時,Servlet容器將會呼叫 jspDestroy() 方法。

      8. 補充 : 如果 Servlet 容器想要移除某個 JSP 所產生的 Servlet 實體時,將呼叫其 jspDestroy() 方法   
        補充 : 必要時可以改寫 jsInit() 與 jspDestory() 方法的內容,但是 _jspService()方法無法改寫。因為 _jspService()方法是由 Servlet 容器自動產生,而且各家廠商的實作方式可能不同。P.7-11 : Tomcat 範例

  • 部署 JSP
    1. 先將 Servlet 原始檔編譯成 Servlet 類別檔
    2. 將編譯後的類別檔複製到 Servlet 容器的適當目錄下
    3. 編輯或組態 web.xml 檔案

  • JSP 標準指令 : 用來設
    定 JSP 網頁的整體組態資訊

    語法 : <%@ JSP標準指令(與其屬性) %>


  • 分三大類 :
    1. page : 設定 JSP 的整體組態資訊 EX: <%@ page import="java.util.*"
      %>
    2. include : 在 JSP 內包含其他 JSP 的內容 EX: <%@ include
      file="leftframe.html"%>
    3. tablib : 在 JSP 內使用「自訂標籤函式庫」EX: <%@ taglib prefix=""
      uri="taglib.tld" %>

    • page 指令
    • 語法 :
      1. <%@ page 屬性1="屬性值1" 屬性2="屬性值2" %>
      2. <jsp:directive.page 屬性1="屬性值1" 屬性2="屬性值2" /> : XML 語法

    • page指令的屬性 :
      • language : 指定 JSP 所使用的語法種類,JSP 1.2 的規格中只能設定為"java"
      • extends : 編譯後產生的 Servlet 應繼承那個父類別
      • import : 匯入 Java 套件或類別
        • 使用 : 

        • <%@ page import="java.util.Date, java.io.*" %>
        • 方便閱讀 :

          <%@ page import="java.io.*" %>

          <%@ page imprt="java.sql.*" %>
        •  JSP 自動匯入的套件 :
        •   java.lang.*
            javax.servlet.*
            javax.ervlet.jsp
            javax.ervlet.http.*
      • session : 指定 JSP 是否包含在 HTTP 連線階段,可設定為 "true" 或 "false",預設為
        "true"

      • buffer : 設定輸出緩衝區的大小,取消緩衝設定為 "none"

      • autoFlush : 當緩衝區滿溢時,是否自動將輸出結果傳回客戶端,預設為 "true"
      如果設定為 "false",一旦輸出緩衝區滿了仍有資料要存入緩衝區時,Servlet容器會拋出例外事件
      如果將 autoFlush 設定為 "false",buffer 就不能設定為 "none" (一定要使用緩衝區 )
      • isThreadSafe : 指定 JSP 是否為「執行緒安全」
      • info : 設定 JSP 的網頁摘要說明
      • isErrorPage : 指定 JSP 是否為「錯誤頁面」( error
        page),當例外事件發生時,能夠顯示錯誤原因的網頁。
      • errorPage : 指定當 JSP 拋出例外事件時,應該導向那個錯誤頁面
      • contentType : 指定 JSP 回應結果的字元集與 MIME 型態 (預設 MIME
        型態為text/html,預設的字元集為 ISO-8859-1)
      • pageEnconding : 指定 JSP 的編碼方式
      • isELlgnored : 限制 JSP 內無法執行 Expreesion Language (會被忽略,不予執行)

  • JSP 程式碼元素 ( Scripting
    Elements ) :
    主要程式碼內容區

    • 對於 Web 應用程式來說,Scriptlet 是個不樂意被見到的東西,他會使 HTML 與 Java
      程式碼交相混雜,程式維護不易。
    必要時可以在 web.xml 裡加上 <script-invalid> 標籤,設定所有 JSP 網頁都不可以使用 Scriptlet
    EX:
    ...
    <web-app ..>
     ....
     <jsp-config>
       <jsp-property-group>
         <url-pattern>*.jsp</url-pattern>
           <script-invalid>true</script-invalid>
         </jsp-property-group>
      </jsp-config>
      ....
      </web-app>


    1. Declaration Tag (宣告標籤) : 宣告 JSP 內所使用的變數或方法,定義 Servlet 類別的變數或方法。


      語法 :<%! 變數或方法宣告 %>

      說明 :

      使用<%!與%>宣告變數時,必須小心資料共用與執行緒安全的問題,預設上容器會使用同一個 Servlet 實例來服務不同使用者的請求。
      補充:

      JSP/Servlet: Scripting Elements

      http://caterpillar.onlyfun.net/Gossip/JSPServlet/ScriptingElements.htm

    2. Scriptlet Tag (程式碼標籤) : 撰寫任何 Java 程式碼,定義區域變數或方法。會定義在 Serlet 類別裡的 _jspService() 方法裡。


      語法 : <% 程式碼 %>


    3. Expression Tag (運算式標籤) : 撰寫任何 Java 運算式,將運算結果直接顯示在網頁上


      語法 : <%= 運算式 %>

      注意 : 運算式結尾不能加上分號 ( ; )

    4. Comment Tag (註解標籤) : 撰寫 JSP 的註解文字

      語法 :

      1. JSP 註解 : <%-- 註解內容 %>
      2. Java 註解 : <% // Java 註解 %> <% /* Java 註解 */ %>
      3. HTML 註解 : <!-- HTML 註解 -->


      只有 HTML 註解可以顯示在於客戶端瀏覽器,JSP 註解與 Java 註解則不行


  • JSP 標準動作 ( Standard Action ) : JSP 規格內定義的一種 XML 標籤,用來執行特定動作。

    優點 : 減少 JSP 所包含的 Java 程式碼。



  • JSP 隱含變數 ( Implicit Variable ) : 也稱為隱含物件( Implicit Ojbects ),不用實體化即可以使的物件


    JSP 隱含變數 說明 存取範圍
    ( scope )
    對應型別
    request 包含客戶端送出的 HTTP 請求 request javax.servlet.http.HttpServletRequest
    response 欲傳送給客戶端的 HTTP 回應 page javax.servlet.http.HttpServletResponse
    out 代表輸出資料流 ( output steam ) 的 JspWriter 物件 page javax.servlet.jsp.JspWriter
    config 包含 Servlet (JSP編譯後產生) 相關資訊的 ServletConfig 物件 page javax.servlet.ServletConfig
    pageContext 包含 JSP 網頁資訊的 PageContext 物件 page javax.servlet.jsp.PageContext
    page 相當於 Java語言的 this 變數 ( JSP頁面本身的物件 ) page java.lang.Object
    exception 由其他 JSP 拋出的例外事件
    只有設定 <%@ page isErrorPage=true> 的 JSP 錯誤頁面才能使用 exception 隱含變數
    page java.lang.Throwable
    session 存取 HTTP 連線階段內容 ( page 指令的 session 屬性必須設定為 true才有意義,預設為 "true" ) session javax.servlet.http.HttpSession
    application 包含 Web 應用程式組態資訊的 ServletContext物件 application javax.servlet.ServletContext




  • JSP 例外事件處理機制
    :
    1. 撰寫一個 JSP 「錯誤頁面」( error page ) :


      • 將 page 指令的 isErrorPage 屬性設定為 true


        <%@ page isErrorPage="true"%>


      • 可以使用 JSP 的 exception 隱含變數



        String exceptionName = exception.getClass().getNmae();

        String exceptionMessage = exception.getClass().getMessage();



    2. 在JSP 內 ,指定例外事件發生時應回應那個「錯誤頁面」
      <%@ page errorPage="ExceptionHandling.jsp" %>



  • 以 XML 語法撰寫 JSP :

    JSP 規格書定義了兩種 JSP 選寫方式,一種是標準的JSP 語法,另一種是以 XML 語法來撰寫。附檔名皆為 .jsp,JSP容器會自動辨識其內容。以 XML 語法撰寫的 JSP 通常稱為 JSP 文件 ( JSP Document )。


    • jsp:root 元素 :

      每個 JSP Document 擁有一個根節點 ( root element ),以
      <jsp:root>表示。
      在 jsp : root 元素中,xmlns 屬性用來設定 XML 元素的「命名空間」( name space ) ,目的是告訴 JSP 容器應該使用那個標籤函式庫?其前置字元 ( prefix ) 為何?

      xmlns 屬性相當於 JSP Standard Directive 內 taglib 指令的 prefix 屬性 ,所以可以用來使用自訂標籤函式庫。



      <jsp : root

       xmlns : jsp = "http://java.sun.com/JSP/Page"

       xmln : myCTL = " www.abc.com/tablib"

       version = "2.0" >

       JSP文件內容

      </jsp : root>


    • JSP Document 指令元素
      • <jsp : directive. page ... />
      • <jsp : directive.includ... />


      這兩元素分別對應 JSP Standard Directive 的 Page 指令與 include 指令




      JSP Standard Directive 與使用範例 JSP Document 內相對應的元素
      page <%@ page imort = "java.util.*" %> <jsp : directive.page import = "java.util.*" />
      include <%@ include = "result.jsp" %> <jsp : directive.include file = "result.jsp" />


      補充 :

      JSP Document 的指令元素並未對應 JSP 標準語法的 taglib 指令。在 JSP 文件,自訂標籤函式庫是定義在 < jsp : root > 元素內




    • JSP Document 程式碼元素 ( Scripting Elements )

      含下列三種 :



      • < jsp : declaration >
      • < jsp : scriptlet >
      • <jsp : expression >



      這三種元素分別對應 JSP 的 Declaration Tag 、Scirptlet Tag 與 Expression Tag ,不包含任何屬性。



      JSP Scripting Elements 與使用範例 JSP Document 內相對應的元素
      Declaratioin Tag <%! int i = 1; %>

      < jsp : declaration >

       int i = 1;

      < /jsp : declaration >

      Scriptlet Tag <% if(x>0)

       { result = true; } %>
      < jsp : scriptlet >

       if (x>0){

        result = true;

       }

      < / jsp : scriptlet >
      Expression Tag <% = new Date () %> < jsp : expression >

       new Date ( )

      </ jsp : espression >


    • JSP Document 註解元素

      JSP Document 是根據 XML 語法進行解析,所以 JSP 規格並未額外定義 JSP Document 註解方式。可以在 JSP Document 內使用標準 HTML 或 XML 註解標籤來撰寫註解文字

      <!-- 註解文字 -->




  • 組態 JSP 執行環境 :



    除了利用 page 指令 ( <%@ page... %> ) 來控制 JSP 的執行行為,也可以在 web.xml 內利用 < jsp-config > 元素來組態 JSP 執行環境



    < jsp- config > 設定範例 :

    <jsp - config >

     < jsp-property-group>

      <url-pattern>/scripting_disabled/*</url-pattern>

      <scripting -invalid>true</scripting-invalid>

     </jsp - property- group>

     <jsp-property - group>

      <url -pattern>/ EL_disabled/* </url -pattern>

      <el -ignored> true </el - ignored>

     </jsp-property-group>

    </jsp-config


    <jsp- config > 元素內可定義多個 < jsp -proprety -group> 元素。



    範例中,第一個 < jsp -property -group> 元素內含 < url-pattern > 與 < scripting-invalid > 元素,分為設定為 /scripting_disabled/* 與 true ,這意昧著 /scripting_disabled 目錄下所有 JSP 均無法使用 「程式碼標籤 」( Scriptlet Tag ) 來執行 Java 程式碼。如果 /scripting_disabled/ 目錄下的 JSP 包含 <% %> 標籤,執行時會拋出例外事件。



    範例中,第二個< jsp-property-group> 元素包含 <url-pattern> 與 < el-ignored > 兩個子元素,分別設定為 / EL_disabled/ *與 true ,這意昧著 / EL_disabled/ 目錄下所有 JSP 均無法執行 Expression Language ( EL )。如果 /EL_disabled/ 目錄下的 JSP 包含EL ,這些 EL 程式碼將原封不動地顯示輸出結果 ( 不會拋出例外事件 )。



    補充 : SCWCD 認証專家應考指南 P.7-31




資料來源 : SCWCD 認証專家應考指南

0 意見:

張貼留言

 

Blog Archive

Lipsum

Followers