很多人说,不采用EJB的系统不算是J2EE系统。EJB到底有哪些用处,很难说清楚,一人一个说法。我要说的是EJB的
Session Bean,用在远程调用。说道远程调用,很多人联想到RMI,这个RMI是个笼统的概念,怎么实现就有很多选择了:
比如MBean,WebService等。显然,我这里选择的是ejb,就是SessionBean实现RMI。
工具:
NetBeans6.1及自带的GlassFishv2
可以在本机测试或者独立一台装有GlassFish的服务器
围绕SessionBean来说
1,建立SessionBean
直接在NetBeans里面建立一个EJB module,这个Module包含了我们想要远程调用的Bean。
既然如此,建立好Module后,Enterprise Beans-->new Session Bean就建立了Bean。
package dcampus;
import javax.ejb.Stateless;
/**
*/
@Stateless
public class JunSessionBean implements JunSessionRemote, JunSessionLocal {
public void saySomething() {
System.out.println("Hello,Test Bean");
}
public String getMessage() {
return "WHat is thsi";
}
// Add business logic below. (Right-click in editor and choose
// "EJB Methods > Add Business Method" or "Web Service > Add Operation")
}
如上是我的Bean内容,注意最后的一句注释,提示了Bean里面写方法的时候比较特殊,需要系统
自动生成,这样的好处是它会自动修改Bean对应的接口文件。在我建立Bean的时候实际上系统已经
自动生成了两个接口文件JunSessionLocal.java,JunSessionRemote.java,这和中间的选择有关,
这两个接口在后面可能会用到。
package dcampus;
import javax.ejb.Local;
/**
*
*/
@Local
public interface JunSessionLocal {
void saySomething();
String getMessage();
}
package dcampus;
import javax.ejb.Remote;
/**
*
*/
@Remote
public interface JunSessionRemote {
void saySomething();
String getMessage();
}
Bean写好了,build工程,注意会生成一个Jar文件,比如我工程名是EJBModule1,那么生成的是EJBModule1.jar
这个Jar也是Bean,我们部署Bean到GlassFish上就用这个jar文件。
2,部署:
启动GlassFish,通过网页登录进入配置页面EJBModules---->deploy,选择刚才打包好的jar文件,ok
3,访问Session Bean
说白了,就是远程调用,这是最终目的。
那么我们可以新建任意一个Java Application,选择导入的包,这些包都包含在GlassFish安装目录下:
- appserv-rt.jar
- javaee.jar
- appserv-deployment-client.jar
- appserv-ext.jar
- imqjmsra.jar
- appserv-admin.jar
另外,你还要导入原来的EJBModule项目,方法:右键-properties-libraries-add project
为什么要这个步骤?因为你在Application里面调用了SessionBean,要识别这个Bean,必须导入Bean Module
然后可以写访问方法了,我这里直接帖上来:
import java.io.FileInputStream;
import java.util.Properties;
import javax.naming.InitialContext;
import dcampus.JunSessionRemote;
public class RemoteEjb{
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.load(new FileInputStream("jndi.properties"));
System.out.println("prop");
InitialContext ctx = new InitialContext(props);
JunSessionRemote testEJB = (JunSessionRemote) ctx.lookup("dcampus.JunSessionRemote");
System.out.println(testEJB.getMessage());
testEJB.saySomething();
System.out.println("why");
}
}
注意前面的几句properties配置,可以看出用到了jndi.properties文件,这个文件目录是程序的根目录,内容是哪些呢?
java.naming.factory.initial = com.sun.enterprise.naming.SerialInitContextFactory
java.naming.factory.url.pkgs = com.sun.enterprise.naming
java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
#optional. Defaults to localhost. Only needed if web server is running
#on a different host than the appserver
org.omg.CORBA.ORBInitialHost = localhost
#optional. Defaults to 3700. Only needed if target orb port is not 3700.
org.omg.CORBA.ORBInitialPort = 3700
里面的配置是可以修改的,主要是org.omg.CORBA.ORBInitialHost = localhost,如果真的是“远程”调用,而不是本机测试,那么就要改成远程服务器IP,端口我想一般不会去改吧,要是改了就对应起来吧
这个jndi.properties文件也是可以不要的,那么配置时将上面若干行在程序里面直接写就好了,熟悉Context的应该知道怎么做。
OK,都好了,保证GlassFish已经Start后,run你新建的访问Session Bean的Application吧
正确结果如下:
Compiling 1 source file to E:/EJBTest/build/classes
prop
WHat is thsi
why
BUILD SUCCESSFUL (total time: 6 seconds)
还可以看看GlassFIsh端,最后3行:
LDR5010: All ejb(s) of [EJBModule1] loaded successfully!
Hello,Test Bean
Hello,Test Bean