使用NetBeans,我已成功运行Oracle网站上Java EE 6教程中提供的购物车示例。它是一个包含两个模块的EAR:EJB模块和应用程序客户端模块。我已经缩短了代码的一些细节,以便专注于我所面临的困惑。首先,下面是代码。
EJB模块中的远程接口
package cart.ejb;
import cart.util.BookException;
import java.util.List;
import javax.ejb.Remote;
@Remote
public interface Cart {
public void initialize(String person) throws BookException;
public void initialize(
String person,
String id) throws BookException;
public void addBook(String title);
public void removeBook(String title) throws BookException;
public List<String> getContents();
public void remove();
}
EJB模块中的有状态会话bean
package cart.ejb;
import cart.util.BookException;
import cart.util.IdVerifier;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Remove;
import javax.ejb.Stateful;
@Stateful
public class CartBean implements Cart {
List<String> contents;
String customerId;
String customerName;
public void initialize(String person) throws BookException {
.................
}
public void initialize(
String person,
String id) throws BookException {
.....................
}
public void addBook(String title) {
contents.add(title);
}
public void removeBook(String title) throws BookException {
.................
}
public List<String> getContents() {
return contents;
}
@Remove()
public void remove() {
contents = null;
}
}
应用程序客户端模块中的客户端
package cart.client;
import java.util.Iterator;
import java.util.List;
import javax.ejb.EJB;
import cart.ejb.Cart;
import cart.util.BookException;
public class CartClient {
@EJB
private static Cart cart;
public CartClient(String[] args) {
}
public static void main(String[] args) {
CartClient client = new CartClient(args);
client.doTest();
}
public void doTest() {
..................
}
}
现在我的困惑开始!!
Confusion-1:教程说这是一个远程客户端。但事实并非如此!它作为一个模块打包在与EJB模块相同的EAR中。不会@Local更合适吗?
Confusion-2:如果glassfish认为它是客户端和会话bean之间的远程通信,客户端的容器是否会提供会话bean的假实例(即代理)表示EJB容器中会话bean的实际实例,就像在&#34; real&#34;远程案例?我的意思是,远程意味着远程,不管是什么?
困惑-3:我正在考虑在非EE环境中创建一个客户端,然后让它与EAR外部的bean进行通信,以便了解&#34;真实&#34;远程。因此,如果我通过从EAR中的客户端复制内容来启动Eclipse并创建Java SE 7客户端程序,这些是我必须做出的更改吗?
替换依赖注入
@EJB
private static Cart cart;
使用JNDI
private static Cart cart = (Cart) InitialContext.lookup("java:global/cart/cart-ejb/CartBean/Cart");
并在Java Standard Edition客户端项目中添加Cart界面的源代码。
Confusion-4:我无法找到该EAR文件的位置。在NetBeans上,我可以在购物车下看到有两个jar文件。但是,EAR文件在哪里?我使用NetBeans直接从 C:\ glassfish-4.1.1 \ docs \ javaee-tutorial \ examples \ ejb \ cart 打开项目来部署项目。
答案 0 :(得分:0)
@Local就足够了,显然他们对演示很懒,并选择把它全部打包在一起。无论如何,您的部署单元是@Local接口的范围,因此同一容器中的2个不同EARS无法访问其他@Local接口
是和否:外部行为将与真实的远程情况完全相同(使用对象的序列化和代理),但是如何在幕后真正处理这取决于容器实现。据我所知,大多数容器都会利用这样的事实:即使它是@Remote它位于同一个JVM中,例如它们也不会建立实际的远程套接字连接。
3