統一表達式語言
Java統一表達式語言(英語:Unified Expression Language,簡稱JUEL)是一種特殊用途的編程語言,主要在Java Web應用程序用於將表達式嵌入到web頁面。Java規範制定者和Java Web領域技術專家小組制定了統一的表達式語言。JUEL最初包含在JSP 2.1規範JSR-245中,後來成為Java EE 7的一部分,改在JSR-341中定義。
歷史
表達式語言是以JSTL(JavaServer Pages Standard Tag Library,JSP標準標籤庫)的一部分出現的,原本被叫做SPEL(Simplest Possible Expression Language,簡單的表達式語言),後來被稱作EL(Expression Language,表達式語言)。它是一種腳本語言,允許通過JSP訪問Java組件(JavaBeans)。自JSP 2.0以來,表達式語言已經被內置到JSP標籤中,用於從JSP中分離Java代碼,並允許(比用Java代碼)更方便訪問Java組件。
經過發展,表達式語言包含了更多的高級功能,並被包括在JSP 2.0規範內。對於有很少或幾乎沒有Java知識的網頁內容設計者而言,腳本的編寫變得更簡單了。表達式語言使JSP變成了真正意義上的腳本語言。在表達式語言出現之前,JSP包含了一些特定的標籤,Java代碼直接的寫在這些標籤里[1]。有了表達式語言,網頁內容設計者只需明白如何做出適當的Java方法調用,而無需編寫Java代碼。
EL在語法和語義上類似於JavaScript表達式:
- 無需類型轉換;轉換通常是隱式的完成
- 雙引號和單引號用法相同
object.property
與object['property']
的意義相同
EL也解放了程序員,讓程序員訪問object.property
時,不必清楚在訪問值時涉及的細節。[2]
JSP 2.0標準制定期間,JavaServer Faces標準的發布也需要一個表達式語言,但在JSP 2.0規範中定義的表達式語言不足以滿足JSF技術發展的需要。最突出的限制是表達式是被立即執行的。同時,JSF組件還需要一種途徑,來調用服務器端對象的方法。因而一個更強大的語言被制定出來,並具備以下新特性:
- 延期執行的表達式
- 表達式既可以設定數據,也可以獲得數據
- 可以調用方法的方法表達式
新的表達式語言符合JSF的需求,但JSP EL和JSF EL之間並不兼容。統一表達式語言計劃因此啟動。在JSP 2.1中,JSP 2.0和JSF 1.1的表達式語言已經合併成一個統一表達式語言[3](EL 2.1)。
EL 3.0在JSR-341 (頁面存檔備份,存於網際網路檔案館)中從JSP和JSF規範中獨立。新版本添加了一些新的特性,尤其是與Java 8的Streams和Lambda表達式相關的特性。[4]
示例
下面是統一表達式語言的一個簡單的例子:使用JSTL中「c:out」標籤:
<c:out value="${myBean.myField}" />
調用一個參數的方法的表達式:
${myBean.addNewOrder('orderName')}
實現
- JUEL (頁面存檔備份,存於網際網路檔案館)是一個統一表達式語言2.1版的開源實現。被認為是完整而穩定的,使用Apache許可協議2.0授權。JUEL也適用於非JSP應用。
- Apache Commons EL是來自於Apache的JSP 2.0 EL解釋器。
參見
- OGNL - 一個被WebWork和Apache Struts 2使用的開源的表達式語言。
- MVEL - 一個被眾多Java項目使用的開源的表達式語言。
- Apache Commons JEXL (頁面存檔備份,存於網際網路檔案館) - 一個旨在促進Java項目實現動態和腳本功能的開源的表達式語言。
- SpEL (頁面存檔備份,存於網際網路檔案館) - Spring表達式語言,一個開源的EL表達式語言,是Spring Framework的一部分。它主要用於Spring portfolio項目,但也可以用於其他項目。
參考文獻
- ^ 例如scriptlet「<% %>」,表達式「<%= %>」,等等。
- ^ 根據
object
的不同,object.property
可能意味着object.get("property")
、object.getProperty("property")
或object.getProperty()
等。 - ^ Scott Moore. Java EE 5:强大的功能、高生产率和低复杂性. IBM developerWorks. [2014-04-11]. (原始內容存檔於2015-09-20).
- ^ Standard Deviation: An Illustration of Expression Language 3.0 in Servlet Environment. (原始內容存檔於2013-09-27).