天天看點

《Servlet和JSP學習指南》一3.6 動作

第三種句法元素是動作(action),它們被編譯成執行某個操作的java代碼,例如通路某個java對象,或者調用某個方法。本節讨論必須能被所有jsp容器支援的标準動作。除标準動作之外,還可以建立定制的标簽,用來執行某些操作。定制标簽将在第6章中讨論。

下面列舉部分标準動作。dobody和invoke這兩個标準動作将在第7章中讨論。

這個動作将建立一個與某個java對象相關的腳本變量。它是将表現邏輯與業務邏輯分隔開來的最容易的方法之一。但是有了像定制标簽和expression language這類技術之後,現在已經很少使用usebean了。

舉個例子。代碼清單3-9中的usebeantest.jsp頁面建立了一個java.util.date執行個體,并将它與腳本變量today關聯起來,之後将它用在一個表達式中。

《Servlet和JSP學習指南》一3.6 動作

在tomcat中,這個動作會被編譯成下面的代碼:

《Servlet和JSP學習指南》一3.6 動作

運作這個頁面之後,将會在浏覽器中輸出目前的日期和時間。

setproperty 動作是在一個java對象中儲存一個屬性,getproperty則是擷取一個java對象的屬性。舉個例子,代碼清單3-11中的getsetpropertytest.jsp頁面儲存和輸出employee類執行個體的firstname屬性,具體如代碼清單3-10所示。

《Servlet和JSP學習指南》一3.6 動作
《Servlet和JSP學習指南》一3.6 動作

include動作用于動态地包含另一個資源,它可以包含另一個jsp頁面、一個servlet或者一個靜态的html頁面。例如,代碼清單3-12中的jspincludetest.jsp頁面就是利用include 動作來包含menu.jsp頁面的。

《Servlet和JSP學習指南》一3.6 動作

了解include指令和include 動作之間的差別是很重要的。使用include指令時,這種包含是發生在頁面轉換的時候,例如jsp容器将頁面轉換成一個生成的servlet的時候。使用include 動作時,這種包含則是發生在請求的時候。是以,可以利用include 動作傳遞參數,而不是利用include指令。

第二個差別在于,使用include指令時,被包含資源的檔案擴充名并不重要。而使用include 動作時,檔案擴充名則必須為jsp,以便它能夠作為一個jsp頁面進行處理。例如,在include 動作中用jspf作為擴充名時,将會使得這個jsp segment被當作靜态檔案進行處理。

forward 動作是将目前頁面跳轉到另一個不同的資源。例如,下面的forward 動作就是将目前頁面跳轉到login.jsp頁面。

《Servlet和JSP學習指南》一3.6 動作

在jsp中錯誤處理支援得很好。你可以利用try語句處理java代碼,也可以指定一個頁面,讓它在應用程式遇到未捕捉的異常時顯示出來。那麼,一旦發生異常,使用者将會看到一張經過精心設計的頁面,解釋目前發生了什麼狀況,而不是用一條錯誤消息打發使用者,讓他們皺眉不已。

利用page指令的iserrorpage屬性,就可以把一個jsp頁面變成一個錯誤處理頁面,該屬性值必須為true。代碼清單3-13展示了這樣一個錯誤處理程式。

《Servlet和JSP學習指南》一3.6 動作

要防止未捕捉異常的其他頁面則必須使用page指令的errorpage屬性,将路徑引向屬性值指定的錯誤處理頁面。例如,代碼清單3-14中的buggy.jsp頁面就是利用了代碼清單3-13的錯誤處理程式。

《Servlet和JSP學習指南》一3.6 動作

如果運作這個buggy.jsp頁面,它就會抛出一個異常。但你不會看到servlet/jsp容器産生的錯誤消息,而是會看到errorhandler.jsp頁面顯示的内容。