CDI Features

 

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资源、持久化单元、持久化上下文、接口等等。

相关文章
相关标签/搜索