有时客户端程序(如JSPServlet)会和EJB组件运行在同一个JVM上如在同一个JEE服务器(JBossWeblogic等)中运行这时就没必要再通过远程(remote)接口访问Session Bean了因为客户端和session bean都在同一个jvm上只需要通过本地接口(local)访问即可就象直接访问本地类一样(当然不能直接访问EJB类需要使用jndi和local接口来获得本地接口对象当然也可以通过remote接口来访问ejb不过这样会有一些性能损失就象在同一台机器上还通过socket进行访问一样很多性能都损耗在网络上了下面我们来举个简单的例子来看一下如何使用本地接口来访问session bean
先建立一个session bean本地接口代码如下
packageservice;
importjavautilList;
importjavaxejbLocal;
@Local
publicinterfaceShoppingCart
{
//添加某个商品信息
publicvoidaddCommodity(Stringvalue);
//获得客户购买的所有商品的纱衔泥
publicList<String>getCommodity();
}
关于Session Bean的具体实现类与远程接口的实现类一样读者可以参考《编写有状态的SessionBean》一文中的ShoppingCartBean类
下面在Eclipse中新建立一个Web工程(工程名JBossWeb)该工程需要引用MyEJB工程(包含EJB组件的工程)在WebContent目录中建立一个testjsp页面代码如下
<%@pagelanguage=javacontentType=text/html;charset=GB
pageEncoding=GBimport=javautilListjavautilProperties
javaxnamingInitialContextserviceShoppingCart%>
<!DOCTYPEhtmlPUBLIC//WC//DTDHTMLTransitional//EN>
<html>
<head>
<metahttpequiv=ContentTypecontent=text/html;charset=GB>
<title>Inserttitlehere</title>
</head>
<body>
</body>remote
<%
Propertiesprop=newProperties();
InitialContextctx=newInitialContext();
ShoppingCart shoppingCart=(ShoppingCart)ctx
lookup(ShoppingCartBean/local);
shoppingCartaddCommodity(自行车);
shoppingCartaddCommodity(笔记本电脑);
shoppingCartaddCommodity(液晶电视);
List<String>commodities=shoppingCartgetCommodity();
for(Stringcommodity:commodities)
{
Systemoutprintln(commodity);
}
%>
</html>
访问本地接口要使用的jndi name应为ShoppingCartBean/local
启动JBoss在浏览器中输入如下的URL
在Eclipse的Console中会输出如下的信息
::INFO[STDOUT]自行车
::INFO[STDOUT]笔记本电脑
::INFO[STDOUT]液晶电视