每次学习一些新的东西都是从Hello World开始,这里感叹一下。本来认为Hello World这样的东西应该不必要再写,只想发两句牢骚,转几个链接了事,但接触下来,发现网上的Hello World因为转载太多,造成基本上都是不能用的版本.或多或少存在这样那样的问题,让一个初学者去调试错误是好事,也是坏事,好事是可以锻炼一下,坏事是容易打消积极性,呵呵。这里给出一个Hello World的例子和一些疑问.
首先是Hello World的代码,很简单就几个接口
1,远程接口
package eg;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
public interface Hello extends EJBObject {
public String hello() throws RemoteException;
}
2,企业Bean
package eg;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class HelloBean implements SessionBean {
private SessionContext ctx;
public void ejbActivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void ejbPassivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void ejbCreate() throws javax.ejb.CreateException {
}
public void ejbRemove() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void setSessionContext(SessionContext ctx) throws EJBException,
RemoteException {
this.ctx = ctx;
}
public String hello() {
System.out.println("hello");
return "Hello World";
}
}
3,Home接口
package eg;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface HelloHome extends EJBHome {
Hello create() throws RemoteException,CreateException;
}
4,用来调用的Client类
package eg;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
public class HelloClient {
public static void main(String[] args) throws Exception {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "localhost:1099");
env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
Context ctx = new InitialContext(env);
Object obj = ctx.lookup("Hello");
HelloHome home = (HelloHome) PortableRemoteObject.narrow(obj,
HelloHome.class);
Hello hello = home.create();
System.out.println(hello.hello());
hello.remove();
}
}
ejb-jar.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<description>this is ejb helloworld</description>
<display-name>HelloBean</display-name>
<enterprise-beans>
<session>
<display-name>Hello</display-name>
<ejb-name>Hello</ejb-name>
<home>eg.HelloHome</home>
<remote>eg.Hello</remote>
<!--
<local-home>eg.HelloLocalHome</local-home>
<local>eg.HelloLocal</local>
-->
<ejb-class>eg.HelloBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar> 上边代码下载链接
http://www.blogjava.net/Files/dreamstone/ejb.rar疑问一:细心的人会发现我的ejb-jar.xml中注释掉了两行,这两行对应两个本地接口
package eg;
import javax.ejb.EJBLocalObject;
public interface HelloLocal extends EJBLocalObject {
public String hello();
}
package eg;
import javax.ejb.CreateException;
import javax.ejb.EJBLocalHome;
public interface HelloLocalHome extends EJBLocalHome {
HelloLocal create() throws CreateException;
}
这两个接口是用来本地调用的,这个解释明白它的意思,但还是不知道如何才能实现这个本地调用,了解的人给个提示,如何才能在代码中模拟出使用到这两个接口的情况。或者说模拟出使用本地接口和远程接口的区别?
疑问二:为什么企业Bean类不实现组建接口(既不实现远程接口也不实现本地接口),毕竟组建接口定义了企业Bean所有的业务方法,如果实现了,可以保证编译期Check
答案:这个答案是<<精通Ejb>>一书中给出的解释:
理由一:组件接口继承于Sun定义的标准接口,比如javax.ejb.EJBObject和javax.ejb.EJBLocalObject。这些超级接口为客户定义了其它方法。因此如果企业Bean类实现组件接口,则企业Bean类将需要为这些方法提供空的实现,显然,在企业Bean类中不需要这些方法
理由二:
假定企业Bean (A)需要调用其它企业Bean(B)的方法,并且,如果需要传递当前企业Bean(A)的引用给B的方法(类似于Java中的this参数)。在Ejb中,如何传递和处理这种情形?
请记住,所有的Ejb客户都是调用Ejb对象而不是企业Bean类实例本身,因此如果A调用B,开发者必须将A的Ejb对象引用(而不是对A的引用)传递给B,B将操作A的EJB对象,而不是A中企业Bean实例本身,对于A而言,B是它的客户,同所有的EJB客户一样,必须通过EJB对象调用企业Bean类实例。
而且如果企业Bean类实现了EJB组件的远程接口将存在潜在的危险,开发者可能不小心将企业Bean类的实例本身的引用传递,而不是EJB对象的引用,犹豫企业Bean类同EJB对象实现了同一接口,似的开发者能够使用this参数,而实现对企业Bean本身的引用。这太不可思议了。
看完这段解释,朦胧的懂了为什么不这么做,但是对这么作带来的后果还是不是很清楚,有经验的给说说.谢谢.
另外部署不说了,看这里吧
http://www.uml.org.cn/j2ee/200702141.asp如果调用Client的时候抛出这个异常:
Exception in thread "main" 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)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:247)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.InitialContext.<init>(InitialContext.java:197)
at eg.HelloClient.main(HelloClient.java:17)
Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:242)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:42)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)
... 4 more
把Jboss Client目录下的一些类库加进来就好了
最后提供一个简单的做法:
Eclipse+Myeclipse
新建EJB工程-->新建SessionBean,名字叫HelloBean ,更改里边的业务方法
然后选择工程的属性-->Myeclipse xDoclet -->add Standard -->standard EJB -->确定
右键工程-->Myeclipse-->run xDoclet,看看是不是和上边的差不多,什么都有了,不过他的结构更好一点,借助工具能更快捷的完成任务。不过建议初学者还是自己手动来比较好。
借助Eclipse+Myeclipse 部署调试也会变的方便.
分享到:
相关推荐
**EJB3.0之HelloWorld** EJB(Enterprise JavaBeans)是Java平台企业版(Java EE)的一部分,主要用于构建可扩展、可移植和可信赖的企业级应用。EJB3.0是EJB规范的一个重要版本,它在之前的基础上进行了重大改进,...
在这个“EJB3 Maven HelloWorld”项目中,我们将探讨如何利用Maven构建一个简单的EJB3应用程序,并在JBoss5应用服务器上运行。 首先,我们来看Maven。Maven是Java开发中的一个项目管理和综合工具,它通过使用一种...
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote"); out.println(helloworld.SayHello("佛山人")); 5.用ant或eclipse,把客户端文件打成war包,发布到jboss上 6.输入...
为了部署和运行这个EJB,开发者需要将这些组件打包到一个ejb-jar文件中,并将其放入符合Java EE规范的应用服务器(如JBoss 4.0.2)的部署目录下。应用服务器会自动处理bean的生命周期、事务、安全性和其他服务。 ...
初学ejb,一个入门例子。 两个project,一个为ejb,一为客户端。 软件版本:jboss-4.2.3.GA,Jdk1.6.0,myeclipse 10.0 部署ejb后,客户端导入jboss的client下的所有jar包。
以上步骤详细介绍了如何在 MyEclipse 8.5 环境下利用 EJB 3 和 JBoss 4 部署一个简单的 HelloWorld 示例项目。这个过程涵盖了环境搭建、项目创建、部署及测试等多个方面,有助于初学者更好地理解 Java EE 技术栈中的...
在【描述】中提到的博客文章可能涵盖了如何在JBoss环境下配置和部署EJB模块,以及如何创建和使用HelloWorld示例。通常,这样的教程会包括以下步骤: 1. **环境设置**:首先,需要安装并配置JBoss服务器,包括下载、...
从部分内容来看,文档主要分为环境搭建和HelloWorld实现两大部分,详细讲解了如何在Eclipse中搭建开发环境,如何通过JBoss7.1.1部署EJB,并实现了一个简单的HelloWorld应用。以下将详细介绍这两个部分所涉及的知识点...
这个HelloWorld示例展示了EJB的基本用法,包括如何定义接口和实现类,以及如何配置和部署。在实际开发中,EJB还可以用于实现更复杂的功能,如事务管理、安全性、持久化等。随着对EJB和JBoss的深入学习,你将能够构建...
**企业级JavaBeans(EJB)2.0详解——基于Helloworld示例** EJB(Enterprise JavaBeans)是Java EE(Java Platform, Enterprise Edition)平台的核心组成部分,它为开发分布式、事务处理、安全和可扩展的企业级应用...
${basedir}/HelloWorld.jar" todir="${jboss.home}/server/default/deploy/"/> ``` ### Eclipse集成开发环境 Eclipse是一款流行的开源IDE,广泛应用于Java和其他编程语言的开发。使用Eclipse可以方便地创建、...
2. **创建接口与实现类**:定义一个简单的EJB接口`HelloWorld`和其实现类`HelloWorldBean`。`HelloWorldBean`使用`@Stateless`和`@Remote`注解,分别表示这是一个无状态会话Bean,并且提供了远程调用的方法。 #### ...
在本文中,我们将详细探讨如何在JBoss7服务器上搭建EJB3环境,并通过一个简单的HelloWorld示例来说明整个过程。此过程分为两个主要部分:环境搭建和HelloWorld的实现。 首先,环境搭建部分涵盖了JBoss AS7的安装和...
#### (8):JBoss EJB3(HelloWorld)备忘记 这部分提供了一个简单的HelloWorld示例,用于演示如何从头开始构建EJB项目。 总结起来,这篇教程涵盖了从配置开发环境到编写和测试Session Bean的所有基本步骤。它不仅...
3. 把该项目导出为EJB格式的jar包到jboss-4.2.1.GA\server\default\deploy\目录 4. 在Eclipse中启动服务器 5. 运行app.Test客户端测试类 使用Eclipse 3.4 Ganymede开发EJB3.0的JavaEE应用比较简化和方便。该示例使用...
- **创建Hello World程序**:在Eclipse中创建简单的Java项目,编写并测试基础代码。 #### 3. JBoss安装 - **下载和安装JBoss**:获取JBoss的最新版本,按照官方指南完成安装过程。 - **Eclipse与JBoss集成**:配置...
然后,我们创建两个 Java 类:`HelloWorld.java` 和 `HelloWorldBean.java`。前者代表客户端接口,后者是 EJB 会话bean 的实现。这两个类分别放在不同的包下,`com.foshanshop.ejb3` 和 `com.foshanshop.ejb3.impl`...
【helloworld】通常是入门示例,展示基本的EJB功能。在这个例子中,可能会有一个简单的会话Bean,提供一个“Hello, World!”这样的方法,供客户端调用,从而演示EJB的基本使用。 总结来说,这个压缩包包含了使用EJB...