`
bclxz520
  • 浏览: 66003 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

(EJB3.0学习笔记三)拦截器(Interceptor)

阅读更多
拦截器可以监听程序的一个或所有方法.拦截器对方法调用流提供了细粒度控制.可以在无状态会话 bean,有状态会话 bean 和消息驱动 bean 上使用它们.拦截器可以是同一 bean 类中的方法或是一个外部类.
下面介绍如何在Session Bean类中使用外部拦截器类.
HelloChinaBean.java
 
  1. package com.foshanshop.ejb3.impl;  
  2.   
  3. import com.foshanshop.ejb3.HelloChina;  
  4. import com.foshanshop.ejb3.HelloChinaRemote;  
  5.   
  6.   
  7. import javax.ejb.Local;  
  8. import javax.ejb.Remote;  
  9. import javax.ejb.Stateless;  
  10. import javax.interceptor.Interceptors;  
  11.   
  12. @Stateless  
  13. @Remote ({HelloChinaRemote.class})  
  14. @Local(HelloChina.class)  
  15. @Interceptors({HelloInterceptor.class})   
  16. public class HelloChinaBean implements HelloChina,HelloChinaRemote {  
  17.   
  18.     public String SayHello(String name) {  
  19.         return name +"说:你好!中国.";  
  20.     }  
  21.   
  22.     public String Myname() {          
  23.         return "我是佛山人";  
  24.     }  
  25.   
  26. }  

@Interceptors 注释指定一个或多个在外部类中定义的拦截器.上面拦截器HelloInterceptor对HelloChinaBean中
的所有方法进行监听.

HelloInterceptor.java
 
  1. package com.foshanshop.ejb3.impl;  
  2.   
  3. import javax.interceptor.AroundInvoke;  
  4. import javax.interceptor.InvocationContext;  
  5.   
  6.   
  7. public class HelloInterceptor {  
  8.   
  9.     @AroundInvoke  
  10.     public Object log(InvocationContext ctx) throws Exception {  
  11.         System.out.println("*** HelloInterceptor intercepting");  
  12.         long start = System.currentTimeMillis();  
  13.         try{  
  14.             if (ctx.getMethod().getName().equals("SayHello")){  
  15.                 System.out.println("*** SayHello 已经被调用! *** " );  
  16.             }              
  17.             if (ctx.getMethod().getName().equals("Myname")){  
  18.                 System.out.println("*** Myname 已经被调用! *** " );  
  19.             }              
  20.             return ctx.proceed();  
  21.         }catch (Exception e) {  
  22.             throw e;  
  23.               
  24.         }finally {  
  25.             long time = System.currentTimeMillis() - start;      
  26.             System.out.println("用时:"+ time + "ms");  
  27.         }  
  28.     }  
  29. }  



@AroundInvoke 注释指定了要用作拦截器的方法.用@AroundInvoke注释指定的方法必须遵守以下格式:
public Object XXX(InvocationContext ctx) throws Exception
XXX代表方法名可以任意.
下面是HelloChinaBean的本地及远程业务接口
HelloChinaRemote .java
 
  1. package com.foshanshop.ejb3;  
  2.   
  3. public interface HelloChinaRemote {  
  4.     public String SayHello(String name);  
  5.       
  6.     public String Myname();  
  7. }  
HelloChina.java
 
  1. package com.foshanshop.ejb3;  
  2.   
  3. public interface HelloChina  extends HelloChinaRemote{  
  4.   
  5. }  

除了可以在外部定义拦截器之外,还可以将Session Bean中的一个或多个方法定义为拦截器.
HelloChinaBean.java
 
  1. package com.foshanshop.ejb3.impl;  
  2. import com.foshanshop.ejb3.HelloChina;  
  3. import com.foshanshop.ejb3.HelloChinaRemote;  
  4. import javax.ejb.Local;  
  5. import javax.ejb.Remote;  
  6. import javax.ejb.Stateless;  
  7. import javax.interceptor.AroundInvoke;  
  8. import javax.interceptor.InvocationContext;  
  9. @Stateless  
  10. @Remote ({HelloChinaRemote.class})  
  11. @Local(HelloChina.class)  
  12. public class HelloChinaBean implements HelloChina,HelloChinaRemote {  
  13. public String SayHello(String name) {  
  14. return name +"说:你好!中国.";  
  15. }  
  16. public String Myname() {  
  17. return "我是佛山人";  
  18. }  
  19. @AroundInvoke  
  20. public Object log(InvocationContext ctx) throws Exception {  
  21. try{  
  22. if (ctx.getMethod().getName().equals("SayHello")){  
  23. System.out.println("*** HelloChinaBean.SayHello() 已经被调用! *** " );  
  24. }  
  25. if (ctx.getMethod().getName().equals("Myname")){  
  26. System.out.println("*** HelloChinaBean.Myname() 已经被调用! *** " );  
  27. }  
  28. return ctx.proceed();  
  29. }catch (Exception e) {  
  30. throw e;  
  31. }  
  32. }  
  33. }  

上面只需一个@AroundInvoke 注释就指定了要用作拦截器的方法.  
分享到:
评论
1 楼 sjtde 2007-07-02  
呵呵,我也在学习中,不过我发现在拦截器中,拦截摸个方法的同时还可以修改此方法传入参数的值,不知真正用的时候能用在那些方面?希望能指导一下

相关推荐

    EJB学习笔记、运行机制

    【EJB学习笔记、运行机制】 企业级程序(Enterprise Application)是围绕商业目的设计的,具有分布分层的程序架构。这种类型的程序旨在满足大型企业的复杂需求,通常涉及多个组件和层,确保系统的稳定性和可扩展性...

    EJB3笔记代码

    本笔记代码主要涵盖了EJB3的一些核心特性,包括定时任务(timer)、会话bean(session)、实体bean(entity)、拦截器(interceptor)、领域模型(domain)、客户端(client)、事务管理(transaction)、消息传递...

    struts2 学习重点笔记

    **2.4 拦截器(Interceptor)** - **作用**:在业务 Action 执行前后进行一系列的操作,如验证、数据填充等。 - **类型**: - **默认拦截器栈**:包含了常用的拦截器,如参数填充、验证等。 - **自定义拦截器**:...

    struts2学习笔记

    ### Struts2学习笔记 #### 一、Java EE三大组件及Struts2框架介绍 **Java EE三大组件**包括:Servlet、JSP 和 EJB。 1. **Servlet**:Servlet 是 Java 平台上的服务器端应用程序接口,它主要用于扩展协议服务的...

    软件工程师学习笔记J2EE

    笔记可能介绍了Struts的工作原理、Action类、配置文件、Interceptor(拦截器)以及Struts2的使用。 9. **JDBC.doc**: JDBC(Java Database Connectivity)是Java连接数据库的标准API。笔记可能涵盖了连接数据库、...

    J2EE框架+MLDN_J2EE框架_笔记.rar

    Struts还提供了一系列的拦截器(Interceptor),可以进行数据验证、事务管理等操作。 2. **Hibernate框架** Hibernate是一个对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。通过Hibernate,开发者...

    林信良struts笔记

    9. **Interceptor(拦截器)**:拦截器是Struts2引入的一个强大特性,它在Action执行前后插入一系列预定义或自定义的方法,可以实现事务管理、日志记录、权限控制等功能。 学习Struts,除了理解这些核心组件外,还...

    软件工程师下午考试笔记

    了解Action、Form Bean、Struts配置文件以及Interceptor(拦截器)的工作原理是必要的。 除了上述技术,考生还应该熟悉部分面试题的答案,因为实际考试可能包含对实际问题解决能力的评估。通过阅读和理解这些笔记,...

    51CTO下载-java笔记2

    学习Struts要掌握ActionForm、Struts配置文件、Interceptor拦截器、国际化和异常处理。 【Ajax】 Ajax(Asynchronous JavaScript and XML)是一种在无需刷新整个页面的情况下更新部分网页的技术。它通过JavaScript...

    java从零基础到精通的整个详细笔记(2012版)

    学习Struts需要理解Action、Form Bean、ActionServlet、配置文件struts-config.xml以及Interceptor(拦截器)的工作原理。 【Spring】 Spring框架是一个全面的企业级应用开发框架,包含了依赖注入、AOP(面向切面...

    JAVA框架核心技术笔记

    Struts2是基于MVC(Model-View-Controller)设计模式的Web应用框架,它整合了WebWork的强大功能和Struts1的优点,提供了更灵活的控制器,增强了Action和Result的可扩展性,支持拦截器(Interceptor)机制,使得业务...

Global site tag (gtag.js) - Google Analytics