拦截器是一种强大的方法在应用程序捕捉运行方法和解耦。拦截器能够拦截任何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 标注订阅处理事件。