通过两天的学习,把EJB的JNDI结合JSF或者其他框架开发的过程实现了,对JNDI有了深刻的体会,现在我们要实现JSF调用远程接口
我们先用EJB3把功能开发出来,然后提供接口类给需要的对方,然后只需要在服务器上暴露接口就可以了
EJB功能
package com.bean;
public interface HelloTimeLocal{
public String showTime(String time);
}
package com.bean;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.ejb.Local;
import javax.ejb.Stateless;
@Local(HelloTimeLocal.class)
@Stateless(name="hello")
public class HelloTime implements HelloTimeLocal{
@Override
public String showTime(String time) {
String helloTime = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(Calendar.getInstance().getTime());
return new String("您好,"+time+"!\n当前时间:"+helloTime);
}
}
然后把EJB打包成jar,运行在EJB容器的服务器里,如我现在用的是jboss6,之前使用(jboss4老是无法成功)
接着把
HelloTimeLocal
这个接口交给需要远程访问的用户,让他去开发
JSF
package com.bean;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class EJBFactory {
public static Object lookup(String ejbrefname) {
try {
InitialContext ctx = new InitialContext();
//return ctx.lookup("java:comp/env/"+ ejbrefname);
return ctx.lookup("hello/local");
} catch (NamingException e) {
e.printStackTrace();
}
return null;
}
}
定义一个公用类,用于远程调用接口,当然我们是在同一个机器模拟远程的,如果你的EJB是在同个服务器时,直接用@EJB注入就可以了
package com.jsf;
import com.bean.EJBFactory;
import com.bean.HelloTimeLocal;
public class HelloJsbean {
private String name;
private String msg;
private HelloTimeLocal hl;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String showTime() throws Exception {
hl = (HelloTimeLocal) EJBFactory.lookup("hello");
this.msg = hl.showTime(name);
return "success";
}
}
对于绑定接口时要看服务器上布置了EJB后其后台显示的是什么接口名称就用什么接口名称,不然会出现无法绑定的现象
下面的就是JSF的工作了