EJB初学日记(2)

EJB初学日记(2)
其实在学习EJB之前,就听说过EJB,有人说他很复杂,也有人说一般般而已,但是几乎所有的人都说EJB3.0确实是简单了许多.
一般讲起JAVA EE,一般人都认为是应用在网页里面的,甚至有人把JAVA EE和JSP等同起来,要知道,JAVA EE是一个很庞大的结构,而JSP只是里面一部份中的一部份而已.

今天我就把JAVA EE的EJB应用到JAVA SE中看一看,在JBOSS里面布署好EJB,然后在swing里面调用EJB,并且观察一些特性.

首先我们先定义一个EJB的接口,接口里面放上我们需要远程调用的方法
在定义接口的时候,可以给它加上@Remote或者@Local注释,表示是远程还是本地,也可以什么都不加,就是一个很普通的接口,然后在实现的时候加上相应的注释,我们就采取第二种,也就是接口的定义里面什么注释都没有


package  test1;
/**
 * This is the business interface for Hello enterprise bean.
 
*/
public   interface  HelloLocal {
    
public  String helloFromLocal(String s);
}


package  test1;

import  javax.ejb.Remote;


/**
 * This is the business interface for Hello enterprise bean.
 
*/
public   interface  HelloRemote {
    
public  String helloFromRemote(String s);
}

以上是两个接口, 一开始是拟做本地调用和远程调用的两个接口,后来我想,能不能让一个接口既是本地接口也是远程接口呢,在JBOSS是可以的.实现如下
/*
 * HelloBean.java
 *
 * Created on 2007年9月6日, 下午6:02
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 
*/

package  test1;

import  javax.ejb.Local;
import  javax.ejb.Remote;
import  javax.ejb.Stateless;
import  javax.swing.JOptionPane;

/**
 *
 * 
@author  hadeslee
 
*/
@Stateless
@Remote({HelloLocal.
class ,HelloRemote. class })
@Local({HelloLocal.
class ,HelloRemote. class })
public   class  HelloBean  implements  test1.HelloRemote, test1.HelloLocal {
    
private   int  i = 0 ;
    
/**  Creates a new instance of HelloBean  */
    
public  HelloBean() {
    }

    
public  String helloFromRemote(String s) {
        i
++ ;
        System.out.println(
" " + i + " 次调用 " );
        System.out.println(
" 来自远程的问侯: " + s);
        
return   " 远程返回: " + s + " : " + i;
    }

    
public  String helloFromLocal(String s) {
        i
++ ;
        System.out.println(
" " + i + " 次调用 " );
        JOptionPane.showMessageDialog(
null , " 来自本地的问侯: " + s); 
        System.out.println(
" 来自本地的问侯: " + s);
        
return   " 本地返回: " + s + " : " + i;
    }
    
}

在实现的类里面@Remote@Local表示它们要实现的接口,我把两个都放进去了,在NetBeans里面,会有错误的提示,提示内容如下:
Bean使用以下类做为本地和远程业务接口:test1.HelloLocal
但是我编译以后一样是可以布署的,不知道别的EJB容器是否可以这样做.jboss确实是可以的

好了,现在我们都定义好了,马上把它们布署到JBOSS里面去吧.

布署完了之后,就开始开发我们的应用程序了,因为这个调用只涉及到一个方法,我们就不用去定义一个界面了.
我们简单的程序如下.
/*
 * TestHello.java
 *
 * Created on 2007年9月6日, 下午6:06
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 
*/

package  testejb;

import  java.util.Properties;
import  javax.naming.InitialContext;
import  test1.HelloLocal;
import  test1.HelloRemote;

/**
 *
 * 
@author  hadeslee
 
*/
public   class  TestHello {
    
    
/**  Creates a new instance of TestHello  */
    
public  TestHello() {
    }
    
public   static   void  main(String[] args)  throws  Exception{
        
        Properties props 
=   new  Properties();
        
// 这些是JBOSS的初始化一些参数
        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 " );
        InitialContext ctx;
        ctx 
=   new  InitialContext(props);
        
// 找到远程接口,这时其实也可以转成HelloLocal
        HelloRemote hello  =  (HelloRemote) ctx.lookup( " HelloBean/remote " );
        System.out.println(hello.helloFromRemote(
" 千里冰封 " ));
        
// 可以直接转型过来
        HelloLocal local = (HelloLocal)hello;
        System.out.println(local.helloFromLocal(
" hadeslee " ));
        
    }
}

这个时候,我们就可以看到,会有一个 JOptionPane弹出来,点了确定之后,客户端这边才会有输出,JOpitonPane出来之后不一定在最前端显示,所以可能需要找一下,就是因为这个问题搞得我糊涂了一下,我找了半天找不到,后来一个一个窗口的最小化,终于发现了JOptionPane在那里.

为了能运行客户端,你需要把如下的JAR包放到运行客户端的classpath里面,如果是用NetBeans开发的话,加入一个库可以了,库里面包含的JAR文件如下:
[jboss安装目录]\client\commons-logging.jar
[jboss安装目录]\client\ concurrent.jar
[jboss安装目录]\client\ ejb3-persistence.jar
[jboss安装目录]\client\ hibernate-annotations.jar
[jboss安装目录]\client\ hibernate-client.jar
[jboss安装目录]\client\ javassist.jar
[jboss安装目录]\client\ jboss-annotations-ejb3.jar
[jboss安装目录]\client\ jboss-aop-jdk50-client.jar
[jboss安装目录]\client\ jboss-aspect-jdk50-client.jar
[jboss安装目录]\client\jboss-common-client.jar
[jboss安装目录]\client\ jboss-ejb3-client.jar
[jboss安装目录]\client\ jboss-ejb3x.jar
[jboss安装目录]\client\jboss-j2ee.jar
[jboss安装目录]\client\jboss-remoting.jar
[jboss安装目录]\client\jbosssx-client.jar
[jboss安装目录]\client\jboss-transaction-clie
[jboss安装目录]\client\jnp-client.jar
[jboss安装目录]\client\trove.jar
[jboss安装目录]\client\jbossws-client.jar
[jboss安装目录]\client\jboss-jaxws.jar
[jboss安装目录]\client\xmlsec.jar

这样的话,就可以把EJB布署在EJB容器里面,而我们可以在任何地方调用它了.只要你在想调用的地方,带上上面的JAR包就可以了.


尽管千里冰封
依然拥有晴空

你我共同品味JAVA的浓香.

你可能感兴趣的:(EJB初学日记(2))