其實在學習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是可以的.實現如下
在實現的類里面@Remote@Local表示它們要實現的接口,我把兩個都放進去了,在NetBeans里面,會有錯誤的提示,提示內容如下:
Bean使用以下類做為本地和遠程業務接口:test1.HelloLocal
但是我編譯以后一樣是可以布署的,不知道別的EJB容器是否可以這樣做.jboss確實是可以的
好了,現在我們都定義好了,馬上把它們布署到JBOSS里面去吧.
布署完了之后,就開始開發我們的應用程序了,因為這個調用只涉及到一個方法,我們就不用去定義一個界面了.
我們簡單的程序如下.
這個時候,我們就可以看到,會有一個 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 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包就可以了.