`

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics