使用glassfish开发ejb3的session bean
程序员文章站
2024-02-22 22:09:46
...
项目结构如下:
[img]/upload/attachment/123957/78e9cdf6-a1bf-3fd1-8eaa-628420183cde.gif[/img]
HelloWorldClient类是HelloWorld的ejb3客户端调用类
IHelloWorldRemote是接口(两年没做C++,还是喜欢C++的表示法)
HelloWorldBean是IHelloWorldRemote的实现类
所需的jar包如下:
appserv-deployment-client.jar
appserv-ext.jar
appserv-rt.jar
javaee.jar
这些jar包在glassfish_home/lib目录下均可找到
IHelloWorldRemote代码如下:
HelloWorldBean代码如下:
@Stateless标签表明这个类是一个无状态会话Bean,mappedName最好设置,理由后面解释
@Remote(IHelloWorldRemote.class)表明IHelloWorldRemote接口是一个远程接口,只能以远程方式来访问
至此,一个简单的EJB3会话Bean已完成,打包helloworld.jar
打开glassfish web控制台,部署helloworld.jar至“EJB模块”
HelloWorldBean的客户端调用代码:
当然这里由于glassfish是在本机所以Host设置为localhost,如果非本地,请改为对应IP
glassfish的EJB端口默认为3700,如果安装过程有改动,请改为对应端口
如果顺利的话,控制台将打印出:
Hey, Hello World!
如果客户端和服务器是在同一台机器上,客户端的调用代码可以简化为:
这是因为InitialContext默认会读取jndi.properties文件,而appserv-rt.jar包中提供了一个这样的jndi.properties文件。另外,Host默认是localhost,端口默认是3700。
至此,一个HelloWorld的EJB3无状态会话Bean已完成。
注意:
mappedName就是在InitialContext lookup时使用的名称。
如果我们不设置这个mappedName,那么部署后的EJB名称是什么呢?在jboss中将会是HelloWorldBean/remote,而在glassfish中将使用IHelloWorldRemote接口的全名,即my.ejb3.iface.IHelloWorldRemote(注意是接口的全名)。为了去掉这些不必要的麻烦,建议设置mappedName。
glassfish上开发ejb的一些参考资料:
[url]http://groups.google.com/group/glassfish_china/web/ejb[/url]
[url]https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#SessionBeanGlobalJNDINameAssignment[/url]
[img]/upload/attachment/123957/78e9cdf6-a1bf-3fd1-8eaa-628420183cde.gif[/img]
HelloWorldClient类是HelloWorld的ejb3客户端调用类
IHelloWorldRemote是接口(两年没做C++,还是喜欢C++的表示法)
HelloWorldBean是IHelloWorldRemote的实现类
所需的jar包如下:
appserv-deployment-client.jar
appserv-ext.jar
appserv-rt.jar
javaee.jar
这些jar包在glassfish_home/lib目录下均可找到
IHelloWorldRemote代码如下:
package my.ejb3.iface;
public interface IHelloWorldRemote
{
public String sayHello();
}
HelloWorldBean代码如下:
package my.ejb3.impl;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import my.ejb3.iface.IHelloWorldRemote;
@Stateless(mappedName="HelloWorldBean")
@Remote(IHelloWorldRemote.class)
public class HelloWorldBean implements IHelloWorldRemote
{
public String sayHello()
{
return "Hey, Hello World!";
}
}
@Stateless标签表明这个类是一个无状态会话Bean,mappedName最好设置,理由后面解释
@Remote(IHelloWorldRemote.class)表明IHelloWorldRemote接口是一个远程接口,只能以远程方式来访问
至此,一个简单的EJB3会话Bean已完成,打包helloworld.jar
打开glassfish web控制台,部署helloworld.jar至“EJB模块”
HelloWorldBean的客户端调用代码:
import ... //此处省略
public class HelloWorldClient
{
public static void main(String[] args)
{
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
try
{
InitialContext ctx = new InitialContext(props);
IHelloWorldRemote helloWorld = (IHelloWorldRemote)ctx.lookup("HelloWorldBean");
String result = helloWorld.sayHello();
System.out.println(result);
}
catch (NamingException e)
{
e.printStackTrace();
}
}
}
当然这里由于glassfish是在本机所以Host设置为localhost,如果非本地,请改为对应IP
glassfish的EJB端口默认为3700,如果安装过程有改动,请改为对应端口
如果顺利的话,控制台将打印出:
Hey, Hello World!
如果客户端和服务器是在同一台机器上,客户端的调用代码可以简化为:
public class HelloWorldClient
{
public static void main(String[] args)
{
try
{
InitialContext ctx = new InitialContext();
IHelloWorldRemote helloWorld = (IHelloWorldRemote)ctx.lookup("HelloWorldBean");
String result = helloWorld.sayHello();
System.out.println(result);
}
catch (NamingException e)
{
e.printStackTrace();
}
}
}
这是因为InitialContext默认会读取jndi.properties文件,而appserv-rt.jar包中提供了一个这样的jndi.properties文件。另外,Host默认是localhost,端口默认是3700。
至此,一个HelloWorld的EJB3无状态会话Bean已完成。
注意:
mappedName就是在InitialContext lookup时使用的名称。
如果我们不设置这个mappedName,那么部署后的EJB名称是什么呢?在jboss中将会是HelloWorldBean/remote,而在glassfish中将使用IHelloWorldRemote接口的全名,即my.ejb3.iface.IHelloWorldRemote(注意是接口的全名)。为了去掉这些不必要的麻烦,建议设置mappedName。
glassfish上开发ejb的一些参考资料:
[url]http://groups.google.com/group/glassfish_china/web/ejb[/url]
[url]https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#SessionBeanGlobalJNDINameAssignment[/url]
上一篇: java显示当前美国洛杉矶时间
下一篇: Tomcat服务无法启动的问题的解决方法