wayne

#

EJB3 (2)

一个会话bean即可以远程访问,也可以本地访问,尽管这种现象不常见。
我们先定义远程接口:

@Remote
public interface HelloRemote {

    String sayHi(String name);

    String sayByeBye(String name);
    
}

接着定义本地接口:
@Local
public interface HelloLocal {

    String sayBye(String name);
    
}

然后编写一个会话bean同时实现两个接口:
@Stateless
public class HelloBean implements HelloRemote, HelloLocal {

    
public String sayHi(String name) {
        
return "Hi " + name;
    }

    
    
public String sayBye(String name) {
        
return "Bye " + name;
    }

    
    
public String sayByeBye(String name) {
        
return sayBye(name);
    }

    
}

那么,这还是一个无状态会话bean,不过即可以远程访问,也可以本地访问。
<%
            InitialContext ctx 
= new InitialContext();
            HelloRemote helloBean 
= (HelloRemote)ctx.lookup(HelloRemote.class.getName());
            out.println(helloBean.sayHi(
"Tom"));
            out.println(
"<br>" + helloBean.sayByeBye("Tom"));
%>

远程访问只能获得远程接口的代理,然后调用远程业务方法。在远程客户端是无法获得本地接口的引用,更别说访问本地方法了。

posted @ 2008-09-12 21:29 waynemao 阅读(132) | 评论 (0)编辑 收藏

EJB3 (1)

新建一个EJB模块
先写一个最简单的无状态Session Bean,首先定义一个远程接口:

@Remote
public interface HelloRemote {

    String sayHi(String name);
    
}
用@Remote标注表明这是一个远程接口,在接口里声明一些业务方法。接着定义一个会话Bean实现该接口:
@Stateless
public class HelloBean implements HelloRemote {

    
public String sayHi(String name) {
        
return "Hi " + name;
    }

    
}

@Stateless标注表明这是一个无状态会话Bean,完成了这个简单的Demo后,打包部署到服务器上。接着我们来测试这个会话Bean,新建一个WEB模块,我们利用这个web应用来远程调用会话Bean。我们可以在web模块里新建一个Servlet:
public class HelloServlet extends HttpServlet {
    @EJB
    
private HelloRemote helloBean;
在Servlet里定义了一个成员变量,@EJB标注表明远程接口的代理将依赖注入到成员变量,在doGet或doPost方法里可以直接使用该代理调用会话Bean的业务方法:
PrintWriter out = response.getWriter();
        
try {
           out.println(helloBean.sayHi(
"Tom"));
        }
 finally 
            out.close();
        }
JSP却有所不同,这里不能使用@EJB标注,要使用传统的JNDI lookup方式:
<%
            InitialContext ctx 
= new InitialContext();
            HelloRemote helloBean 
= (HelloRemote)ctx.lookup(HelloRemote.class.getName());
            out.println(helloBean.sayHi(
"Tom"));
%>

这个测试用web模块已经完成,将WEB模块打包部署后即可以运行
不过,如果我们自己指定了会话Bean的JNDI名,那么以上的测试代码将发生异常,例如:
@Stateless(mappedName="hello")
public class HelloBean implements HelloRemote {

    
public String sayHi(String name) {
        
return "Hi " + name;
    }

    
}

这里我们指定了会话bean的JNDI名为"hello",更改后的EJB模块需要重新部署,还要更改相应的Servlet和Jsp中的代码:
@EJB(mappedName="hello")
    
private HelloRemote helloBean;

Servlet已经更改了,只有一点点不同。
<%
            InitialContext ctx 
= new InitialContext();
            HelloRemote helloBean 
= (HelloRemote)ctx.lookup("hello");
            out.println(helloBean.sayHi(
"Tom"));
        
%>

Jsp也做了小小的改动,如此更新后重新部署WEB模块,测试代码即可顺利运行

posted @ 2008-09-12 20:49 waynemao 阅读(104) | 评论 (0)编辑 收藏

仅列出标题
共2页: 上一页 1 2 

My Links

Blog Stats

常用链接

留言簿(1)

随笔分类

随笔档案

default

搜索

最新评论

阅读排行榜

评论排行榜