开发远程接口的无状态会话bean
由于无状态会话bean不维护会话状态,这就意味着一个bean实例可以为多个用户服务。简单地说就是:当无状态会话bean部署到应用服务器时,EJB容器会为它预先创建一些bean实例放在对象池。无状态会话bean比有状态会话bean更具性能优势,在条件允许的情况下开发人员首先考虑使用无状态会话bean。
3.1 开发实现远程接口的无状态会话bean
1、定义一个远程接口。
package huizhi.HelloEJBRemote;
public interface HelloEJBRemote {
public String hello(String name);
}
2、创建这个接口的实现类:
package huizhi.HelloEJBRemote;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless
@Remote( { HelloEJBRemote.class })
public class HelloEJBRemotebean implements HelloEJBRemote {
public HelloEJBRemotebean() {
}
public String hello(String name) {
return new String("你好," + name);
}
}
对双面的注释的介绍:
@Stateless 注释用来指定bean实现类是无状态的。该注释具有一个name属性可用来为bean实现类指定EJB名称,例如:
@Stateless(name="HelloEJB")
如果不指定该属性,则默认就是不饿按实现类的类名。
@Remote 注释用来指定bean实现类的远程接口。bean实现类可以继承多个远程接口,每个接口之间用逗号隔开,例如:
@Remote({HelloEJBRemote.class,UserEJBRemote.class})
如果只有一个远程接口则可以省去大括号,本例亦是如此。
通过下面的JSP页面来测试该会话bean:
<%@ page language="java" pageEncoding="GB2312" import="javax.naming.*, huizhi.HelloEJBRemote.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
<title>远程无状态会话bean远程接口</title>
</head>
<body>
<%
try{
InitialContext ctx = new InitialContext();
HelloEJBRemote hr = (HelloEJBRemote)ctx.lookup("HelloEJBRemotebean/remote");
out.println("<br>通过远程接口调用EJB<br>" + hr.hello("李小婉"));
}catch(Exception e){
out.print("远程接口调用失败!");
}
%>
</body>
</html>
上述代码通过JNDI的方式查找到了HelloEJBRemote接口,并调用了该接口中的hello方法。lookup方法中的参数是会话bean的JNDI名称,下面是会话bean的JNDI名称的命名规则。
当EJB组件发布到JBoss时,如果我们没有为它指定全局JNDI名称,JBoss就会按照默认的命名规则为会话bean生成全局的JNDI名称,默认的命名规则如下:
(1) 如果把EJB作为模块打包进后缀为*.ear 的Java EE 企业应用文件中,默认的全局JNDI名称是:
- 本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
- 远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
EAR-FILE-BASE-NAME 是 ear 文件的名称,EJB-CLASS-NAME 是EJB 的类名。
例如,把本实例作为EJB模块打包进名为HelloEJBRemote.ear 的企业应用文件中,他的远程接口的JNDI名称是:HelloEJBRemote/HelloEJBRemotebean/remote
(2) 如果把EJB应用打包成后缀为*.jar 的模块文件,默认的全局JNDI名称是:
- 本地接口:EJB-CLASS-NAME/local
- 远程接口:EJB-CLASS-NAME/remote
本实例打包成HelloEJBRemote.jar文件,它的远程接口的JNDI名称是:HelloEJBRemotebean/remote
我们分别把该实例的会话bean和JSP页面打包成HelloEJBRemote.jar 和 HelloEJB.war 文件。把这两个文件复制到JBoss安装目录\server\default\deploy文件夹中即完成了部署。