posts - 0, comments - 77, trackbacks - 0, articles - 356
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

EJB初学日记(2)

Posted on 2007-09-18 21:28 semovy 阅读(221) 评论(0)  编辑  收藏 所属分类: EJB
其实在学习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包就可以了.

只有注册用户登录后才能发表评论。


网站导航: