我完全按照以下这个做的,请指教:J2EE入门教程
本教程讲述Sun J2EE 1.3 SDK的安装、配置和创建并部署第一个简单的EJB。
我们的目标平台是Windows XP SP2,JDK 1.4.2和J2EE SDK 1.3.1的Windows版本。我们在下面的实践中主要使用命令行模式,便于深入J2EE的内部机制。
首先,必须正确安装JDK1.4.2,如果你还没有安装JDK1.4.2,请参考Hello World的Java教程。
1.下载并安装j2sdkee-1.3.1
J2EE是一个规范而并非一个产品,任何厂家都可以实现这个规范,如BEA的WebLogic,IBM的WebSphere等等,SUN给出了一个最简单的J2EE完整实现,就是J2EE SDK,它是免费的,适用于学习J2EE而非运行实际的商用程序。我们使用的J2EE SDK版本是1.3.1,可以从SUN的站点下载j2sdkee-1_3_1-win.exe,地址如下:
http://java.sun.com/j2ee/sdk_1.3/
然后运行安装程序,选择安装目录(默认是C:\j2sdkee1.3.1),根据向导完成安装。
2.配置环境变量
必须首先正确配置JDK1.4的环境变量,包括JAVA_HOME,CLASSPATH和PATH,请参考Hello World的Java教程。
然后,配置J2EE 1.3.1,设置如下环境变量:
J2EE_HOME=<j2sdkee1.3.1安装目录>,我的目录是C:\j2sdkee1.3.1
PATH=<原PATH>;%J2EE_HOME%\bin
将J2EE安装目录下的lib\j2ee.jar添加到CLASSPATH中,我的CLASSPATH设置如下:
CLASSPATH=.;C:\j2sdkee1.3.1\lib\j2ee.jar
3.启动和停止J2EE服务器
打开命令行窗口,输入j2ee -verbose,屏幕显示一些信息,看到以下信息后,J2EE服务器启动成功。要停止J2EE服务器,请打开另一个命令行窗口,输入:j2ee -stop
屏幕输出
Shutting down the J2EE server.
Shutting down JMS service...
服务器便关闭了。
4.编写代码
EJB是J2EE中最重要的技术之一,它是支持分布式事务的分布式组件,我们以Hello World为例,编写第一个名为Hello的最简单的Session Bean。
根据EJB2.1规范,编写一个Session Bean需要以下几个类和接口:
远程接口Hello,客户端使用这个接口来访问EJB:
// Hello.java// 远程接口:EJBObjectimport javax.ejb.*;
import java.rmi.*;public interface Hello extends EJBObject {
    // 业务方法,必须抛出RemoteException:
    public String say() throws RemoteException;
}
Home接口HelloHome,客户端使用这个接口来创建EJB并在稍后调用其业务方法:
// HelloHome.java// Home接口,负责创建EJB:import java.io.*;
import java.rmi.*;
import javax.ejb.*;public interface HelloHome extends EJBHome {
    // create方法需要抛出RemoteException和CreateException:
    Hello create() throws RemoteException, CreateException;
}
实现业务逻辑的类HelloBean,客户端永远无法直接访问它,只能通过远程接口来间接访问它,HelloBean只有一个业务方法:
// HelloBean.java// 实现真正业务方法的Bean,由容器管理,
// 客户端通过远程接口间接访问它:import java.rmi.*;
import javax.ejb.*;public class HelloBean implements SessionBean {
    private SessionContext ctx;
    public String say() {
        return "Hello, world.";
    }
    public void setSessionContext(SessionContext ctx) {
        this.ctx = ctx;
    }
    public void ejbCreate() {}
    public void ejbRemove() {}
    public void ejbActivate() {}
    public void ejbPassivate() {}
}
从上面可以看到,为了编写一个Bean,需要额外的两个接口支持,并且,由于HelloBean不实现Hello接口,这些方法申明和实现如果不一致,只有在部署时才能发现问题。某些工具(如XDoclet)可以根据特定的注释自动生成Remote和Home接口。在EJB 3.0规范中,开发者就只需要编写Bean,剩下的Remote和Home接口都由工具根据EJB 3的注释自动生成,因此大大简化了开发。
为了提高EJB的调用速度,如果客户端和EJB容器位于同一个JVM内(例如运行在同一个JVM中的JSP和EJB),还可以使用本地接口,但是这两个接口不是必需的,因此我们不去实现它。
现在我们一共有3个文件:Hello.java,HelloHome.java,HelloBean.java,放在C:\example目录下,然后开始编译:
C:\example>javac *.java
在当前目录下可以找到编译后的Hello.class,HelloHome.class和HelloBean.class三个文件。

