EJB是SUN公司提出的开发表示,使用了JTA,使用了Hibernate的一些源代码,主要完成分步式开发与后台的数据库操作。
EJB:Enterprise JavaBean,共有以下三大类和六小类的Bean。
SessionBean:相当于DAO接口与实现类。
实现类:
stateful:有状态。
stateless:无状态。
接口:
remote:远程接口,可以进行远程交互
local:本地接口,只能在同一个服务器中执行。
EntityBean:相当于pojo和XML映射文件
CMP:容器管理持久化,表示对象的创建与销毁由容器来完成。
BMP:Bean管理持久化,普通的JavaBean方式,当不使用时自动销毁。
MessageDrivenBean:JMS功能(Java Message Server),用来在不同的项目之间传递消息的
PTP:点对点,一个点到另一个点的单独发送的消息。
Topic:主题,先订阅,在一定时间或情况下由发送方自动将信息发给所有订阅的项目。
开发环境:
MyEclipse5.5以上版本 + JBoss4.2以上版本
EJB项目的组成:
总的项目 + EJB端项目(纯Java项目) + Web端项目(Java Web项目)
EJB端用来编写SessionBean与EntityBean,Web端来调用SessionBean操作EntityBean,总的项目用来将EJB端项目与Web端项目整合到一起。
注意一定要选择到JavaEE5.0版本,否则无法完成后面的开发
此处建立SessionBean项目,不用选择。
单击Finish后,自动创建了三个项目。
在EJBSessionBeanDemoEJB的src中上右键à new à EJB3 Session Bean
package org.mldn.lin.session; import javax.ejb.Remote; //该Annotation表示该接口为一个EJB3远程接口 @Remote public interface HelloDAORemote { public String sayHello(String name) throws Exception; } |
package org.mldn.lin.session; import javax.ejb.Stateless; //该Annotation表示该类为一个无状态SessionBean @Stateless public class HelloDAO implements HelloDAORemote { public String sayHello(String name) throws Exception { // TODO Auto-generated method stub return "Hello World! " + name; } } |
只能部署到JBoss服务器中,不能部署到Tomcat服务器中
发布的接口被发布到公共的JNDI空间中,要查找需要通过JBoss控制台页面找到公共的空间.
打开JBoss公共页面
默认为8080,则访问公共页需要通过该地址访问
修改了端口号为80,IE浏览器默认端口号为80,则可以通过该地址访问
点击jmx-console打开JBoss控制台,
在JBoss控制台页面查找service=JNDIView
打开公共的JNDI空间
点Invoke执行列表显示JNDI的功能
在Global JNDI Namespace中查找到发布的远程接口
package org.mldn.lin.test;
import java.util.Properties;
import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException;
import org.mldn.lin.session.HelloDAORemote;
public class Test {
public static void main(String[] args) { // TODO Auto-generated method stub // 定义查找参数,通过定义这些参数找到该公共空间 Properties pro = new Properties(); pro.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); pro.setProperty("java.naming.provider.url", "192.168.1.187:1099"); pro.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming"); // 通过JNDI查找发布的接口 try { Context ctx = new InitialContext(pro);
// 开始查找接口 HelloDAORemote hellodao = (HelloDAORemote) ctx.lookup("HelloDAO/remote");
// 打印结果 System.out.println(hellodao.sayHello("Lin"));
} catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
}
}
|
报错:
javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory] at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657) |
注意:
如果通过测试类进行测试,需要添加一个支持类jar包
该jar包可以在在JBoss服务器client目录下找到,将 拷贝到lib下即可
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page import="javax.naming.Context,javax.naming.InitialContext,javax.naming.NamingException,org.mldn.lin.session.HelloDAORemote" %>
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head>
<body> <% // TODO Auto-generated method stub // 定义查找参数,通过定义这些参数找到该公共空间 Properties pro = new Properties(); pro.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); pro.setProperty("java.naming.provider.url", "192.168.1.187:1099"); pro.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming"); // 通过JNDI查找发布的接口 try { Context ctx = new InitialContext(pro);
// 开始查找接口 HelloDAORemote hellodao = (HelloDAORemote) ctx .lookup("HelloDAO/remote");
// 打印结果 out.println(hellodao.sayHello("Lin"));
} catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } %> </body> </html>
|
注意:如果是要部署Web项目,则在lib中不能单独加入
否则jar包冲突
访问http://192.168.1.187/EJBSessionBeanDemoWeb/检验结果
如果使用整个部署的形式,则不能再单独部署两个项目,而且需要修改一些代码
并且发现发布的服务有变化:
在部署整个项目后,发现发布的SessionBean的名称多了一个项目名,因此需要修改lookup中的参数,加入项目名称
// 开始查找接口 HelloDAORemote hellodao = (HelloDAORemote) ctx.lookup("EJBSessionBeanDemo/HelloDAO/remote"); |