[Servlet&JSP] 從JSP到Servlet

來源:互聯網
上載者:User

標籤:會話   java   介面   str   輸出資料流   rar   緩衝   foo   指示   

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()把資料送出到client時,就會產生異常。

  • buffer屬性
    用於設定到client的輸出串流緩衝區的大小,設定時必須指定單位,流入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中的<el-ignored>設定。

  • isThreadSafe屬性
    告訴容器在編寫JSP時是否注意到安全執行緒。預設值為true。

    假設設定為false,則轉譯之後的Servlet會實現SingleThreadMOdel介面。每次請求時將建立一個Servlet執行個體來服務要求,儘管能夠避免安全執行緒問題,但這會影響到效能,極度不建議設定為false。

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

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

使用命令元素include來包含其它網頁內容時,因為是在轉譯時期就決定了轉譯後的Servlet內容,是一種靜態包含方式。<jsp:include>標籤則是在執行時將別的網頁動態包含進來進行響應的方式。

聲明、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,所以錯誤可能發生在下面三個時候:

  1. JSP轉換為Servlet源碼時
    語法錯誤等
  2. Servlet源碼進行編譯時間
    忘記部署相關的類等
  3. Servlet載入容器進行服務單發生執行時錯誤
    如NullPointerException等

[Servlet&amp;JSP] 從JSP到Servlet

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.