CDI Features

Posted railgun1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CDI Features相关的知识,希望对你有一定的参考价值。

EL/springEL:

●什么是EL表达式:

Expression Language————表达式语言

●EL表达式的作用

  获取数据

  执行运算

  获取Web开发常用对象

  执行Java方法

●获取数据:

<%
    User user = new User("旺财", "幸福路", 18);
    pageContext.setAttribute("pageContextUser", user);
    request.setAttribute("requestUser", user);
    session.setAttribute("sessionUser", user);
    application.setAttribute("applicationUser", user);
%>

<h2>获取page域对象</h2>
$pageContextUser.name----$pageContextUser.addr-----$pageContextUser.age
<br/>
$pageScope.pageContextUser.name----$pageScope.pageContextUser.addr-----$pageScope.pageContextUser.age
<hr />

<h2>获取request域对象</h2>
$requestUser.name----$requestUser.addr-----$requestUser.age
<br/>
$requestScope.requestUser.name----$requestScope.requestUser.addr-----$requestScope.requestUser.age
<hr />

<h2>获取session域对象</h2>
$sessionUser.name----$sessionUser.addr-----$sessionUser.age
<br/>
$sessionScope.sessionUser.name----$sessionScope.sessionUser.addr-----$sessionScope.sessionUser.age
<hr />

<h2>获取application域对象</h2>
$applicationUser.name----$applicationUser.addr-----$applicationUser.age
<br/>
$applicationScope.applicationUser.name----$applicationScope.applicationUser.addr-----$applicationScope.applicationUser.age
<hr />
<!-- 
    EL表达式获取数据的规律:
    1.EL表达式只能获取四大域对象的数据
    2.在没有指定获取哪个域的时候从小域到大域开始遍历获取
    3.当然也可以指定域:pageScope,requestScope,sessionScope,applicationScope
    4.所以如果把对象存在sessionScope或者applicationScope那么还是指定一下域,这样子EL表达式就不用遍历了
 -->
 
<hr />
<%
User user2 = new User("小强", "健康街", 28);
User[] users  = user,user2;
List<User> userList = new ArrayList<User>();
userList.add(user);
userList.add(user2);
pageContext.setAttribute("arrayUser", users);
pageContext.setAttribute("listUser", userList);
 %>
 
<h2>利用.和[]获取数组中的对象中的值</h2>
$pageScope.arrayUser[0].name ---$pageScope.arrayUser[0].addr ---$pageScope.arrayUser[0].age 
<br/>
$pageScope.arrayUser[1].name ---$pageScope.arrayUser[1].addr ---$pageScope.arrayUser[1].age 
<hr />

<h2>利用.和[]获取集合中的对象中的值</h2>
$pageScope.listUser[0].name ---$pageScope.listUser[0].addr ---$pageScope.listUser[0].age 
<br/>
$pageScope.listUser[1].name ---$pageScope.listUser[1].addr ---$pageScope.listUser[1].age 
<hr />

<h2>利用[]获取对象中的值</h2>
$pageScope.listUser[0]["name"] ---$pageScope.listUser[0]["addr"] ---$pageScope.listUser[0]["age"] 
<br/>
$pageScope.listUser[1]["name"] ---$pageScope.listUser[1]["addr"] ---$pageScope.listUser[1]["age"] 

<hr />
<!-- 
    EL表达式获取数据时.和[]的区别
    在集合或者数组中可以使用[]输入下标来直接获取值
    而.后面不能跟有数字,所以不能作为下标的获取标识来使用
    []中跟的值要么是数字,要么要用""引起来
    .后面跟的东西既不能是数字,也不能用""引起来
 -->
<hr />

●EL表达式获取在Web开发中常用的对象:

EL表达式的11个隐式对象

pageContext

pageScope

requestScope

SessionScope

ApplicationScope

cookie

initParam

param

paramValues

header

headerValues

注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]

$cookie.key取的是cookie对象,如访问cookie的名称和值,须$cookie.key.name或$cookie.key.value

 

●EL执行运算

 

$3+2*8+5/8

 

 

 

●简易版自定义函数编写配置方法:

 

    EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法。

 

    在EL表达式中调用的只能是Java类的静态方法。

 

    这个Java类的静态方法需要在TLD(Tagliary Definition)文件中描述,才可以被EL表达式调用。

 

    EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能。

 

1.编写调用自定义函数的类,编写类中具体实现的静态方法

 

2.编写tld文件在web-inf目录下

 

3.jsp中使用taglib指令导入自定义函数库

 

4.使用

Interceptor:

●让我们写一个简单的应用程序,让我们预订电影节目的门票。与所有应用程序一样,日志记录是我们所关注的一个跨领域问题。

(相关的片段是内联的,但您可以从提供的链接中查看完整的代码)

我们如何标记哪些方法被截获?注释类似的方法不是很方便吗?

@Log
public void aMethod()... 

让我们创建一个“标记”拦截方法的注释。

@InterceptorBinding
@Target( TYPE, METHOD )
@Retention(RUNTIME)
public @interface Log 

当然,你没有错过上面的@InterceptorBinding注释!现在我们已经创建了自定义注释,让我们将它附加(或者使用更好的术语,“绑定它”)到拦截器。

所以这是我们的日志拦截器。一个@AroundInvoke方法,我们差不多完成了

@Interceptor
@Log  //binding the interceptor here. now any method annotated with @Log would be intercepted by logMethodEntry
public class LoggingInterceptor 
    @AroundInvoke
    public Object logMethodEntry(InvocationContext ctx) throws Exception 
        System.out.println("Entering method: " + ctx.getMethod().getName());
        //or logger.info statement 
        return ctx.proceed();
    

现在我们创建的@Log注释绑定到这个拦截器。

完成后,让我们在课堂级别或方法级别进行注释,并进行有趣的拦截!

@Log
@Stateful
public class BookShow implements Serializable 
    private static final long serialVersionUID = 6350400892234496909L;
    public List<String> getMoviesList() 
        List<String> moviesAvailable = new ArrayList<String>();
        moviesAvailable.add("12 Angry Men");
        moviesAvailable.add("Kings speech");
        return moviesAvailable;
    
    public Integer getDiscountedPrice(int ticketPrice) 
        return ticketPrice - 50;
    
    // assume more methods are present

@Log在类级别应用的注释表示应该拦截所有方法LoggingInterceptor

在我们说“全部完成”之前,我们还剩下最后一件事!启用拦截器!

让我们快速提出一个[beans.xml文件]

<beans>
  <interceptors>
    <class>org.superbiz.cdi.bookshow.interceptors.LoggingInterceptor
    </class>
  </interceptors>
</beans>

在META-INF中

beans.xml中的那些行不仅“启用”拦截器,还定义了拦截器的“执行顺序”。但是我们会在另一个关于多cdi拦截器的例子中看到。

启动测试,我们应该在控制台中看到“输入方法:getMoviesList”。

Apache OpenEJB 4.0.0-beta-2    build: 20111103-01:00
http://tomee.apache.org/
INFO - openejb.home = /media/fthree/Workspace/open4/openejb/examples/cdi-simple-interceptors
INFO - openejb.base = /media/fthree/Workspace/open4/openejb/examples/cdi-simple-interceptors
INFO - Using javax.ejb.embeddable.EJBContainer=true 
INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
INFO - Found EjbModule in classpath: /media/fthree/Workspace/open4/openejb/examples/cdi-simple-interceptors/target/classes
INFO - Beginning load: /media/fthree/Workspace/open4/openejb/examples/cdi-simple-interceptors/target/classes
INFO - Configuring enterprise application: /media/fthree/Workspace/open4/openejb/examples/cdi-simple-interceptors
INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
INFO - Auto-creating a container for bean cdi-simple-interceptors.Comp: Container(type=MANAGED, id=Default Managed Container)
INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container)
INFO - Auto-creating a container for bean BookShow: Container(type=STATEFUL, id=Default Stateful Container)
INFO - Enterprise application "/media/fthree/Workspace/open4/openejb/examples/cdi-simple-interceptors" loaded.
INFO - Assembling app: /media/fthree/Workspace/open4/openejb/examples/cdi-simple-interceptors
INFO - Jndi(name="java:global/cdi-simple-interceptors/BookShow!org.superbiz.cdi.bookshow.beans.BookShow")
INFO - Jndi(name="java:global/cdi-simple-interceptors/BookShow")
INFO - Created Ejb(deployment-id=BookShow, ejb-name=BookShow, container=Default Stateful Container)
INFO - Started Ejb(deployment-id=BookShow, ejb-name=BookShow, container=Default Stateful Container)
INFO - Deployed Application(path=/media/fthree/Workspace/open4/openejb/examples/cdi-simple-interceptors)
Entering method: getMoviesList

 

测试:

以上是关于CDI Features的主要内容,如果未能解决你的问题,请参考以下文章

CDI Features

CDI Features

CDI FEATURES

CDI Features(EL(SPEL),Decorator,Interceptor,Producer)

具有相同功能的活动和片段

Java EE 6 和 CDI