解决方案 »

  1.   

    5.部署
    部署是将J2EE组件(EJB,JSP,Servlet等)正确安装并配置到J2EE服务器中,然后,客户端程序才能够访问它。EJB运行在EJB容器中,因此,必须把我们编写的Bean部署到服务器上。
    首先,确保J2EE服务器正在运行,请参考第3步:启动和停止J2EE服务器。
    然后,再打开一个新的命令行窗口,输入:
    deploytool
    稍等片刻,出现部署窗口:首先,我们需要新建一个服务器端应用程序:
    选择File > New > Application…:
    输入希望存放ear文件的完整路径和应用程序的名称,当然,这里我们的这个C:\helloapp\ear文件并不存在,部署工具稍后会创建它。
    现在,Deployment Tool已经创建了一个hello的Application,但是还没有任何可以部署的组件:
    下一步,我们将要添加前面我们编写的第一个EJB:
    选择File > New > Enterprise Bean…,然后,按照向导开始部署EJB:
    在Contents栏中,需要添加所有必须的class文件,点击“Edit…”,添加我们编译好的3个class文件:然后,向导提示选择EJB类型。EJB 2共有3种Bean:Session Bean,Entity Bean和Message-Driven Bean,我们编写的是Session Bean,并且选择Stateless,表示该Session Bean是无状态会话Bean,所有客户端都可以共享一个Bean。如果选择Stateful,则每个客户端会拥有不同的Bean,类似于web应用程序的session机制。
    在下面的下拉列表框中,选择对应的class。注意我们没有编写Local Home和Local Interface,因此让它们保持为空。然后输入Enterprise Bean Name:HelloBean。剩下的可以直接使用默认值,一路Next即可。完成后,可以看到,主窗口多了一个Ejb1,选中它,我们还需要在JNDI Names一栏填入ejb/Hello,客户端将根据JNDI Name来查找我们编写的Bean:
    选择File > Save,保存我们创建的Application。接下来,我们将把这个Application部署到服务器上。
    选择Tools > Deploy,出现Deploy向导:
    对话框提示我们将要部署的应用程序是hello,目标服务器是localhost,然后,一定要选中Return Client Jar,因为要从客户端访问部署在J2EE SDK服务器上的应用,必须要有这个Jar包。如果使用其他服务器,也需要相应的Jar包,如JBoss客户端需要jbossall-client.jar。这里,我们选择好存放Client Jar的目录,然后Next即可。
    最后,J2EE服务器开始编译并部署我们的Hello Bean,可以看到两个进度条:
    当进度条填满时,表示部署成功!可以在j2ee服务器的控制台窗口上看到如下输出:
    Compiling C:\j2sdkee1.3.1\repository\cn1d6xuc\gnrtrTMP\hello\HelloBean_RemoteHom
    eImpl.java ....
    Compiling C:\j2sdkee1.3.1\repository\cn1d6xuc\gnrtrTMP\hello\HelloBean_EJBObject
    Impl.java ....
    rmic HelloBean_RemoteHomeImpl...
    rmic HelloBean_EJBObjectImpl...
    Application hello deployed.
    整个部署是在窗口模式下进行的,好处是不用编写繁琐的xml配置文件。在实际的开发过程中,如果每当修改代码都这样部署一遍是非常低效的,因此应当使用ant实现自动编译、部署并测试。
    6.编写客户端程序访问EJB
    这里,我们编写一个基于控制台的application客户端来访问EJB:
    // Client.javaimport javax.naming.*;
    import javax.rmi.*;public class Client {
        public static void main(String[] args) throws Exception {
            // init context:
            Context ctx = new InitialContext();
            // 通过JNDI查找HelloBean:
            Object obj = ctx.lookup("ejb/Hello");
            // 获得home object:
            HelloHome home = (HelloHome)PortableRemoteObject.narrow(obj, HelloHome.class);
            // 创建ejb object:
            Hello hello = home.create();
            // 调用商业方法:
            String words = hello.say();
            System.out.println(words);
        }
    }
    然后打开控制台,先设置好CLASSPATH,主要是将部署时生成的helloClient.jar添加到CLASSPATH中:
    C:\client>set CLASSPATH=%CLASSPATH%;C:\client\helloClient.jar
    然后编译:
    C:\client>javac Client.java
    运行:
    C:\client>java Client
    屏幕输出:
    Hello, world.
    我们的第一个EJB终于调用成功!
    7.在JSP/Servlet中调用EJB
    在JSP/Servlet中调用EJB的代码和客户端是一样的,不同的是,调用代码也运行在服务器端,客户端只需要通过浏览器请求就可以获得结果,不必在客户端机器上也安装Java环境,这就是所谓的瘦客户端。
    我们先编写一个JSP页面,命名为hello.jsp:
    <%@ page import="javax.naming.*,javax.rmi.*,Hello,HelloHome" %>
    <html>
    <head>
    <title>Test HelloEJB</title>
    </head>
    <body>
    <%
        // init context:
        Context ctx = new InitialContext();
        // lookup:
        Object obj = ctx.lookup("ejb/Hello");
        // get home object:
        HelloHome home = (HelloHome)PortableRemoteObject.narrow(obj, HelloHome.class);
        // create ejb object:
        Hello hello = home.create();
        // invoke business method:
        String words = hello.say();
        out.println(words);
    %>
    </body>
    </html>Web应用程序需要按照如下目录结构组织:
    其中,WEB-INF/classes存放自己编写的class文件,WEB-INF/lib存放用到的所有jar包,其他的JSP文件可以存放在根目录下的任何位置。和EJB组件一样,作为Web组件的JSP和Servlet也必须部署到服务器上。启动服务器,再次运行deploytool,并打开上次我们建立的hello application,选择File > New > Web Component,按Next跳过欢迎屏幕,出现下面的对话框:类似EJB的部署,我们也需要将hello.jsp和helloClient.jar添加到Contents中。点击Edit添加hello.jsp和helloClient.jar这两个文件,请注意目录结构,添加完的目录结构一定是下图所示,否则Web应用程序不会正常工作:
    然后Next,选择Web组件的类型,这里我们应当选择JSP:在下一个对话框中选择hello.jsp:然后一路Next,当出现WAR Context Root时,输入“/”:剩下的均保持默认值即可。现在我们的Hello应用程序有两个组件:一个EJB和一个JSP:
    然后选择Tools > Deploy…,将应用程序重新部署一遍,完毕后,打开浏览器,输入http://localhost:8000/hello.jsp:浏览器显示出了正确的页面!
    我的HelloWorld文件夹(即项目文件夹)下只有这么几个内容:Client.class
    Client.java
    ejb_temp45438.jar
    Hello.ear
    RemoteHome.class
    RemoteHome.java
    RemoteInterface.class
    RemoteInterface.java
    RemoteObject.class
    RemoteObject.java没有其它任何文件和任何文件夹,连WEB-INF   CLASSES都没有,不知道是什么回事,也不知道应该怎么办?小弟初学,请多多光照!