J2EE入门教程

2005-12-11 20:20:21

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...
服务器便关闭了。
EJB是J2EE中最重要的技术之一,它是支持分布式事务的分布式组件,我们以Hello World为例,编写第一个名为Hello的最简单的Session Bean。
根据EJB2.1规范,编写一个Session Bean需要以下几个类和接口:
远程接口Hello,客户端使用这个接口来访问EJB:
// Hello.java

// 远程接口:EJBObject

import 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在当前目录下可以找到编译后的Hello.class,HelloHome.class和HelloBean.class三个文件。
部署
部署是将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实现自动编译、部署并测试。

编写客户端程序访问EJB
这里,我们编写一个基于控制台的application客户端来访问EJB:
// Client.java

import 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然后编译:
C:/client运行:
C:/client屏幕输出:
Hello, world.
我们的第一个EJB终于调用成功!


在JSP/Servlet中调用EJB
在JSP/Servlet中调用EJB的代码和客户端是一样的,不同的是,调用代码也运行在服务器端,客户端只需要通过浏览器请求就可以获得结果,不必在客户端机器上也安装Java环境,这就是所谓的瘦客户端。
我们先编写一个JSP页面,命名为hello.jsp:
>%@ page import="javax.naming.*,javax.rmi.*,Hello,HelloHome" %<
>html<
>head<
>title/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:
浏览器显示出了正确的页面!

你可能感兴趣的:(J2EE入门教程)