刚完成了一个完整的EJB工程,总结一下整个流程。
1.新建一个EJB工程,利用MyEcplise的方向工程生成对应的Entity Bean和Session Bean。
a.Entity Bean 采用标记技术实现数据库表和实体类的映射。
b.Session Bean (state和Stateless)中实现对数据库操作用到Hibernate的操作。
2.其中有要求配置数据源,修改Jboss提供的模板,然后将得到的文件×××—ds.xml放到deploy目录下。
3.将EJB工程直接发布到JBOSS服务器中(或者导出一个.jar文件,放到服务器的deploy目录下),这样就发布了一个EJB应用。
4.测试调用自己写的EJB工程。
a.可以在同样的工程中新建一个测试单元Junit test case。以本工程为例新建一个UserFacadeRemoteTest类对UserFacade类中的各种方法进行调用。
发现不能运行,加入client端运行EJB需要的包后正常工作。(如果工程可以部署到Jboss中,则不用添加Client端包的引用,如果没有部署则要添加)
b.可以新建一个Web工程,对发布的EJB工程进行调用。如果部署到Tomcat服务器,则要修改Tomcat服务器默认的端口号(不能和Jboss默认的端口
号冲突),需要导入必要的Client端包。如果是发布到同一个Jboss服务器中,则不要添加Client端的包引用。
对于a和b的两种测试方法,都要添加EJB工程的引用,并在用到的地方导入对于的类。
如果添加jndi.properties文件
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp\://localhost\:1099
在调用EJB发布的类时,代码如下:try{
InitialContext ic = new InitialContext();
usr = (UserFacadeRemote) ic.lookup("UserFacade/remote");
}catch(NamingException e){
e.printStackTrace();
}
在创建InitialContext对象的时候,其构造函数会自动查找jndi.properties文件,并将参数传入。
如果没有jndi.properties文件,则要用如下的代码调用EB发布的类:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
props.setProperty("java.naming.provider.url","jnp://localhost:1099");
InitialContext ic = null;
try {
ic = new InitialContext(props);//如果是同一个jboss容器,可以使用Hello/local远程接口//如果是不同一个jboss容器,只能使用Hello/remote远程接口HelloRemote hw = (HelloRemote) ic.lookup("Hello/remote");
out.print(hw.ejbSayHello("abao"));
} catch (NamingException e) {
e.printStackTrace();
}
5.再有就是在配置Servlet的时候
<url-pattern>/Servlet.do</url-pattern>注意那道斜杠,不然会报很多的错误。
6.共享这个EJB工程。