
看到一篇文章《EJB3.0入门---第一个程序,HelloWorld!》
第一步:
新建一个项目.这个工程为EJB模块.
新建一个接口,名为HelloWorld.java,代码如下:
HelloWorld.java 代码
package com.sample.ejb3;
public interface HelloWorld {
public String SayHello(String name);
}
然后新建一个无关态会话Bean,一般的命名规则是:接口名+Bean。实现里面的接口要加入两个注释@Remote和@Stateless。
@Stateless表示无状态会话Bean,@Remote表示这个无状态会话Bean的remote接口。。无状态会话Bean 是一个简单的POJO(纯粹的面向对象思想的java 对象),EJB3.0 容器自动地实例化及管控这个Bean。HelloWorldBean.java代码如下:
HelloWorldBean.java 代码
package com.sample.ejb3.impl;
import com.sample.ejb3.HelloWorld;
import javax.ejb.Remote;

import javax.ejb.Stateless;
@Stateless
@Remote ({HelloWorld.class})
public class HelloWorldBean implements HelloWorld {
public String SayHello(String name) {
return name +"说:Hello World.";
}
}
这样,就把EJB模块研发完成!可以公布到Jboss中去,(注意:Jboss的版本要在4.0.5以上,以前的版本或许发生报错现象)。 第二步:开了一个客户端来访问这个EJB。当一个无状况会话Bean 发布到EJB 容器时,容器都会为她建立一个对象stub,并把她注册进容器的JNDI 目录,客户端代码使用她的JNDI 名从容器获取他的stub。通过这个stub,客户端可以读取她的业务技巧。例子代码如下:index.jsp代码如下:
index.jsp 代码
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ page import="com.sample.HelloWorld, javax.naming.*, java.util.Properties"%>
<!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=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h2>
<%
Properties props=new Properties();
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");
//props.setProperty("", "");
System.getProperties();
try{
InitialContext ctx=new InitialContext(props);

HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");
out.println(helloworld.SayHello("大家"));
}
catch(Exception ex){
out.println(ex.getMessage());
}
%>
</h2>
</body>
</html>
然后部署到服务器上ejb3 programmer guide,访问这个页面!
有如下疑问:
你在客户端是借助新建一个工程ejb3 programmer guide,然后访问EJB的,但客户端的com.sample.HelloWorld接口并没有定义啊,执行<%@ page import="com.sample.HelloWorld>可能会报错吧,因为你也是在EJB模块中定义了com.sample.ejb3.HelloWorld,而在客户端没有定义com.sample.HelloWorld接口。
执行 HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");
应该会报HelloWorld cannot be resolved to a type 的异常。

是不是楼主在客户端也定义了com.sample.HelloWorld接口,这个接口跟EJB模块的com.sample.ejb3.HelloWorld接口完全一样?
问题补充:
lizhi92574 写道
你说的没错,客户端需要com.sample.ejb3.HelloWorld 接口。一般都是服务器吧相应接口打个jar包给客户端使用。
但是在令一篇文章《EJB client调用EJB3》中看到, 如果是公布在jboss的web app作为client来调用EJB,不需要把EJB 的接口类放入/WEB-INF/classes/目录中,否则在调用Stateful Bean 就会出现类型冲突,引发以下的例外
java.lang.ClassCastException: $Proxy84
org.apache.jsp.StatefulBeanTest_jsp._jspService(org.apache.jsp.StatefulBeanTest_jsp:55) ,那这种的话EJB Client如何获取EJB接口的定义呢?
问题补充:
lizhi92574 写道
那也是对于EBJ 和 web应用在同一环境下而言。其他环境都应该提供相应接口。
同一环境指的是哪个?都部署在同一台机器上的jboss里算是同一环境下吗?
问题补充:
lizhi92574 写道
是的·![]()
可是这种一旦不提供EJB接口类的class的话client还是会报错啊
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-121816-1.html
直接击沉