程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> [Servlet&JSP] 從JSP到Servlet

[Servlet&JSP] 從JSP到Servlet

編輯:關於JSP

[Servlet&JSP] 從JSP到Servlet


JSP與Servlet是一體的兩面,JSP最後都會被容器轉譯為Servlet源代碼,自動編譯為.class文件,載入.class文件然後生成Servlet對象。

由容器轉譯後的Servlet類具有_jspInit()、_jspDestroy()、_jspService()等方法,名稱中有下劃線前綴,表示這些方法都是容器轉譯時維護的,我們不應該從寫這些方法。如果想要做些JSP初始化或收尾的工作,則應定義jspInit()或jspDestryoy()方法。

指示元素

JSP指示(Directive)元素的主要目的在於,指示容器將JSP轉譯為Servlet源代碼時,必須遵守的一些信息。指示元素的語法如下:

<%@ 指示類型 [屬性="值"]* %>

在JSP中有三種常用的指示類型:page、include和taglib。

page指示類型告知容器如何轉譯當前的JSP網頁。 include指示類型告知容器將別的JSP頁面包括進來進行轉譯。 taglib指示類型告知容器如何轉譯這個頁面中的標簽庫(Tag Library)。

指示元素中可以有多對屬性/值,必要時,同一個指示類型可以用數個指示元素來設置。

<%@ page import="java.util.Date" %>
<%@ page language="java" contentType="text/html; utf-8"
    pageEncoding="utf-8"%>

page指示類型中的import告知容器,轉譯JSP時必須在源代碼中包括的import語句。也可以在一個import語句中,使用逗號分隔開數個import的內容;page指示類型中的contentType屬性告知容器,在轉譯JSP時,必須使用HttpServletRequest的setContentType(),調用方法時傳入的參數就是contentType的屬性值;pageEncoding屬性則是告知容器轉譯和編譯時如何處理這個JSP網頁中的文字編碼,以及內容類型附加的charset設置。如果網頁中包含非ASCII編碼范圍內的字符(如中文),就要指定正確的編碼格式,才不會出現亂碼。

可以在使用page指示類型時一行一行的編寫,也可以編寫在同一個元素中。

page指示類型還有一些可以設置的屬性,概略說明如下:

info屬性
用於設置當前JSP頁面的基本信息,這個信息最後會轉換為Servlet成U型中使用getServletInfo()所取得的信息。

autoFlush屬性
用於設置輸出流時候要自動清除,默認為true。如果設置為false,當緩沖區滿了又沒調用flush()把數據送出到客戶端時,就會產生異常。

buffer屬性
用於設置到客戶端的輸出串流緩沖區的大小,設置時必須指定單位,流入buffer=”16kb”,默認是8kb。

errorPage屬性
用來設置當JSP運行錯誤而產生異常時,該轉發哪一個頁面處理這個異常。

extends屬性
用來指定JSP網頁轉譯為Servlet程序之後,應該繼承哪一個類。以Tomcat為例,默認是繼承至HttpJspBase(它繼承至HttpServlet)。這個屬性很少會使用到。

isErrorPage屬性
設置JSP頁面是否為處理異常的頁面,這個屬性要與errorPage配合使用。

language屬性
指定容器使用哪種語言的語法來轉譯JSP網頁,不過事實上目前只能使用Java的語法且是默認的。

session屬性
設置在轉譯後的Servlet源代碼中是否具有創建HttpSession對象的語句。默認是true,若有些頁面不需作會話管理,設為false可以增加一些性能。

isELIgnored
設置JSP網頁中是否忽略表達式語言,默認是false。這個設置會覆蓋web.xml中的設置。

isThreadSafe屬性
告訴容器在編寫JSP時是否注意到線程安全,默認值為true。如果設置為false,則轉譯之後的Servlet會實現SingleThreadMOdel接口,每次請求時將創建一個Servlet實例來服務請求,雖然可以避免線程安全問題,但這會影響到性能,極度不建議設置為false。

incude指示類型用來告知容器將包括另一個網頁的內容進行轉譯。

<%@include file="/WEB-INF/header.jsp" %>
<%@include file="/WEB-INF/foot.jsp" %>

使用命令元素include來包括其他網頁內容時,由於是在轉譯時期就決定了轉譯後的Servlet內容,是一種靜態的包含方式。標簽則是在運行時將別的網頁動態包括進來進行響應的方式。

聲明、Scriptlet與表達式元素

JSP網頁會轉譯為Servlet類,轉譯後的Servlet類應該包括哪些類成員、方法聲明或是哪些語句,在編寫JSP時,可以使用聲明(Declaration)元素、Scriptlet元素以及表達式(Expression)元素來指定。

聲明元素

聲明元素的語法如下:

<%! 類成員或方法聲明 %>

<%!%>之間聲明的程序代碼,都將轉譯為Servlet中的類成員或方法。

在使用<%!%>聲明變量時,必須小心數據共享與線程安全的問題。容器默認會使用同一個Servlet實例來服務不同用戶的請求,每個請求就是一個線程,而<%!%>之間聲明的變量對應至類變量成員,因此會有線程共享訪問的問題。

如果有一些初始化操作想要在JSP加載時執行,則可以重寫jspInit()方法,也可以用jspDestroy()定義結尾動作。定義這兩個方法就是在<%!%>之間進行的,這樣轉譯後的Servlet源代碼就會有相對應的片段出現。

Scriptlet元素

Scriptlet元素語法如下:

<% Java語句 %>

在Scriptlet元素中可以編寫Java語句,就如同在Java的方法中編寫語句一樣,事實上,其中所包括的內容將被轉譯為Servlet源代碼的_jspService()方法中的內容。

直接在JSP中編寫的HTML,都會變成out對象所輸出的內容。Scriptlet出現的順序,也就是在轉譯為Servlet後,語句出現在_jspService()中的順序。

表達式元素

表達式元素語法如下:

<%= Java表達式 %>

表達式運算的結果將直接輸出為網頁的一部分。在表達式元素中不用加上分好(;)。

隱含對象

隱含對象 說明(轉譯後對象的對象) out JspWriter–>PrintWriter request HttpServletRequest resposne HttpServletResponse config ServletConfig application ServletContext session HttpSession pageContext pageContext,它提供了JSP頁面資源的封裝 exception Throwable,它代表JSP頁面拋出的異常對象 page this



可以通過pageContext設置四種范圍屬性,而不用使用個別的pageContext、request、session、application來進行設置。以pageContext提供單一的API來關系屬性的作用范圍,可以使用以下的方法來進行設置。

getAttribute(String name, int scope)
setAttribute(String name, Object value, int scope)
removeAttribute(String name, int scope)

scope可以使用以下常數來指定:

pageContext.PAGE_SCOPE pageContext.REQUEST_SCOPE pageContext.SESSION_SCOPE pageContext.APPLICATION_SCOPE

事實上,很少會使用到pageContext,pageContext主要是在轉譯JSP為Servlet時,提供給容器一個單一訪問的界面。

錯誤處理

JSP終究會轉譯為Servlet,所以錯誤可能發生在以下三個時候:

JSP轉換為Servlet源代碼時
語法錯誤等 Servlet源代碼進行編譯時
忘記部署相關的類等 Servlet加載容器進行服務單發生運行時錯誤
如NullPointerException等

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved