在web方式下测试ejb是否正常往往是件比较痛苦的事情,如果可以不用在页面中调用而是直接在客户端的代码中调用该是一件多么惬意的事情~~~
如果使用JBuilder开发ejb,IDE可以自动帮助生成一个ejb的客户端程序,假设我们开发的这个ejb叫做Trader,那么应该会有个接口TraderHome,这个是ejb对外暴露的接口,自动生成的客户端假设叫TraderClient。
通常类TraderClient的结构如下所示
public class TraderClient{
Trader trader = null;
public TraderClient(){
//获得初始上下文,如果是通过web方式调用的话初始上下文是有服务器的ejb容起来自动完成的,包括服务器的地址和端口都是根据服务器上配置来的,而且对于不同的服务器比如weblogic、jboss或jonas都是使用这个方法,没有什么区别。但是如果是想在客户端调用ejb的话这里就需要修改了,因为客户端程序是不在服务器上的,这样就没办法自动获得关于ejb所在服务器的地址、端口以及用户名和密码。下面将会说明如何修改。
Context context = new InitialContext();
//look up jndi name
Object ref = context.lookup("TraderHome");
//look up jndi name and cast to Home interface
traderHome = (TraderHome) PortableRemoteObject.narrow(ref, TraderHome.class);
//这里的三个参数是根据创建的ejb的不同而改变的,有些是根本不需要的。
Trader trader = traderHome.create(cardHolderName, creditCardNumber, expirationDate);
}
//接下来就可以调用Ejb的方法了,比如我们这里的Trader有方法void addItem(String itemName)、void removeItem(String itemName)、ArrayList<String> getAllItems()。
public static void main(String[] args){
trader.addItem("first item");
trader.addItem("second item");
trader.addItem("third item");
trader.getAllItems();
trader.removeItem("first item");
}
}
前面写的TraderClient类中的结构是对于在web页面中调用ejb的方法,如果是在客户端程序中调用就必须要手动配置一些信息了。但需要修改的地方实际上并不复杂,只是对于不同的服务器而言参数略有不同而已。
我们所要做的修改就是在TraderClient类中添加一个新的方法private Context getInitialContext(),然后用getInitialContext方法替换前面的new InitialContext()方法即可。
getIntialContext方法的内容如下来编写:
对于JONAS:
private Context getInitialContext() throws Exception {
//这里的rmi是JONAS访问的协议,不同的服务器一般是不同的。
//localhost是服务器所在的ip地址,如果是本机的话写成localhost或者127.0.0.1。
//1099是服务器对外提供的ejb的访问端口,JONAS是默认1099
String url = "rmi://localhost:1099";
String user = null;
String password = null;
Properties properties = null;
try {
properties = new Properties();
//这里的属性配置也是视不同服务器而不同的,JONAS的话就应该这样写
properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
properties.put(Context.PROVIDER_URL, url);
if (user != null) {
properties.put(Context.SECURITY_PRINCIPAL, user);
properties.put(Context.SECURITY_CREDENTIALS, password == null ? "" : password);
}
return new InitialContext(properties);
}catch(Exception e) {
throw e;
}
}
对于WebLogic:
private Context getInitialContext() throws Exception {
//这里的t3是weblogic访问的协议,不同的服务器一般是不同的。
//localhost是服务器所在的ip地址,如果是本机的话写成localhost或者127.0.0.1。
//1099是服务器对外提供的ejb的访问端口,weblogic默认是7001
String url = "t3://localhost:7001";
String user = null;
String password = null;
Properties properties = null;
try {
properties = new Properties();
//这里的属性配置也是视不同服务器而不同的,JONAS的话就应该这样写
properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"");
properties.put(Context.PROVIDER_URL, url);
if (user != null) {
properties.put(Context.SECURITY_PRINCIPAL, user);
properties.put(Context.SECURITY_CREDENTIALS, password == null ? "" : password);
}
return new InitialContext(properties);
}catch(Exception e) {
throw e;
}
}
使用getInitialContext方法替换TraderClient类中的new InitialContext()就可以在客户端调用ejb了。
修改后的TraderClient类的代码如下:
public class TraderClient{
Trader trader = null;
public TraderClient(){
//此处被修改了
Context context = getInitialContext();
//look up jndi name
Object ref = context.lookup("TraderHome");
//look up jndi name and cast to Home interface
traderHome = (TraderHome) PortableRemoteObject.narrow(ref, TraderHome.class);
//这里的三个参数是根据创建的ejb的不同而改变的,有些是根本不需要的。
Trader trader = traderHome.create(cardHolderName, creditCardNumber, expirationDate);
}
//接下来就可以调用Ejb的方法了,比如我们这里的Trader有方法void addItem(String itemName)、void removeItem(String itemName)、ArrayList<String> getAllItems()。
public static void main(String[] args){
trader.addItem("first item");
trader.addItem("second item");
trader.addItem("third item");
trader.getAllItems();
trader.removeItem("first item");
}
}