jsp api 通過 <jsp:usebean> 操作允許從 jsp 容器內的四個不同作用域中存儲和檢索數據。jstl 通過提供用于指定和除去這些作用域中的對象的附加操作來擴展這一能力。此外,el 提供將這些對象作為限制了作用域的變量進行檢索的內置支持。特別地,任何出現在 el 表達式中但不對應于任何 el 隱式對象的標識符,都被自動假定為引用存儲在四個 jsp 作用域的其中某個中的對象,這四個作用域是:
·頁面作用域
·請求作用域
·會話作用域
·應用程序作用域
您可能還記得,只有在為特定請求處理頁面期間才能檢索存儲在該頁面作用域中的對象。如果對象是存儲在請求作用域中的,可以在處理所有參與處理某請求的頁面期間檢索這些對象(譬如在對某個請求的處理中遇到了一個或多個 <jsp:include> 或 <jsp:forward> 操作)。如果對象是存儲在會話作用域中的,則在與 web 應用程序的交互式會話期間,可以由用戶訪問的任何頁面檢索它(即,直到與該用戶交互相關聯的 httpsession 對象無效為止)。可以由任何用戶從任何頁面訪問存儲在應用程序作用域中的對象,直到卸載 web 應用程序本身為止(通常是由于關閉 jsp 容器所致)。
通過將字符串映射為期望作用域中的對象來將對象存儲到該作用域。然后,就可以通過提供相同字符串來從該作用域檢索該對象。在作用域的映射中查找字符串,并返回被映射的對象。在 servlet api 中,將此類對象稱為相應作用域的屬性。但是,在 el 的上下文中,也將與屬性相關聯的字符串看作變量的名稱,該變量通過屬性映射的方式獲得特定的值。
在 el 中,與隱式對象無關聯的標識符被認為是存儲在四個 jsp 作用域中的名稱對象。首先對頁面作用域檢查是否存在這樣的標識符,其次對請求作用域、然后對會話作用域、最后對應用程序作用域依次進行這樣的檢查,然后測試該標識符的名稱是否與存儲在該作用域中的某個對象的名稱匹配。第一個這樣的匹配作為 el 標識符的值被返回。通過這種方法,可以將 el 標識符看作引用限制了作用域的變量。
對于上述兩種情況,都可允許表達式出現在方括號中。對嵌套表達式求值的結果將被作為下標或鍵,用來檢索集合或數組的適當元素。和點運算符一樣,方括號運算符也可以遞歸應用。這使得 el 能夠從多維數組、嵌套集合或兩者的任意組合中檢索元素。此外,點運算符和方括號運算符還可以互操作。例如,如果數組的元素本身是對象,則可以使用方括號運算符來檢索該數組的元素,并結合點運算符來檢索該元素的一個特性(例如 ${ urls[3].protocol})。
假定 el 充當指定動態屬性值的簡化語言,el 存取器有一個有趣的功能(與 java 語言的存取器不同),那就是它們在應用于 null 時不拋出異常。如果應用 el 存取器的對象(例如,${ foo.bar} 和 ${ foo["bar"]} 中的 foo 標識符)是 null,那么應用存取器的結果也是 null。事實證明,在大多數情況下,這是一個相當有用的行為,不久您就會了解這一點。
目前,表達式語言僅可用于指定 jstl 定制標記中的動態屬性值。但 jstl 1.0 表達式語言的一個擴展已經被提出,會把它包括到 jsp 2.0 中去,眼下正在進行最后評審。這個擴展將允許開發人員通過自己的定制標記來使用 el。頁面作者將可以在目前允許使用 jsp 表達式的任何地方使用 el 表達式,譬如將動態值插入模板文本中:<p>your preferred time zone is ${ timezone}</p>。