`
dreamstone
  • 浏览: 288502 次
  • 来自: ...
文章分类
社区版块
存档分类

走近EJB Jboss 下 Hello World

阅读更多
每次学习一些新的东西都是从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

    **EJB3.0之HelloWorld** EJB(Enterprise JavaBeans)是Java平台企业版(Java EE)的一部分,主要用于构建可扩展、可移植和可信赖的企业级应用。EJB3.0是EJB规范的一个重要版本,它在之前的基础上进行了重大改进,...

    EJB3 maven helloworld项目

    在这个“EJB3 Maven HelloWorld”项目中,我们将探讨如何利用Maven构建一个简单的EJB3应用程序,并在JBoss5应用服务器上运行。 首先,我们来看Maven。Maven是Java开发中的一个项目管理和综合工具,它通过使用一种...

    EJB HelloWorld

    HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote"); out.println(helloworld.SayHello("佛山人")); 5.用ant或eclipse,把客户端文件打成war包,发布到jboss上 6.输入...

    ejb_helloworld

    为了部署和运行这个EJB,开发者需要将这些组件打包到一个ejb-jar文件中,并将其放入符合Java EE规范的应用服务器(如JBoss 4.0.2)的部署目录下。应用服务器会自动处理bean的生命周期、事务、安全性和其他服务。 ...

    ejb3.0 helloworld例子

    初学ejb,一个入门例子。 两个project,一个为ejb,一为客户端。 软件版本:jboss-4.2.3.GA,Jdk1.6.0,myeclipse 10.0 部署ejb后,客户端导入jboss的client下的所有jar包。

    MyEclipse+EJB3+JBoss4部署EBJ+web项目HelloWorld详解

    以上步骤详细介绍了如何在 MyEclipse 8.5 环境下利用 EJB 3 和 JBoss 4 部署一个简单的 HelloWorld 示例项目。这个过程涵盖了环境搭建、项目创建、部署及测试等多个方面,有助于初学者更好地理解 Java EE 技术栈中的...

    JBoss+Ejb

    在【描述】中提到的博客文章可能涵盖了如何在JBoss环境下配置和部署EJB模块,以及如何创建和使用HelloWorld示例。通常,这样的教程会包括以下步骤: 1. **环境设置**:首先,需要安装并配置JBoss服务器,包括下载、...

    EJB3.1与JBoss7.1.1在eclipse的实现

    从部分内容来看,文档主要分为环境搭建和HelloWorld实现两大部分,详细讲解了如何在Eclipse中搭建开发环境,如何通过JBoss7.1.1部署EJB,并实现了一个简单的HelloWorld应用。以下将详细介绍这两个部分所涉及的知识点...

    jboss7.1+ejb3.1建立第一个Ejb项目

    这个HelloWorld示例展示了EJB的基本用法,包括如何定义接口和实现类,以及如何配置和部署。在实际开发中,EJB还可以用于实现更复杂的功能,如事务管理、安全性、持久化等。随着对EJB和JBoss的深入学习,你将能够构建...

    EJB2.0一个完整的Helloworld

    **企业级JavaBeans(EJB)2.0详解——基于Helloworld示例** EJB(Enterprise JavaBeans)是Java EE(Java Platform, Enterprise Edition)平台的核心组成部分,它为开发分布式、事务处理、安全和可扩展的企业级应用...

    ejb+jboss+eclipse.txt

    ${basedir}/HelloWorld.jar" todir="${jboss.home}/server/default/deploy/"/&gt; ``` ### Eclipse集成开发环境 Eclipse是一款流行的开源IDE,广泛应用于Java和其他编程语言的开发。使用Eclipse可以方便地创建、...

    yeclipse7.0+JBoss5.0测试EJB3.0环境搭建过程详解

    2. **创建接口与实现类**:定义一个简单的EJB接口`HelloWorld`和其实现类`HelloWorldBean`。`HelloWorldBean`使用`@Stateless`和`@Remote`注解,分别表示这是一个无状态会话Bean,并且提供了远程调用的方法。 #### ...

    jboss7+EJB3环境搭建

    在本文中,我们将详细探讨如何在JBoss7服务器上搭建EJB3环境,并通过一个简单的HelloWorld示例来说明整个过程。此过程分为两个主要部分:环境搭建和HelloWorld的实现。 首先,环境搭建部分涵盖了JBoss AS7的安装和...

    eclipse + JBoss 5 + EJB3开发指南

    #### (8):JBoss EJB3(HelloWorld)备忘记 这部分提供了一个简单的HelloWorld示例,用于演示如何从头开始构建EJB项目。 总结起来,这篇教程涵盖了从配置开发环境到编写和测试Session Bean的所有基本步骤。它不仅...

    使用JBoss 4.2书写EJB3.0无状态会话Bean + JPA + MySql 5.0的Hello World Java EE应用

    3. 把该项目导出为EJB格式的jar包到jboss-4.2.1.GA\server\default\deploy\目录 4. 在Eclipse中启动服务器 5. 运行app.Test客户端测试类 使用Eclipse 3.4 Ganymede开发EJB3.0的JavaEE应用比较简化和方便。该示例使用...

    J2EE-Ejb-Jboss

    - **创建Hello World程序**:在Eclipse中创建简单的Java项目,编写并测试基础代码。 #### 3. JBoss安装 - **下载和安装JBoss**:获取JBoss的最新版本,按照官方指南完成安装过程。 - **Eclipse与JBoss集成**:配置...

    ejb3.0 +jboss4.2 实例开发

    然后,我们创建两个 Java 类:`HelloWorld.java` 和 `HelloWorldBean.java`。前者代表客户端接口,后者是 EJB 会话bean 的实现。这两个类分别放在不同的包下,`com.foshanshop.ejb3` 和 `com.foshanshop.ejb3.impl`...

    ejb课程测试代码,eclipse+jboss5.1 ant编译等代码

    【helloworld】通常是入门示例,展示基本的EJB功能。在这个例子中,可能会有一个简单的会话Bean,提供一个“Hello, World!”这样的方法,供客户端调用,从而演示EJB的基本使用。 总结来说,这个压缩包包含了使用EJB...

Global site tag (gtag.js) - Google Analytics