攔截器是一種強大的方法在應用程序捕捉運行方法和解耦。攔截器能夠攔截任何java類型的調用.
這使得攔截器適合解決事務管理,安全性,以及日記記錄.
本質上說,攔截器並不知道他們截獲的實際語義事件.所以,攔截器並非很適合和系統的業務掛鉤.
而本章的裝飾器,則又不同.
裝飾器只截取調用某個Java接口,所以獲知這個接口的全部語義鏈接。
decorator直接實現與業務語義操做,這也意味着裝飾沒有攔截器的通用性。
攔截器和修飾符,儘管在不少方面類似,是互補的。但decorator沒法解決技術問題,橫跨許多不一樣的類型。java
用@Decorator標註一個bean(甚至多是一個抽象類),這樣就代表此類是裝飾器. 正則表達式
@Decorator public abstract class LargeTransactionDecorator implements Account { ... }
裝飾器的裝修類型實現方法,可讓他攔截他想要攔截的.設計模式
@Decorator public abstract class LargeTransactionDecorator implements Account { @Inject @Delegate @Any Account account; @PersistenceContext EntityManager em; public void withdraw(BigDecimal amount) { ... } public void deposit(BigDecimal amount); ... } }
攔截器的功能是定義在Java攔截器規範。數組
攔截器規範定義了三種攔截點: 安全
在容器的生命週期中進行攔截 cookie
public class DependencyInjectionInterceptor { @PostConstruct public void injectDependencies(InvocationContext ctx) { ... } }
EJB超時時使用的攔截器 session
public class TimeoutInterceptor { @AroundTimeout public Object manageTransaction(InvocationContext ctx) throws Exception { ... } }
在業務上,對某一個Bean的方法進行攔截 app
public class TransactionInterceptor { @AroundInvoke public Object manageTransaction(InvocationContext ctx) throws Exception { ... } }
@AroundInvoke註釋指定了要用做攔截器的方法,攔截器方法與被攔截的業務方法執行同一個java調用堆棧、同一個事務和安全上下文中。用@AroundInvoke註釋指定的方法必須遵照如下格式:public Object XXX(javax.interceptor.InvocationContext ctx) throws Exception 框架
一、EL語言(CDI與表達式語言(EL)集成,容許在JavaServer Faces頁面或JavaServer Pages頁面中直接使用任何組件)post
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} => false
2.SpEL
1)Spring框架的表達式語言(簡稱SpEL):是一個支持運行時查詢和操做對象圖的強大的表達式語言。SpEL 爲 bean 的屬性進行動態賦值提供了便利.
2)語法:SpEL 使用 #{…} 做爲定界符,全部在大框號中的字符都將被認爲是 SpEL
3)運用範圍:
a. 對 bean 進行引用,調用屬性值:#{book.name}
b.調用方法以及引用對象中的屬性
引用方法:#{dog.run()},引用靜態方法:#{T(java.lang.Math).PI}
引用對象的屬性:#{user.name}
c.計算表達式的值
加減乘除:#{counter.total + 40},#{T(java.lang.Math).PI * 2}
加號做爲字符串鏈接符:#{user.name + ' ' + user.address}
比較運算符(>,<,=,>=,<=,==,lt,gt,eq,le,ge):#{counter.total == 100},#{counter.total le 1000}
if-else條件判斷,三元運算符:#{user.name=='Tom' ? 'Jess'}
d.正則表達式的匹配(matches) #{user.name matches '^[a-zA-Z0-9_-]{4,16}$'}
e.字面量的表示:#{5},#{89.7},#{1e4},#{false}
可以使用單/雙引號做爲字符串表達符號:#{'Chuck'},#{"Chuck"}
Cdi中的event事件,是整個CDI的精華所在之一.其有點相似設計模式中的觀察者模式.但也有不一樣的地方.以下3點:
即用一種維護生產者和觀察者之間的分離代碼的方式,來產生和訂閱(即觀察)在應用程序中發生的事件。使用 javax.enterprise.event.Event 類建立事件,並使用 CDI 的 @Observes 標註訂閱處理事件。