`

8.EJB3的拦截器(外部类)

阅读更多

EJB3的拦截器的开步骤:

1.开发拦截器

   使用@AroundInvoke注释指定拦截器方法,方法格式为:

   public Object XXX(InvocationContext ctx) throws Exception

   其中,方法名XXX可以任意

2.在Session Bean中加入拦截器

   @Interceptors( { 拦截器一.class,拦截器二.class })

 

方法二:

直接在Session Bean中,编写拦截器方法(只拦截该会话):

   使用@AroundInvoke注释指定拦截器方法,方法格式为:

   public Object XXX(InvocationContext ctx) throws Exception

   其中,方法名XXX可以任意

 

例子:

一。实体Bean

package com.tao.ejb3.entity;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * 管理员
 * 
 * @author TaoistWar
 */
@Entity
@Table(name = "t_operator")
@SuppressWarnings("serial")
public class Operator implements Serializable {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column
	private Long id;

	/** 用户名 */
	@Column(length = 32, unique = true, nullable = false)
	private String username;

	/** 密码 */
	@Column(length = 16, nullable = false)
	private String password;
	
	/** 创建日期 */
	@Temporal(TemporalType.TIMESTAMP)
	private Date createDate;

	/** 最后修改日期 */
	@Temporal(TemporalType.TIMESTAMP)
	private Date lastEdit;

	/** 启用状态 true启用,false禁用 */
	@Column(length = 2, nullable = false)
	private Boolean enable = true;

	/** 最后登录 */
	@Temporal(TemporalType.TIMESTAMP)
	private Date lastLogin;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Date getCreateDate() {
		return createDate;
	}

	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}

	public Date getLastEdit() {
		return lastEdit;
	}

	public void setLastEdit(Date lastEdit) {
		this.lastEdit = lastEdit;
	}

	public Boolean getEnable() {
		return enable;
	}

	public void setEnable(Boolean enable) {
		this.enable = enable;
	}

	public Date getLastLogin() {
		return lastLogin;
	}

	public void setLastLogin(Date lastLogin) {
		this.lastLogin = lastLogin;
	}

}

 二、会话Bean

package com.tao.ejb3.service;

import javax.ejb.Remote;

import com.tao.ejb3.entity.Operator;

@Remote
public interface OperatorService  {
	public void save(Operator operator);
}

 

package com.tao.ejb3.service;

import javax.ejb.Local;

@Local
public interface OperatorServiceLocal extends OperatorService {

}

 

 

package com.tao.ejb3.service.bean;

import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import com.tao.ejb3.entity.Operator;
import com.tao.ejb3.interceptor.OperatorInterceptor;
import com.tao.ejb3.service.OperatorService;
import com.tao.ejb3.service.OperatorServiceLocal;

@Stateless
@Interceptors( { OperatorInterceptor.class })
public class OperatorServiceBean implements OperatorService,
		OperatorServiceLocal {
	@PersistenceContext(unitName="ejb3_unit")
	EntityManager em;

	public void save(Operator operator) {
		em.persist(operator);
	}

}

 

package com.tao.ejb3.service.bean;

import javax.ejb.Stateless;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import com.tao.ejb3.entity.Operator;
import com.tao.ejb3.service.OperatorService;
import com.tao.ejb3.service.OperatorServiceLocal;

@Stateless
public class OperatorServiceBeanWithInterceptor implements OperatorService,
		OperatorServiceLocal {
	@PersistenceContext(unitName = "ejb3_unit")
	EntityManager em;

	public void save(Operator operator) {
		em.persist(operator);
	}

	/**
	 * @AroundInvoke 注释指定了要用作拦截器的方法.用@AroundInvoke注释指定的方法必须遵守以下格式: 
	 * public Object XXX(InvocationContext ctx) throws Exception 
	 * XXX代表方法名可以任意.
	 */
	@AroundInvoke
	public Object log(InvocationContext ctx) throws Exception {
		long l1 = System.currentTimeMillis();
		try {
			if (ctx.getMethod().getName().equals("save")) {
				System.out.println("添加管理员");
			}
			return ctx.proceed();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			l1 = System.currentTimeMillis() - l1;
			System.out.println("执行时间:" + l1);
		}
	}
}
 

 三、拦截器

package com.tao.ejb3.interceptor;

import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

public class OperatorInterceptor {

	/**
	 * @AroundInvoke 注释指定了要用作拦截器的方法.用@AroundInvoke注释指定的方法必须遵守以下格式: public Object
	 *               XXX(InvocationContext ctx) throws Exception XXX代表方法名可以任意.
	 */
	@AroundInvoke
	public Object log(InvocationContext ctx) throws Exception {
		long l1 = System.currentTimeMillis();
		try {
			if (ctx.getMethod().getName().equals("save")) {
				System.out.println("添加管理员");
			}
			return ctx.proceed();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			l1 = System.currentTimeMillis() - l1;
			System.out.println("执行时间:" + l1);
		}
	}
}

四、测试

package com.tao.ejb3.test;

import java.util.Date;

import javax.naming.InitialContext;

import com.tao.ejb3.entity.Operator;
import com.tao.ejb3.service.OperatorService;

public class OperatorServericeBeanTest {

	public static void main(String[] args) {
		OperatorService cs = null;
		try {
			InitialContext ic = new InitialContext();
			Date date = new Date();
			/*cs = (OperatorService) ic.lookup("OperatorServiceBean/remote");
			Operator operator = new Operator();
			operator.setUsername("tao2008");
			operator.setPassword("123");
			operator.setCreateDate(date);
			operator.setLastEdit(date);
			operator.setLastLogin(date);
			operator.setEnable(true);
			cs.save(operator);*/
			
			cs = (OperatorService) ic.lookup("OperatorServiceBeanWithInterceptor/remote");
			Operator operator2 = new Operator();
			operator2.setUsername("Taoist2008");
			operator2.setPassword("123");
			operator2.setCreateDate(date);
			operator2.setLastEdit(date);
			operator2.setLastLogin(date);
			operator2.setEnable(true);
			cs.save(operator2);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("init error!");
		}
	}

}
 

注意:实体Bean的username惟一不能相同

代码的环境变量需加入EJB容器环境,本代码加的是JBoss_HOME/client下所有的jar

 

分享到:
评论

相关推荐

    EJB3+JPA开发总结

    - **外部拦截器**:定义在单独的类中,并通过`@Interceptors`注解指定给Session Bean使用。 **示例代码**: ```java @Interceptors({HelloInterceptor.class}) @Stateless public class StatelessService ...

    一个宠物商店,基EJB3分布技术开发

    EJB3相关的类可能包含实体bean(代表数据库中的表)、会话bean(实现业务逻辑)和服务接口等。同时,可能会有相关的部署描述符(如ejb-jar.xml、web.xml)以及Struts2的配置文件(struts.xml)。 综上所述,这个...

    EJB依赖注入的原理

    3. 方法级截获器:仅作用于指定的业务方法,不拦截生命周期事件。 4. bean级截获器:即自我截获器,截获器与EJB bean本身相同。 截获器调用顺序遵循一定的规则,如按照声明顺序调用同类别的截获器,优先调用父类的...

    EJB3.0实例教程

    - 介绍了EJB3中拦截器的功能和用途。 - 包括如何编写和使用自定义拦截器来增强会话Bean的行为。 - **依赖注入**: - 解释了依赖注入的概念及其在EJB3中的实现方式。 - 通过示例演示了如何利用依赖注入简化应用...

    EJB3.0中文文档

    **2.10 拦截器(INTERCEPTOR)** 用于在方法调用前后执行特定代码,例如日志记录或性能监控。 **2.11 依赖注入(DEPENDENCY INJECTION)** 依赖注入是一种设计模式,用于自动管理组件间的依赖关系,提高代码的可测试...

    EJB3.0实例教程 源代码

    拦截器是EJB3.0中的另一个强大功能,它们允许在方法调用前后插入自定义逻辑。`Interceptor`示例解释了如何创建自定义拦截器,并演示了在哪些操作(如调用、事务、生命周期方法等)中可以插入拦截。 #### 2.5 `...

    EJB3.0使用文档

    - **拦截器类**:实现事务逻辑的类,可以通过 `@Interceptors` 注解应用于特定的 EJB 或方法上。 - **实现步骤**: 1. 在类或方法前添加 `@Interceptors(XXX.class)` 注解。 2. 实现 `XXX.class` 注解中所引用的...

    Jboss EJB3.0 实例教程.pdf

    - **拦截器**:用于在方法调用前后执行特定逻辑,例如日志记录、性能监控等。 - **依赖注入**:自动装配Bean所需的资源和服务,减少代码复杂度。 - **定时服务**:支持定时任务的创建和管理,提高应用的灵活性。 - *...

    10.客户端——Struts 2+Spring+EJB架构实现

    Struts 2 提供了拦截器、主题和国际化、数据绑定等特性,增强了可扩展性和灵活性,使得应用程序更加模块化和易于维护。 Spring 框架则是一个全面的企业级应用开发框架,涵盖了依赖注入(DI)、面向切面编程(AOP)...

    在达内的EJB的PDF笔迹,和大家分享

    7. **给EJB增加功能**: 包括Bean调用、通用注解、依赖注入、拦截器等内容。 8. **实体Bean高级**: 探讨实体Bean更高级的应用场景。 9. **事务处理**: 讲解EJB中的事务处理机制。 10. **EJB中的安全**: 探讨如何在...

Global site tag (gtag.js) - Google Analytics