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;
}
}
* 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 " ));
}
}
* 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的浓香.