Servlet&JSP的那些事兒(十)

來源:互聯網
上載者:User

之前討論的主要內容是servlet,其實我的本意是只論述一下servlet的,不過既然jsp作為java web開發中不可或缺的一環,所以多學也沒有壞處。在之前的內容中我們發現,使用servlet產生動態網頁的時候,需要在代碼中輸出html標籤。另外,還不得不將靜態代碼和動態代碼混在一起。如果使用servlet開發動態網頁,那麼程式員和網頁編輯人員就沒辦法一起工作。因為網頁編輯人員可能不瞭解java,所以沒辦法修改servlet代碼。也正因為這樣,sun公司(被甲骨文收購了,真可惜。)才推出了JSP(java
server pages)。

簡介

或許你瞭解asp,jsp和asp一樣,都是在html檔案中嵌入指令碼代碼,用於產生動態內容,只不過jsp嵌入的是java語句。jsp檔案在使用者第一次請求時,會被編譯成servlet,然後再由這個servlet處理使用者請求,所以jsp也可以看做運行時的servlet。說到這兒,你可能會有疑問,既然這樣,那麼為什麼還要用jsp,jsp和servlet的區別在哪?

1)servlet在伺服器上執行和解釋瀏覽器的請求,作為用戶端和其他應用程式的中介層。servlet主要是把動態內容混到靜態內容中以產生html。
2)jsp頁面在html中嵌入java指令碼代碼和jsp標記,使得檔案長度變短,格式更清晰。另外,jsp把靜態和動態內容區分開來,實現了內容與表示的分離。
3)使用jsp,不需要單獨配置每個檔案,只要副檔名是.jsp,jsp容器(也就是servlet容器)就會自動識別,將其轉化為servlet。

jsp的運行機制

我們來編寫一個簡單的jsp檔案。首先在D:\apache-tomcat-7.0.33\webapps目錄下建立一個檔案夾Hello,然後在Hello檔案夾中建立檔案夾WEB-INF和檔案hello.jsp。hello.jsp代碼如下:

<html><head><title>Hello</title></head><body><%out.println("Hello, JSP!");%></body></html>

很簡單是吧,接下來我們啟動tomcat,然後在瀏覽器網址欄輸入http://localhost:8080/Hello/hello.jsp,頁面會顯示Hello, JSP!。這中間到底經曆了什麼過程呢?我們開啟D:\apache-tomcat-7.0.33\work\Catalina\localhost目錄,發現其中有Hello檔案夾,開啟它,在Hello\org\apache\jsp檔案夾中,我們看到了兩個檔案:hello_jsp.java和hello_jsp.class。這就是在訪問hello.jsp時,由jsp容器產生的。
jsp容器管理jsp頁面生命週期的兩個階段:轉換階段和執行階段。當一個請求到來時,jsp容器首先檢驗jsp文法是否正確,如果正確,將jsp檔案轉換為servlet檔案,然後調用javac編譯產生.class檔案,這是轉換階段。接下來,servlet容器載入轉換後的servlet類,執行個體化一個對象處理用戶端的請求,在請求完成後,響應對象被jsp容器接收,容器將html格式的響應訊息發送回用戶端,這是執行階段。

我們現在來學習jsp的文法知識。

jsp頁面分為兩部分:元素和模板資料。元素是必須由jsp容器處理的部分,而模板資料是jsp容器不處理的部分。如jsp頁面中的html語句。jsp中的元素主要有三種類型:指令元素、指令碼元素和動作元素。

jsp中的元素類型

1)指令元素(directive element)

指令元素用於為轉換階段提供整個jsp頁面相關的資訊,指令不會產生任何的輸出到當前的輸出資料流中。文法形式為:

<%@ directive {attr="value"}* %>

指令元素主要有三種:page、include和taglib。

page指令文法為:

<%@ page attr1="value1" attr2="value2" ...%>

xml格式的文法為:

<jsp:directive.page attr1="value1" attr2="value2" .../>

page指令有15個屬性。language、extends、import、session、buffer、autoFlush、isThreadSafe、info、errorPage、isError、contentType、pageEncoding、isELIgnored、deferredSyntaxAllowedAsLiteral、trimDirectiveWhitespaces。很多是吧?眼花繚亂是吧?其實可以只要大概瞭解就可以了。具體用的時候可以查資料。這裡介紹幾個。

