- 浏览: 83237 次
最新评论
-
liang1022:
Groovy 腳本語言在功能上可以取代javax.script ...
JAVA6.0操作脚本语言 -
venus224:
感谢你!
是你让我进入了开发这个行业!
JAVA截屏程序(第四版) -
wendal:
不错嘛, 正好可以用上.
JAVA截屏程序(第四版) -
muqingren:
貌似没有贴完啊
日期选择器 -
keling:
第三、四版附件资源均找不到啦,可否也email一份给我学习下呀 ...
JAVA截屏程序(第四版)
今天主要是看了一下拦截器的实现,在EJB3.0里面,实现拦截非常简单.加一个注释就可以了,这样就可以随时监视某个方法的调用了,拦截器可以是拦截某一个方法也可以是拦截一个类的所有方法的.具体如下
首先写一个拦截器方法,拦截器方法并不需要实现什么接口,只要符合一定的规范就可以了,
规范是: Object xxxxx(InvocationContext context)throws Exception,其中xxxxx是方法名,可以自己取.然后用@AroundInvoke来注释这个方法
- /*
- * MyInterceptor.java
- *
- * Created on 2007年9月8日, 上午12:04
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
- package lbf.interceptor;
- import java.lang.reflect.Method;
- import java.util.Date;
- import javax.interceptor.AroundInvoke;
- import javax.interceptor.InvocationContext;
- import lbf.test1.Person;
- /**
- *
- * @author Admin
- */
- public class MyInterceptor {
- /**
- * Creates a new instance of MyInterceptor
- */
- public MyInterceptor() {
- }
- @AroundInvoke
- public Object myInter(InvocationContext context)throws Exception{
- if(context.getMethod().getName().equals("insertPerson")){
- System.out.println("插入新的Person被调用了");
- }else{
- System.out.println("其它方法被调用了");
- }
- return context.proceed();
- }
- }
然后,同样是声明远程接口和实现它的类,为了让拦截显得更有效果,我们声明一个实体Bean,把一个实体插入数据库是我们的工作,然后我们再拦截它,看看会怎么样
- /*
- * Person.java
- *
- * Created on 2007年9月7日, 下午10:46
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
- package lbf.test1;
- 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.Temporal;
- import javax.persistence.TemporalType;
- /**
- * 实体类 Person
- *
- * @author Admin
- */
- @Entity
- public class Person implements Serializable {
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- @Column(name="PersonID",nullable=false)
- private Integer id;
- @Column(name="PersonName",nullable=false,length=5)
- private String name;
- @Column(name="PersonAge")
- private int age;
- @Column(name="PersonSex",nullable=false,length=2)
- private String sex;
- @Column(name="PersonPhone",nullable=false,length=11)
- private String phone;
- @Column(name="PersonAddress",nullable=false,length=50)
- private String address;
- @Temporal(value = TemporalType.DATE)
- @Column(name="PersonBirthday")
- private Date birthday;
- /** Creates a new instance of Person */
- public Person() {
- }
- /**
- * 获取此 Person 的 id。
- * @return id
- */
- public Integer getId() {
- return this.id;
- }
- /**
- * 将此 Person 的 id 设置为指定的值。
- * @param id,新建 id
- */
- public void setId(Integer id) {
- this.id = id;
- }
- /**
- * 返回对象的散列代码值。该实现根据此对象
- * 中 id 字段计算散列代码值。
- * @return 此对象的散列代码值。
- */
- @Override
- public int hashCode() {
- int hash = 0;
- hash += (this.id != null ? this.id.hashCode() : 0);
- return hash;
- }
- /**
- * 确定其他对象是否等于此 Person。当且仅当
- * 参数不为 null 且该参数是具有与此对象相同 id 字段值的 Person 对象时,
- * 结果才为
true
。 - * @param 对象,要比较的引用对象
- * 如果此对象与参数相同,则 @return
true
; - * 否则为
false
。 - */
- @Override
- public boolean equals(Object object) {
- // TODO: Warning - this method won't work in the case the id fields are not set
- if (!(object instanceof Person)) {
- return false;
- }
- Person other = (Person)object;
- if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) return false;
- return true;
- }
- /**
- * 返回对象的字符串表示法。该实现根据 id 字段
- * 构造此表示法。
- * @return 对象的字符串表示法。
- */
- @Override
- public String toString() {
- return "lbf.test1.Person[id=" + id + "]";
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- public String getPhone() {
- return phone;
- }
- public void setPhone(String phone) {
- this.phone = phone;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
- /*
- * PersonBean.java
- *
- * Created on 2007年9月7日, 下午11:10
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
- package lbf.test1;
- import java.util.List;
- import javax.ejb.Remote;
- import javax.ejb.Stateless;
- import javax.interceptor.Interceptors;
- import javax.persistence.EntityManager;
- import javax.persistence.PersistenceContext;
- import javax.persistence.Query;
- import lbf.interceptor.MyInterceptor;
- /**
- *
- * @author Admin
- */
- @Remote(PersonDAO.class)
- @Stateless
- @Interceptors({MyInterceptor.class})
- public class PersonBean implements PersonDAO{
- @PersistenceContext
- private EntityManager em;
- /** Creates a new instance of PersonBean */
- public PersonBean() {
- }
- public boolean insertPerson(Person person) {
- try{
- em.persist(person);
- }catch(Exception exe){
- exe.printStackTrace();
- return false;
- }
- return true;
- }
- public String getPersonNameByID(int personid) {
- Person p=em.find(Person.class,personid);
- return p.getName();
- }
- public boolean updatePerson(Person person) {
- try{
- em.merge(person);
- }catch(Exception exe){
- exe.printStackTrace();
- return false;
- }
- return true;
- }
- public Person getPersonByID(int personid) {
- return em.find(Person.class,personid);
- }
- public List getPersonList(int max, int whichpage) {
- try {
- int index = (whichpage-1) * max;
- Query query = em.createQuery("from Person p order by personid asc");
- List list = query.setMaxResults(max).
- setFirstResult(index).
- getResultList();
- em.clear();//分离内存中受EntityManager管理的实体bean,让VM进行垃圾回收
- return list;
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
- }
- /*
- * PersonDAO.java
- *
- * Created on 2007年9月7日, 下午11:10
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
- package lbf.test1;
- import java.util.Date;
- import java.util.List;
- /**
- *
- * @author Admin
- */
- public interface PersonDAO {
- public boolean insertPerson(Person person);
- public String getPersonNameByID(int personid);
- public boolean updatePerson(Person person);
- public Person getPersonByID(int personid);
- public List getPersonList(int max,int whichpage);
- }
所有的类都定义好了,我们现在开始试用拦截器了
我们声明一个主类去调用PersonBean的一些方法
- /*
- * Main.java
- *
- * Created on 2007年9月7日, 下午10:37
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
- package lbf.client;
- import java.util.Date;
- import java.util.Properties;
- import javax.naming.InitialContext;
- import lbf.test1.Person;
- import lbf.test1.PersonDAO;
- /**
- *
- * @author Admin
- */
- public class Main {
- private InitialContext ctx;
- /** Creates a new instance of Main */
- public Main() {
- initContext();
- }
- private void initContext(){
- try{
- Properties props = new Properties();
- props.setProperty("java.naming.factory.initial",
- "org.jnp.interfaces.NamingContextFactory");
- props.setProperty("java.naming.provider.url", "localhost:1099");
- props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
- ctx = new InitialContext(props);
- }catch(Exception exe){
- exe.printStackTrace();
- }
- }
- private void doPerson(){
- try{
- PersonDAO dao=(PersonDAO)ctx.lookup("PersonBean/remote");
- Person pp=new Person();
- pp.setAddress("香莲里33号20C");
- pp.setAge(20);
- pp.setBirthday(new Date());
- pp.setName("千里冰封");
- pp.setPhone("12536214");
- pp.setSex("男");
- System.out.println("成功吗?"+dao.insertPerson(pp));
- }catch(Exception exe){
- exe.printStackTrace();
- }
- }
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- // TODO code application logic here
- Main main=new Main();
- main.doPerson();
- }
- }
在我们执行Main的时候,会看到JBOSS的标准输出会输出一句
"插入新的Person被调用了"
如果我们调用其它的方法,就会输出"其它方法被调用了"
到这里,我想到一个问题,我们拦截的时候只是为了输出这句话吗,我能不能拦截一些别的东西呢,比如,我保存Person的时候,如果Person的姓名不合法,我可不可以检查一下,然后再插入别的,或者我直接换掉原来的调用,调用我自己的东西.行吗?还是试一下先吧,我们把myInter方法换成如下的样子
- @AroundInvoke
- public Object myInter(InvocationContext context)throws Exception{
- if(context.getMethod().getName().equals("insertPerson")){
- System.out.println("插入新的Person被调用了");
- Method m=context.getMethod();
- Person person=new Person();
- person.setAddress("被换成的地址");
- person.setAge(10);
- person.setBirthday(new Date());
- person.setName("被换的名字");
- person.setPhone("1380606");
- person.setSex("男");
- return m.invoke(context.getTarget(),person);
- }else{
- System.out.println("其它方法被调用了");
- }
- return context.proceed();
- }
加了几句自己的东东,然后直接把要调用的Method取出来,自己去调用它.然后返回它所应该返回的东西
这个时候,你会发现,当你在调用PersonBean上的insertPerson的时候,你自己要插入的Person被我们改了,插入的是我们拦截器里面的Person.
使用拦截器如果只能这样的话,那岂不是也不太好,想像一下,如果我写一个类的时候,没有使用@Interceptors来注释它使用哪个拦截器,后来我又想拦截它了,岂不是要重新注释一下编译一下然后再布署?这样岂不是太麻烦了.有没有别的方法呢
方法当然有,那就是回归到最原始的用XML方法来配置,用XML方法配置以后,就不管你的Bean有没有使用@Interceptors来注释,它都会按照你声明的内容来进行拦截了,这样就比直接用注释灵活性大了很多了.XML的声明如下
- <!---->xml version="1.0" encoding="UTF-8"?>
- <ejb-jar xmlns = "http://java.sun.com/xml/ns/javaee"
- version = "3.0"
- xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
- <assembly-descriptor>
- <interceptor-binding>
- <ejb-name>PersonBeanejb-name>
- <interceptor-class>lbf.interceptor.MyInterceptorinterceptor-class>
- interceptor-binding>
- assembly-descriptor>
- ejb-jar>
这个XML名字叫做ejb-jar.xml,布署的时候,要把它放在META-INF文件夹里面.所有可以用注释来解决的,其实都可以用XML来配置,EJB3.0之前就是因为XML配置太麻烦才被人说的,我们也不希望完全使用XML来配置,但是在有些情况下,用XML来配置确实是比较灵活.不像用注释配置是硬编码class文件里面去的,如果要改的话,还得用源代码重新编译一下.而XML要改就方法多了,改了以后重新打一下包就可以了,所以是选择注释来配置还是XML来配置,就要看具体的要求了.
发表评论
-
七种映射关系
2006-12-17 23:25 2072直到现在我对映射关系都不是非常了解,希望以后有个更深的了解,今 ... -
一点小小的细节
2006-12-15 00:24 1216今天看到一本书上写的,有关定义实体BEAN的一些细节,直到今天 ... -
关于session bean的一些细节
2006-12-14 16:30 2530session BEAN一般用于操作 ... -
EJB中实现的AOP
2006-12-14 11:27 2903现在AOP是越来越流行了,面向切面的编程,呵呵,似乎比面向对象 ... -
实体BEAN的关联
2006-12-13 18:33 1474今天自己写了一个例子,有关实体BEAN的关联问题,我写的这个例 ... -
如何在应用程序中访问绑定的EJB?
2006-12-12 17:46 2448今天又有问题了,所有的例子都是在WEB页面里面调用EJB的,这 ... -
昨天的问题终于解决了
2006-12-11 17:08 1686唉,真是太高兴了.昨天 ... -
NBNB我爱你
2006-12-11 15:04 1398这几天一直都发现NB莫名奇妙的出一些错误,经常空指针异常,这不 ... -
确实不爽
2006-12-10 19:08 4762今天真是郁闷,每次都试不好,唉,话不多说,把代码帖出来吧 ja ... -
J2EE初学3
2006-12-10 16:24 1461stateless Session Bean与stateful ... -
EJB3.0规范解读(转)
2006-12-08 16:18 1442引言 在本文 ... -
J2EE初学2
2006-12-08 11:56 1224今天看到了实体BEAN,(Enti ... -
J2EE初学
2006-12-07 22:31 1557今天终于还是下定决心看看EJB,看着SPRING看了两天,觉得 ...
相关推荐
**企业级JavaBeans(EJB)初学者指南** 企业级JavaBeans(EJB)是Java平台上用于构建可扩展、安全且事务处理能力强的企业级应用程序的核心技术。EJB规范定义了一组组件模型,允许开发人员创建分布式、多层的服务器...
本教程针对EJB初学者,旨在通过分章节的示例代码帮助大家逐步掌握EJB的核心概念和技术。 1. **EJB概述** EJB是一种服务器端组件模型,它提供了事务管理、安全性、状态管理和并发控制等服务,以简化企业级应用程序...
### EJB初学者常有的十一个疑惑解析 #### 一、EJB与Java Bean的区别 在探讨EJB与Java Bean的区别之前,我们首先需要明确两者的基本概念。 **Java Bean**: - **定义**:Java Bean是一种可重用的组件,没有严格的...
### EJB3 最新学习教程知识点详解 #### 一、EJB3 概念与特点 **企业级JavaBean(EJB)**是Java...通过以上内容的学习,初学者可以系统地了解EJB3的核心概念、开发流程及高级特性,为进一步深入学习打下坚实的基础。
3. **EJB接口**: - **Business Interface**:客户端与bean交互的接口,定义了业务方法。 - **Home Interface**:在远程客户端上创建和查找bean的接口。 - **Remote Interface**:本地或远程客户端调用bean的方法...
【实战角度比较EJB2和EJB3的架构异同】 EJB,即Enterprise JavaBeans,是Java EE(企业版Java)平台的核心组件之一,用于构建可复用、分布式的服务器端应用程序。EJB2和EJB3是EJB技术的两个主要版本,它们在架构上...
本源代码主要向EJB初学者介绍JMS的使用,如何创建和初始化一个请求Requestor对象、如何初始化请求Requestor对象、如何建立一个会话和发送请求、如何打印出请求的过程信息、如何接受由反馈者replier发回的消息等。
### EJB 3.0 初学者必备知识点详解 #### 一、EJB 3.0 概述 **EJB (Enterprise JavaBeans)** 是Java平台为企业级应用程序提供的一种组件模型,它允许开发者以模块化的方式构建分布式网络计算的应用程序。EJB 3.0...
**EJB3(Enterprise JavaBeans 3)是Java EE(Enterprise Edition)平台中用于构建企业级应用程序的重要组件模型。这个PPT教程详细介绍了EJB3的各种核心概念和技术,旨在帮助学习者掌握EJB3的核心特性并能实际应用到...
EJB3的三本好书之三,也很不错的一本ejb3的书籍,是英文版,附带源代码,这本书的好处是与Mastering EJB 3ed有一定的继承性,可以对比来看. 3本书的地址 1. Beginning EJB3 Application Development From Novice to ...
3. **配置部署描述符**:使用`ejb-jar.xml`文件指定EJB的部署属性。 **部署到应用服务器** 1. **打包**:将EJB类及其依赖项打包成`ejb-jar`文件。 2. **配置**:在应用服务器中配置EJB的部署信息。 3. **部署**:...
"ejb3 带源码"的资源,如"Mastering EJB3"和"Beginning EJB3 Application Development"等,提供了深入学习和实践EJB3技术的宝贵材料。 1. **EJB3核心概念**: - **实体Bean(Entity Bean)**:代表数据库中的持久...
第1篇对EJB编程基础进行介绍,它概要性地对EJB进行了阐述,无论是EJB初学者,还是资深EJB专家,这部分内容都值得阅读;第2篇重点关注EJB编程的具体内容和过程,其中,研究了如何开发如下三种EJB组件:会话Bean、实体Bean和...
**EJB3基础教程** Enterprise JavaBeans(EJB)是Java平台上用于构建可扩展、安全且事务处理能力强的服务器端应用程序的重要技术。EJB3是EJB规范的一个重大改进版本,它极大地简化了开发过程,引入了许多现代编程...
**EJB3(Enterprise JavaBeans 3.0)**是Java EE平台中的核心组件,它为企业级应用提供了服务器端的组件模型。EJB3引入了许多重大的改进,使其变得更加轻量级,降低了开发复杂性,使得开发者能够更专注于业务逻辑而...
**ejb3进阶案例详解** ejb3(Enterprise JavaBeans 3.0)是Java EE平台中的核心组件之一,它极大地简化了企业级应用程序的开发。ejb3引入了许多新特性和改进,使得开发人员可以更加高效地构建可扩展、可维护的企业...
**EJB3应用实例** EJB(Enterprise JavaBeans)3是Java EE(Enterprise Edition)平台中的核心组件之一,主要用于构建可扩展、可移植且高度模块化的企业级应用程序。EJB3引入了许多重大改进,简化了开发流程,降低...
这个压缩包文件"**EJB3 入门经典 源码**"很可能是为了帮助初学者理解并学习EJB3的基本概念、设计模式和实际应用。 EJB3的主要特点包括: 1. **注解驱动(Annotation-Based)**:EJB3引入了注解,使得开发者无需...
《EJB 3 in Action》是一本专门为初学者和开发者设计的EJB3技术指南,旨在深入浅出地介绍企业级Java Bean(EJB)3的核心概念、开发流程及部署策略。EJB3是Java EE平台中的核心组件,它极大地简化了企业级应用的开发...