业务接口
一个无状态会话业务接口是一种标准的Java接口,其并未对任何特定EJB接口进行扩展。这种接口含有一张业务方法定义的列表,可由客户端程序访问。每个会话Bean都必须有一个能通过Bean类实现的业务接口,其既可在设计时由相应工具生成,如Oracle JDeveloper、NetBeans、Eclipse,也可在部署时由EJB容器生成。
业务接口也能使用注释符,如下:
@Remote注释符用于指明远程业务接口。
@Local注释符用于指明本地业务接口。(如果在接口中未标明注释符,默认为local本地接口)
如果架构中存在一种需求,客户端程序(Web程序或“胖”客户端)必须运行在一个与往日运行EJB容器中会话Bean不同的Java虚拟机上,那么就需要使用远程接口了;这个Java虚拟机可在同一台电脑上,也可在不同的电脑上,但如果应用程序架构倾向于对客户端程序及会话Bean使用同一Java虚拟机,使用本地接口仍是最好的选择。
但有时候,应用程序架构会同时需要远程及本地接口,例如,一个企业可能有一个订单录入程序,其使用会话Bean开发,而这些会话Bean有用于提交新订单的业务方法,同时还有一些日常行政方面的任务,如输入产品数据,潜在地,就可能有两个不同的客户端程序访问后台订单录入程序,如下:
一个Web客户端程序(如图3)能与会话Bean运行在同一Java虚拟机中,并用于提交新订单。
一个“胖”客户端程序(如图4)运行在终端用户的桌面电脑上,用于日常数据输入。

图3:一个使用会话Bean本地接口的Web客户端程序

图4:一个使用会话Bean远程接口的“胖”客户端程序
而SearchFacade会话Bean有远程及本地两种接口,如图5:

图5:SearchFacade会话Bean的业务接口
例2是SearchFacade远程业务接口的代码段,有一个@Remote注释符与一个wineSearch()方法声明,wineSearch()方法接受一个代表酒类型的参数,并返回所有条件匹配的酒名列表。
例2:SearchFacade.java package com.apress.ejb3.chapter02; import java.util.List; import javax.ejb.Remote; @Remote public interface SearchFacade { List wineSearch(String wineType); }
例3是SearchFacade本地业务接口的代码段,有一个@Local注释符与一个wineSearch()方法声明。
例3:SearchFacadeLocal.java package com.apress.ejb3.chapter02; import java.util.List; import javax.ejb.Local; @Local public interface SearchFacadeLocal { List wineSearch(String wineType); }