language用於指定在指令碼元素中使用的指令碼語言,為java。extends用於指令jsp頁面轉化後的servlet類從哪個類繼承。import用於指定在指令碼環境中可以使用的java類,如果引用了多個類,類中間以逗號隔開。session用於指定jsp頁面是否參與會話,值為true或false。errrorPage用於指定當jsp頁面發生異常時,轉向的錯誤處理頁面。注意,如果使用它指定了錯誤處理頁面,則web.xml檔案中定義的錯誤處理頁面不會被使用。contentType指定用於響應的jsp頁面的MIME類型和字元編碼。pageEncoding用於指定jsp頁面使用的字元編碼。

include指令用於在jsp頁面中靜態包含一個檔案,該檔案可以是jsp頁面、html頁面、文字檔或一段java代碼。include指令文法為:

<%@ include file="relativeRULspec" %>

xml格式的文法為:

<jsp:directive.include file="relativeRULspec" .../>

file屬性的值為相對於當前jsp檔案的URL。(註:在被包含的檔案中最好不要使用<html>等標籤,以防和原jsp檔案衝突。)

taglib指令允許頁面使用使用者定製的標籤。taglib指令文法為:

<%@ taglib (uri="tagLibraryURI" | tagdir="tagDir") prefix="tagPrefix" %>

xml格式的文法為:

<jsp:directive.taglib (uri="tagLibraryURI" | tagdir="tagDir") prefix="tagPrefix" .../>

taglib指令有三個屬性:uri、tagdir、prefix。uri唯一的標識和首碼相關的標籤庫描述符,可以使絕對火相對的URI。tagdir指示首碼將被用於標識安裝在/WEB-INF/tags/目錄或其字母下的標籤檔案。prefix定義一個prefix:tagname形式的字串首碼,用於區分多個自訂標籤。

2)指令碼元素(scripting element)

指令碼元素包括三個部分:聲明、指令碼段和運算式。

聲明指令碼元素用於聲明在jsp頁面指令碼語言中使用的變數和方法聲明必須是完整的聲明語句,遵循java語言的文法。它不會在當前輸出資料流中產生任何輸出。文法如下:

<%! declaration(s)%>

xml格式的聲明如下:

<jsp:declaration> declaration(s) </jsp:declaration>

註:在聲明變數時,不要忘記變數後面的;號。聲明只在當前jsp頁面有效。

指令碼段是在請求處理期間要執行的java程式碼片段。文法格式如下:

<% scriplet %>

xml格式的指令碼段如下:

<jsp:scriplet> scriplet </jsp:scriplet>

運算式指令碼元素是java語言中的完整運算式,在請求處理時計算這些運算式,計算結果將被轉換為字串,插入到當前的輸出資料流中。其文法如下:

<%= expression %>

xml格式的文法如下:

<jsp:expression> expression </jsp:expression>

註:在書寫運算式時,不要在運算式後添加任何標點符號。

3)動作元素(action element)

動作元素為請求處理階段提供資訊。jsp2.0規範定義了20個標準的動作元素。

<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>用於訪問javaBean。
<jsp:param>以名-值對的形式為其他標籤提供附加資訊,和<jsp:include>、<jsp:forward>、<jsp:plugin>一起使用。格式如下:

<jsp:param name="name" value="value" />

name給出參數名字,value給出參數值,可以是一個運算式。

<jsp:include>用於在當前頁面中包含靜態和動態資源,一旦被包含的頁面執行完畢,請求處理將在調用頁面中繼續執行。
<jsp:forward>允許在運行時將當前的請求轉寄給一個靜態資源、jsp、頁面或servlet,請求被轉向到的資源必須位於同jsp發送請求相同的上下文中。

其他的動作元素在此不再贅述。有興趣可以自己查看資料。

4)注釋

html注釋文法為:

<!-- comments -->

jsp注釋文法為:

<%-- comments --%>

另外,還可以使用java語言本身的注釋機制,如下:

<% // comments %><% /* comments*/ %>

JSP的隱含對象

例如我們在hello.jsp中使用的out對象就是其中之一,除了out之外,還有其他8個隱含對象。這9個隱含對象和它們的類型如表1所示:

隱含對象 類型
request javax.servlet.http.HttpServletRequest
response javax.servlet.http.HttpServletResponse
pageContext javax.servlet.jsp.PageContext
session javax.servlet.http.HttpSession
application javax.servlet.ServletContext
out javax.servlet.jsp.JspWriter
config javax.servlet.ServletConfig
page java.lang.Object
exception java.lang.Throwable

表1 JSP隱含對象的類型

轉載請註明出處:http://blog.csdn.net/iAm333

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.