好久没写了,以前也只在weblogic下写过,凭记忆写了一个例子,虽然很小,但是为了调这个东西,走了很多弯路,呵呵,写出来分享一下
1.编写一个主接口,创建组件接口的接口
package com.EJB.interfaces;
public interface HelloWorldHome extends javax.ejb.EJBHome{
HelloWorld create() throws java.rmi.RemoteException,javax.ejb.CreateException;
}
2.编写一个组件接口,被客户端使用的接口
package com.EJB.interfaces;
public interface HelloWorld extends javax.ejb.EJBObject{
public String getHello() throws java.rmi.RemoteException;
}
3.编写组件接口的实现,即具体的逻辑
package com.EJB.impl;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionContext;
public class HelloWorldImpl implements javax.ejb.SessionBean{
/*hello方法是实际的业务逻辑,它可以在客户端显示“hello,world”这个字符串*/
public String getHello() throws EJBException, RemoteException {
System.out.println("getHello()");
return "hello,worldasdfasdfasdf";
}
public void ejbActivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void ejbPassivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void ejbRemove() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void setSessionContext(SessionContext arg0) throws EJBException,
RemoteException {
// TODO Auto-generated method stub
}
public void ejbCreate() throws javax.ejb.CreateException{}; //这个东西如果用eclipse的快速修改是不会有这个方法的,如果没有这个方法,部署到jboss会报错的,所以这个需要手工加上。
}
4.编写客户端
package test;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import com.EJB.interfaces.HelloWorld;
import com.EJB.interfaces.HelloWorldHome;
public class Test {
public static void main(String args[]){
String url = "127.0.0.1:1099";IP地址加端口号,服务器的地址,Ejb在Jboss上是1099端口
InitialContext initCtx = null;
try {
Hashtable<String,String> env = new Hashtable<String,String>();
//设置上下文环境,Context.INITIAL_CONTEXT_FACTORY这个的value根据不同的应用服务器不同而不同,weblogic也提供了自己的类。
env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, url);
initCtx = new InitialContext(env);
Object obj=initCtx.lookup("FirstEjb");这里的FirstEjb就是jndi名字,在jboss-xml中配置的
HelloWorldHome home=(HelloWorldHome)PortableRemoteObject.narrow(obj,HelloWorldHome.class);//用rmi远程方法调用获得主接口
HelloWorld hello = home.create();//用主接口创建组件接口
String s = hello.getHello();//执行方法
System.out.println(s);
}catch(Exception e){
e.printStackTrace();
}
}
}
5.部署EJB
在EJB的项目中,在META-INF中加入ejb-jar.xml,这个就是ejb的描述了,以后jboss启动的时候会找这个项目了文件,进行部署。
jboss.xml是为了更好更简洁的处理本ejb,才加进去的,里面包括jndi的描述。
进入first/build/classes/下,运行jar -cvf hello.jar *.* 进行打包,然后把这个jar包拷贝到jboss的develop下,运行就可以了。
ejb-jar.xml:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar id="ejb-jar_ID" version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
<display-name>First</display-name>
<enterprise-beans>
<session>
<ejb-name>FirstEjb</ejb-name>
<home>com.EJB.interfaces.HelloWorldHome</home><!--主接口-->
<remote>com.EJB.interfaces.HelloWorld</remote><!--组件接口-->
<ejb-class>com.EJB.impl.HelloWorldImpl</ejb-class><!--组件接口的实现-->
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
jboss.xml:
<?xml version="1.0" encoding="UTF-8"?>
<jboss>
<enterprise-beans>
<session>
<ejb-name>FirstEjb</ejb-name> <!--EJB名称和ejb-jar.xml中的<ejb-name>一样-->
<jndi-name>FirstEjb</jndi-name> <!--jndi路径,被客户端调用是使用的jndi,即可以找到ejb的路径-->
</session>
</enterprise-beans>
</jboss>
6.运行EJB
运行客户端,即可获得在屏幕上打印一行hello,world的效果
注意:
运行EJB,最主要就是要分布式,那么如果在同一个项目中编写客户端就没什么意义了,基于这个,下面举一个远程调用的例子:
1.把主接口和组件接口拷贝到要调用EJB的项目中
2.把jbossall-client.jar拷贝到要调用EJB的项目中,要不然会报如下错误
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(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.init(Unknown Source)
at javax.naming.InitialContext.<init>(Unknown Source)
at test.Test.main(Test.java:20)
Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at com.sun.naming.internal.VersionHelper12.loadClass(Unknown Source)
... 5 more
3.确定实现和主接口和组件接口分离,不要把实现也拷过去了,那就没啥用了,这里
4.如果报连接不到远程的地址什么的,请检查url中时候包含rmi://,如果有会报错的。
这里讲的很浅,家里的weblogic 的EJB例子比较详细,而且分包的,把接口和实现分成两个包,拷贝起来也方便,可以回去看看。
分享到:
相关推荐
(1):编写第一个无状态的SessionBean 2 一、配置开发环境 2 二、开发无状态Session Bean 3 三、编写客户端程序 5 (2):编写有状态的SessionBean 7 (3):使用Session Bean的本地接口 9 (4):Session Bean中的...
本书内容主要包括三部分,第一部分介绍java ee开发的基础知识,以及如何搭建开发环境,包括安装jboss、weblogic应用服务器,以及如何使用svn、netbeans等。第二部分详细讲解了jsf ri、jta、jndi、rmi、jms、...
1.1 Apache Tomcat各版本 1.2 Apache Tomcat Versions ...1.20 Jboss下的第一个EJB程序 1.21 JNDI 1.22 JNDI配置原理详解 1.23 JSF+Seam框架学习心得 1.24 java jdbc驱动的四种类型 1.25 resource-ref元素
应用服务器 采用JBoss4.2.1GA,在发布ejb端程序时,要把MySql的驱动程序包和数据库配置文件(mysql-ds.xml)这两个文件放置在JBoss安装目录\server\default\deploy目录下。这两个文件在jsfejb3-ejb源码的DBScript...
环境:Window XP Professional, JDK 1.6, Eclipse 3.3 Europa, JBoss 4.2.1, Mysql 5.0 理由:持久层技术从EJB 2.0的实体bean开始,相继出现JDO, Hibernate, iBats等技术,到今天统一的标准JPA出现。因为JPA是一种...
1.2. 第一个例子:注册示例.............................................................................................................................................. 15 1.2.1. 了解代码.................
3. 查看 Hibernate 发行包中的 eg/ 目录,里面有个一简单的独立运行的程序。把你的 JDBC 驱 动复制到 lib/ 目录并修改一下 etc/hibernate.properties,指定数据库的信息。然后进入命令 行,切换到发行包的目录,输入...
从JBoss项目开始至今,它已经从一个EJB容器进展成为一个基于的J2EE的一个web操作系统(operating systemforweb),它表达了J2EE规范中最新的技术,含有Jsp和Servlet容器,也就可以做web容器,也包含EJB容器,是完好的J2EE...
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...
当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例...
<br>查看Hibernate发行包中的eg/目录,里面有一个简单的独立运行的程序。把你的JDBC驱动拷贝到lib/目录下,修改一下src/hibernate.properties,指定其中你的数据库的信息。进入命令行,切换到你的发行包的目录,...
<br>阅读第 1 章 Hibernate入门 ,这是一篇包含详细的逐步指导的指南。本指南的源代码包含在发行包中,你可以在doc/reference/tutorial/目录下找到。 <br>阅读第 2 章 体系结构(Architecture)来理解...
第一部分 从Hibernate和EJB 3.0开始 第1章 理解对象/关系持久化 1.1 什么是持久化 1.1.1 关系数据库 1.1.2 理解SQL 1.1.3 在Java中使用SQL 1.1.4 面向对象应用程序中的持久化 1.2 范式不...
因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM...
第1章 Java应用分层架构及软件模型 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1.4 软件分层的缺点 1.1.5 Java应用的持久化层 1.2 软件的模型 ...
第1章 Java应用分层架构及软件模型 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1.4 软件分层的缺点 1.1.5 Java应用的持久化层 1.2 软件的模型 ...
第1章 Java应用分层架构及软件模型 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1.4 软件分层的缺点 1.1.5 Java应用的持久化层 1.2 软件的模型 ...
第1章 Java应用分层架构及软件模型 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1.4 软件分层的缺点 1.1.5 Java应用的持久化层 1.2 软件的模型 ...