• 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.使用

    5.使用图解

      摘自:https://my.oschina.net/lunqi/blog/494702

    Decorator

    浅析 Decorator 模式,兼谈 CDI Decorator 注解

    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
    复制代码
  • 相关阅读:
    ABP文档翻译--值对象
    (转)SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步
    Sql Service 的job作业新建过程
    Python --- pyinstaller --- 打包成exe并更换图标
    基于树形检测器的多标志识别
    记录 TypeError: render() got an unexpected keyword argument 'renderer' 错误
    Dockerfile 关键字
    Go new 和 make的区别
    Go的数据类型
    Mac Go 环境变量配置
  • 原文地址:https://www.cnblogs.com/LeshengW/p/10722515.html
Copyright © 2020-2023  润新知