JSP 模型
Published by Will under JSP on 上午8:17JSP 模型
- JSP 簡介 : JSP是
以JAVA語言為基礎的
網頁開發技術。它充許您在 HTML 或 XML 網頁內嵌入 Java
程式碼,籍此開發各種強大的 Java 動態網頁。
- JSP : [ 展示邏輯 ] 在 HTML 內嵌 Java程式碼
- Servlet : [ 商業邏輯 ] 在 Java程式碼內產生 HTML 輸出結果
- JSP 的組成 : 組成要素 :
- JSP 標準指令 ( Standard Directive )
- JSP 程式嗎元素 ( Scripting Elements )
- JSP 標準動作 ( Standard Action )
- JSP 陣述語言 ( Expression Language )
- 標籤函式庫 ( Tag Libary )
註解 : <%-- -->
- JSP 的運作方式 :
- JSP生命週期方法 : SP 是以 Servlet 的形式被執行,因此 JSP 在第一次執行時會先解譯成 Servlet
原始檔,然後編譯成 Servlet 類別檔,接著才會載入 Servlet 容器執行。 - JSP 生命週期的七個階段
- 網頁解譯 ( Page Translation )
- JSP 編譯 ( JSP Compilation )
- 載入類別 : 由類別載入器 ( Class Loader ) 將 Servlet 類別檔載入 Servlet 容器的 JVM
- 建立 Servlet 實體
- 呼叫 jspInit() 方法 : 初始化
- 呼叫 _jspService() 方法 : 當使用者送出 JSP 執行請求,會被呼叫,並且傳入 request 與
response 物件。當 JSP 被解譯成 Servlet 時,所有 HTML 標籤、Script Tag 與 Expression Tag
的內容都會包含在這個方法裡。
- 呼叫 jspDestroy() 方法 : 當 JSP 所對應的 Servlet
被清除時,Servlet容器將會呼叫 jspDestroy() 方法。 - 部署 JSP
- 先將 Servlet 原始檔編譯成 Servlet 類別檔
- 將編譯後的類別檔複製到 Servlet 容器的適當目錄下
- 編輯或組態 web.xml 檔案
在 javax.servlet.jsp 套件定義了一個 JspPage 介面 ( 繼承自 Servlet 介面 ),此介面定義兩個方法 : jspInit() 與 jspDestroy()。
以進行資源初始化與資源釋放的動作。
javax.servlet.jsp 套件內另外定義一個 HttpJspPage 介面,此介面只定義一個 _jspService() 方法。 通常我們將 jspInit()、_jspService() 與 jspDestory() 這三個方法稱為 JSP生命週期方法。
補充 : 如果 Servlet 容器想要移除某個 JSP 所產生的 Servlet 實體時,將呼叫其 jspDestroy() 方法
補充 : 必要時可以改寫 jsInit() 與 jspDestory() 方法的內容,但是 _jspService()方法無法改寫。因為 _jspService()方法是由 Servlet 容器自動產生,而且各家廠商的實作方式可能不同。P.7-11 : Tomcat 範例
- JSP 標準指令 : 用來設
定 JSP 網頁的整體組態資訊
語法 : <%@ JSP標準指令(與其屬性) %>
- page : 設定 JSP 的整體組態資訊 EX: <%@ page import="java.util.*"
%> - include : 在 JSP 內包含其他 JSP 的內容 EX: <%@ include
file="leftframe.html"%> - tablib : 在 JSP 內使用「自訂標籤函式庫」EX: <%@ taglib prefix=""
uri="taglib.tld" %> - page 指令 語法 :
- <%@ page 屬性1="屬性值1" 屬性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.*
- 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 (會被忽略,不予執行)
分三大類 :
javax.servlet.*
javax.ervlet.jsp
javax.ervlet.http.*
- 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>
- Declaration Tag (宣告標籤) : 宣告 JSP 內所使用的變數或方法,定義 Servlet 類別的變數或方法。
語法 :<%! 變數或方法宣告 %>
說明 :
使用<%!與%>宣告變數時,必須小心資料共用與執行緒安全的問題,預設上容器會使用同一個 Servlet 實例來服務不同使用者的請求。
補充:
JSP/Servlet: Scripting Elements
http://caterpillar.onlyfun.net/Gossip/JSPServlet/ScriptingElements.htm
- Scriptlet Tag (程式碼標籤) : 撰寫任何 Java 程式碼,定義區域變數或方法。會定義在 Serlet 類別裡的 _jspService() 方法裡。
語法 : <% 程式碼 %>
Expression Tag (運算式標籤) : 撰寫任何 Java 運算式,將運算結果直接顯示在網頁上
語法 : <%= 運算式 %>
注意 : 運算式結尾不能加上分號 ( ; )
- Comment Tag (註解標籤) : 撰寫 JSP 的註解文字
語法 :
- JSP 註解 : <%-- 註解內容 %>
- Java 註解 : <% // Java 註解 %> <% /* Java 註解 */ %>
- 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 例外事件處理機制:
- 撰寫一個 JSP 「錯誤頁面」( error page ) :
- 將 page 指令的 isErrorPage 屬性設定為 true
<%@ page isErrorPage="true"%>
- 可以使用 JSP 的 exception 隱含變數
String exceptionName = exception.getClass().getNmae();
String exceptionMessage = exception.getClass().getMessage();
- 將 page 指令的 isErrorPage 屬性設定為 true
- 在JSP 內 ,指定例外事件發生時應回應那個「錯誤頁面」
<%@ page errorPage="ExceptionHandling.jsp" %>
- 撰寫一個 JSP 「錯誤頁面」( error page ) :
- 以 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 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
0 意見:
張貼留言