EL/SpELjava
一、EL語言(CDI與表達式語言(EL)集成,容許在JavaServer Faces頁面或JavaServer Pages頁面中直接使用任何組件)web
1)概述;
EL是JSP內置的表達式語言,用以訪問頁面的上下文以及不一樣做用域中的對象 ,
取得對象屬性的值,或執行簡單的運算或判斷操做。EL在獲得某個數據時,會自動進行數據類型的轉換。
使用EL表達式輸出數據時,若是有則輸出數據,若是爲null則什麼也不輸出。數組
2)語法:
a.EL表達式老是放在{}中,並且前邊有一個$做爲前綴:${}
b.獲取對象的屬性值能夠直接經過「對象.屬性名」:${user.name};
注意:這裏的屬性名是get和set方法對應的屬性值,並非對象中的變量名。
c.獲取對象的屬性也能夠經過「對象[「屬性名」]」:${user["name"]}
d.獲取Map中屬性時能夠以直接經過屬性的key:${map.key},${map[key]}
e.在指定域中獲取屬性:
在EL表達式中若是咱們直接使用屬性名如:${user},它將會在四個域中由小到大依次查找。
順序:pageScope、requestScope、sessionScope、applicationScope。
也能夠指定從哪一個域中獲取:
${ pageScope .user }:當前頁面
${requestScope.user}:當前請求
${sessionScope.user}:當前會話
${sessionScope.user}:當前應用安全
3)EL中包含11個隱含對象,這些對象能夠在EL表達式中直接使用:
a.pageContext,和JSP中的pageContext功能同樣
b.請求域:pageScope/requestScope/sessionScope/applicationScope
c.請求參數,參數對象主要用於獲取get或post請求中的參數:
param:獲取指定的請求參數,${param.username}
paramValues:獲取請求參數數組,如:${paramValues.sport[1]}
d.其餘:header/headerValues/initParam/cookie服務器
4)EL支持數學運算和邏輯運算:
a.加減乘除:${17+5} => 22
b.取餘%或mod:${17%5} => 2
c.比較運算符>,<,==,!=,<=,>=,eq,ne,lt,gt,le,ge:${3>5}或${3 gt 5} =>false
d.邏輯比較 &&或and,!或not,||或or,empty:${!true} => falsecookie
上下文session
要徹底瞭解什麼是上下文,咱們首先須要明白web應用是怎樣運行的。現代計算機應用是可對話性質的,用戶發送請求開始啓動應用,傳入一些預約的數據單元,直到最後一個預先定義的工做完成,請求會接收到反饋輸出。這一過程當中在計算機和終端用戶之間存在着一些來回往復,計算機應用程序與用戶必須進行屢次交互,積累和處理數據直到它能夠構造出所指望的輸出。應用程序必須維護當前用戶的數據狀態,直到應用程序終止,這種類型的應用被認爲是「有狀態的」。Web應用程序使基於HTTP寫的,HTTP其自己是無狀態的,它是一種請求/響應協議,其中事務的狀態只有在一個請求的處理過程當中是活躍的。JEE服務器經過提供數據結構保存有狀態的數據來確保應用的「有狀態性」。當web應用程序使用Servlet規範,應用程序生命週期是可實現的,在生命週期的不一樣部分,有一些明肯定義的數據的範圍,咱們稱之爲上下文,具體包括:數據結構
Application - 應用程序上下文,即數據在應用程序上下文中可用。換句話,數據在應用程序部署到應用程序卸載或刪除這段時間可用。這是最高級別的上下文。
Session - 會話上下文,即數據存儲在會話中,數據只有在會話被某一用戶建立到會話被移除這段時間內被這個用戶可用。
Request - 請求上下文,數據只有在同一個用戶的同一個請求中可用,當請求返回,數據再也不被服務器維護。
Conversation - CDI新增長的上下文,它的做用範圍是同一個會話上下文的幾個請求的總和。以下圖所示爲Conversation示意圖:app
依賴注入函數
組件不作定位查詢,只提供普通的Java方法讓容器去決定依賴關係。容器全權負責的組件的裝配,它會把符合依賴關係的對象經過JavaBean屬性或者構造函數傳遞給須要的對象。經過JavaBean屬性注射依賴關係的作法稱爲設值方法注入(Setter Injection);將依賴關係做爲構造函數參數傳入的作法稱爲構造器注入(Constructor Injection)。
Spring經過DI(依賴注入)實現IOC(控制反轉),經常使用的注入方式主要有三種:構造方法注入,setter注入,基於註解的注入。
其餘CDI的特性
除了上下文和依賴注入外,CDI還提供了一些其餘特性:
EL表達式的擴展:CDI中默認支持EL表達式並對其進行了擴展,好比在JSF或JSP中,默認是不支持EL表達式傳參的,若是結合CDI,那麼就能夠在EL表達式中傳參數給後臺Bean。
攔截器:CDI提供了一個十分方便的方法來實現一個或多個攔截器,用來處理 cross-cutting concerns such as logging
裝飾器:裝飾器可讓你動態的擴展或者重寫現有的業務接口。這個功能十分方便,在CDI中,你在調用一個接口的實現類的時候,無須關心這個實現類的名稱,因此在你更換新的實現的時候無需去修改你的代碼,只須要在新的接口上面經過裝飾器聲明你要替換的以前的接口實現,而後在 bean.xml 中聲明一下便可。
事件:CDI 提供了一種鬆耦合性的事件發送和接受機制。好比,在用戶登錄後,咱們須要在Session中存放一些用戶信息。有了這個機制,咱們不須要在登錄的那個方法中 經過new一個Session範圍的對象或者把一些數據放入Session中,這樣修改這些方法的時候,咱們就得去修改這個登錄方法的。或者說 咱們忽然須要在用戶登錄後,額外作一些事情,咱們又得去修改登錄這塊的代碼。 在CDI中,咱們能夠在登錄成功後,發送出一個登錄成功的事件,而後咱們能夠在任何類中來接受這個事件,來完成對應的工做。
類型安全:CDI不在經過字符串名稱來注入對象,而經過java類型來肯定被注入的對象。當只是經過java類型還不能肯定到底哪個對象被注入的時候,你能夠經過擴展 @Qualifier 註解來限定你須要注入的對象。
註解:CDI中全部的注入都是經過註解來完成的,XML相關的配置很是少
普通的Java Bean :在CDI中基本上全部的 Java Bean 均可以被注入。固然包括:EJB、JNDI資源、持久化單元、持久化上下文、接口等等。