win2k環境下的JBOSS開發實踐

說明: 此節針對 ejb 開發初學者,主要是手動配置一個最基本的基於文本開發的環境,讓初學者從頭開始編寫各類程序和配置文件,以更清楚的瞭解 EJB 開發和部署的步聚與原理。這是作者在學習 EJB 開發時的一個總結,歡迎指正。作者聯繫地址址: [email protected]

一、需求軟件列表及下載地址
1、 Sun Java SDK ,我們採用的版本爲: j2sdk1.4.1_01 ,下載地址爲: http://www.sun.com/download/ ,下載後的文件名爲: j2sdk-1_4_1_01-windows-i586.exe

2、 JBOSS ,一個免費的 EJB 容器。我們採用版本爲: jboss-3.2.1_tomcat-4.1.24 ,這是一個內部己集成 Tomcat 的 EJB 容器。下載地址爲: http://www.jboss.org/ ,下載後的文件名爲: jboss-3.2.1_tomcat-4.1.24.zip 。

3、 注意:作者只保證在以上軟件版本下以下步聚成功,對於其它的版本也應相同,但作者沒有求證。以下步聚請嚴格按照執行。

二、安裝所需軟件
1、 安裝 SDK 到 C:/j2sdk1.4.1_01 ;方法爲:雙擊執行下載的 j2sdk-1_4_1_01-windows-i586.exe 文件,選擇安裝目錄爲 C:/j2sdk1.4.1_01 ,其它默認即可。

2、 安裝 JBOSS ;方法爲:將下載的 jboss-3.2.1_tomcat-4.1.24.zip 文件解壓到任意一個目錄,解壓後會在此目錄中產生一個 jboss-3.2.1_tomcat-4.1.24 文件夾,在此文件夾下有一系列的文件和文件夾。然後在 C 盤根目錄下建一個 JBOSS 目錄,並將剛纔解壓後 jboss-3.2.1_tomcat-4.1.24 文件夾下的一系列文件和文件夾全都拷貝到 C : /JBOSS 目錄下。即將 JBOSS 安裝到了 C:/JBOSS 目錄中。

3、 以上兩個步聚進行後,文件夾如下圖所示:


三、配置運行環境及測試程序目錄
一、設置環境變量

1、 設置 JAVA_HOME 系統變量:在 win2k 下方法爲,在桌面上右鍵點擊“我的電腦”,選擇屬性,然後在彈出的頁面上點“高級” -> “環境變量”,然後在彈出的頁面中“系統變量”下點擊“新建”,然後在彈出的窗口中“變量名 (N) 輸入“ JAVA_HOME ”,在“變量值 (V) ”一欄中輸入“ C:/j2sdk1.4.1_01 ”。

2、 以同樣的方法設置: JBOSS_HOME 值爲: C:/JBOSS

3、 以同樣的方法在上面地方將 Path 的值後追加:以下內容:“ C:/j2sdk1.4.1_01/bin;C:/JBOSS/bin ”

二、創建程序目錄

1、 在 C:/JBOSS 下新建一個 myproject 目錄,用於存放自己的所有項目。

2、 在 myproject 目錄下新建三個目錄:一個是 jsp 目錄,其下用於存放所有的 jsp 文件和 servlet 文件及其它的 html , image 文件等;一個是 ejb 目錄,用於存放所有即將發佈的 EJB 類文件;一個是 src 目錄,用於存放所有的 java 源文件。

3、 在 jsp 目錄下新建一個目錄,並命名爲: hello.war ,用來發布 WEB 程序,然後再在此目錄下新建一系列文件夾:即在 hello.war 下新建 WEB-INF (大寫)文件夾,再在 WEB-INF 下新建 classes 文件夾,再在 classes 文件夾下新建一個 hello 文件夾。

4、 在 ejb 目錄下新建一個 client 目錄和一個 hello.jar 目錄,分別用於存放 EJB 客戶端和要發佈的服務器端類。然後再在 client 目錄下新建一個 hello 目錄,再在此目錄下新建一個 ejb 目錄。然後在 hello.jar 目錄下新建一個 hello 目錄和一個 META-INF( 大寫 ) 目錄,並在 hello 目錄中新建一個 ejb 目錄。

5、 以上過程結束後,形成的目錄結構如下圖所示:


四、編寫測試程序及相關腳本
一、 測試 JBOSS 安裝成功與否,方法如下:進入 C : /JBOSS 目錄中,執行 run.bat –c all 啓動具有全部功能的 JBOSS 配置服務器。屏幕經過一會滾動後不再滾動。這時啓動 IE 輸入: http://localhost:8080/jmx-console/index.jsp 即可看到 IE 中出現一系列列表,即表明 JBOSS 啓動成功。此時可在啓動 JBOSS 的 DOS 窗口上按 Ctrl+C 關閉 JBOSS 服務器。

二、 進入 C:/JBOSS/myproject/jsp/hello.war 目錄中,用記事本新建一個 index.jsp 文件,內容如下:用於測試 jsp 程序

<%@page contentType="text/html; charset=gb2312"%>

<html>

<head>

<title></title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body bgcolor="#FFFFFF" text="#000000" topmargin="5">

<%

String hello = "Hello world!this created by jsp file!";

out.println(hello);

%>

</body>

</html>

三、 進入 C:/JBOSS/myproject/src 目錄,新建一個 HelloWorld.java ,是一個 Servlet 類,內容如下:

package hello;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class HelloWorld extends HttpServlet

{

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException

{

response.setContentType("text/html");

PrintWriter out = response.getWriter();

out.println("<hr>");

out.println("Hello World! This is created by Servlet!");

out.println("<hr>");

}

}

到此,我們就建立好了用於測試的 JSP 文件和 Servlet 類,下面將建 HelloWorld 的無狀態 SessionBean 。

四、 進入 C:/JBOSS/myproject/src 目錄,新建一個 Hello.java 文件,以實現 EJB 的 Remote 接口,內容如下,

package hello.ejb;

/**

* Remote interface for Enterprise Bean: Hello

* Remote 接口

*/

public interface Hello extends javax.ejb.EJBObject {

/**

* 唯一的方法 hello ,向客戶端返回問候。

*/

public String hello() throws java.rmi.RemoteException;

}

同樣在此目錄中新建一個 HelloLocal.java 文件,實現 Local 接口,內容如下:

package hello.ejb;

import javax.ejb.EJBLocalObject;

public interface HelloLocal extends EJBLocalObject {

public String hello();

}

同樣在此目錄中新建一個 HelloHome.java 文件,實現 Home 接口,內容如下:

package hello.ejb;

/**

* Home interface for Enterprise Bean: Hello

* Home 接口

*/

public interface HelloHome extends javax.ejb.EJBHome{

/**

* Creates a default instance of Session Bean: Hello

*/

public Hello create() throws javax.ejb.CreateException, java.rmi.RemoteException;

}

同樣在此目錄中新建一個 HelloLocalHome.java 文件,實現 LocalHome 接口,內容如下:

package hello.ejb;

import javax.ejb.EJBLocalHome;

public interface HelloLocalHome extends EJBLocalHome {

HelloLocal create() throws javax.ejb.CreateException;

}

同樣在此目錄中新建一個 HelloBean.java ,實現 EJB 類,內 [ 容如下:

package hello.ejb;

/**

* Bean implementation class for Enterprise Bean: Hello

*/

public class HelloBean implements javax.ejb.SessionBean{

private javax.ejb.SessionContext mySessionCtx;

/**

* getSessionContext

*/

public javax.ejb.SessionContext getSessionContext(){

return mySessionCtx;

}

/**

* setSessionContext

*/

public void setSessionContext(javax.ejb.SessionContext ctx){

mySessionCtx = ctx;

}

/**

* ejbActivate

*/

public void ejbActivate(){

}

/**

* ejbCreate

*/

public void ejbCreate() throws javax.ejb.CreateException{

}

/**

* ejbPassivate

*/

public void ejbPassivate(){

}

/**

* ejbRemove

*/

public void ejbRemove(){

}

/**

* 商務方法

*/

public String hello(){

return "Hello,World! this is created by EJB!";

}

}

至此,我們己經將 EJB 類所需的所有的所有類編寫好了,下面我們編寫用於測試此 EJB 程序的文件,具體來說有兩個:一個是用客戶端 Servlet 來調用 EJB ,另一個是用客戶端類來調用 EJB 。實現如下:

五、 實現測試 EJB 的程序

進入 C:/JBOSS/myproject/src 目錄中,新建一個 HelloServlet.java 文件,用於測試通過 Servlet 調用 EJB 。內容如下:

package hello;

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import javax.ejb.*;

import javax.naming.InitialContext;

import javax.naming.Context;

import hello.ejb.*;

import java.util.*;

public class HelloServlet extends HttpServlet

{

private HelloHome home;

public void init() throws ServletException

{

try

{

String initCtxFactory = getInitParameter(Context.INITIAL_CONTEXT_FACTORY);

String providerURL = getInitParameter(Context.PROVIDER_URL);

Properties env = new Properties();

if(initCtxFactory!=null)

{

env.put(Context.INITIAL_CONTEXT_FACTORY,initCtxFactory);

}

if(providerURL!=null)

{

env.put(Context.PROVIDER_URL,providerURL);

}

Context ctx=new InitialContext(env);

Object objRef = ctx.lookup("Hello");

// 主接口

home=(HelloHome)javax.rmi.PortableRemoteObject.narrow(objRef,hello.ejb.HelloHome.class);

}catch(javax.naming.NamingException ne){

System.out.println("Create Exception caught:"+ne);

throw new ServletException(ne.toString());

}catch(Exception e)

{

throw new ServletException(e.toString());

}

}

public void service(HttpServletRequest req,HttpServletResponse res) throws IOException

{

res.setContentType("text/html");

PrintWriter out =res.getWriter();

out.println("<html><head><title>the first EJB</title></head>");

try{

// 組件接口

Hello bean =home.create();

out.println(bean.hello());

}catch(javax.ejb.CreateException ce){

out.println("Create Exception caught:"+ce);

ce.printStackTrace(out);

}catch(java.rmi.RemoteException re){

out.println("Remote Exception caught:"+re);

re.printStackTrace(out);

}

out.println("</body></html>");

}

}

同樣在此目錄中,新建一個 HelloClient.java 文件,用於通過客戶端類測試 EJB ,內容如下:

package hello.ejb;

import java.util.*;

import java.io.*;

import javax.naming.InitialContext;

import javax.rmi.PortableRemoteObject;

import javax.naming.Context;

import javax.rmi.PortableRemoteObject;

import hello.ejb.*;

public class HelloClient

{

public static void main(String[] args)

{

try

{

//jndi 配置 , 應實現爲外部屬性文件

Properties env = new Properties();

//config.properties 文件應該放在和 hello 包目錄所在目錄的同級目錄中。即它和 hello 文件夾同在一個文件夾中。

env.load(new FileInputStream("config.properties"));

// Get a naming context

System.out.println(env);

InitialContext ctx = new javax.naming.InitialContext(env);

System.out.println("Got context");

// Get a reference to the Interest Bean

//jboss 默認 jndi 名爲 ejb-jar.xml 中的 :ejb-name

Object ref = ctx.lookup("Hello");

System.out.println("Got reference");

// Get a reference from this to the Bean"s Home interface

HelloHome home = (HelloHome)PortableRemoteObject.narrow(ref, HelloHome.class);

// Create an Hello object from the Home interface

Hello hello = home.create();

// call the hello() method

System.out.println(hello.hello());

}catch(Exception e)

{

System.out.println(e.toString());

}

}

}

然後,我們還需增加一個此客戶端程序運行時所需的 JNDI 配置文件。方法如下:

進入 : C:/JBOSS/myproject/ejb/client 目錄,用記事本新建一個 config.properties 文件,內容如下三行:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory

java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

java.naming.provider.url=jnp://192.168.10.114:1099

六、 編寫服務器端的配置文件,

首先進入 C:/JBOSS/myproject/jsp/hello.war/WEB-INF 目錄,用記事本創建一個 web.xml 文件,用於配置 servlet ,內容如下:

<?xml version="1.0" encoding="gb2312"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<servlet>

<servlet-name>HelloWorld</servlet-name>

<display-name>HelloWorld</display-name>

<servlet-class>hello.HelloWorld</servlet-class>

</servlet>

<servlet>

<servlet-name>HelloServlet</servlet-name>

<display-name>HelloServlet</display-name>

<servlet-class>hello.HelloServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>HelloWorld</servlet-name>

<url-pattern>/HelloWorld</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>HelloServlet</servlet-name>

<url-pattern>/HelloServlet</url-pattern>

</servlet-mapping>

</web-app>

然後進入 C:/JBOSS/myproject/ejb/hello.jar/META-INF 目錄,創建一個 ejb-jar.xml 文件,內容如下:

<?xml version="1.0" encoding="gb2312"?>

<!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 Hello EJB example</description>

<display-name>helloeEJB</display-name>

<enterprise-beans>

<session>

<display-name>Hello</display-name>

<ejb-name>Hello</ejb-name>

<home>hello.ejb.HelloHome</home>

<remote>hello.ejb.Hello</remote>

<local-home>hello.ejb.HelloLocalHome</local-home>

<local>hello.ejb.HelloLocal</local>

<ejb-class>hello.ejb.HelloBean</ejb-class>

<session-type>Stateless</session-type>

<transaction-type>Container</transaction-type>

</session>

</enterprise-beans>

</ejb-jar>

在此目錄中,再建一個 jboss-service.xml 文件,內容如下:

<?xml version="1.0" encoding="gb2312"?>

<jboss>

<enterprise-beans>

<session>

<ejb-name>Hello</ejb-name>

<jndi-name>Hello</jndi-name>

</session>

<secure>true</secure>

</enterprise-beans>

<reource-managers/>

</jboss>

七、 到此爲止,我們將所有的測試文件和配置文件己編寫完成。

八、 下面我們編寫編譯這些類文件的腳本程序,進入 C:/JBOSS/BIN 目錄下,新建一個 com.bat 文件,內容如下:

set classpath=.;c:/j2sdk1.4.1_01/lib/tools.jar;C:/JBOSS/client/jbossall-client.jar;C:/JBOSS/client/jboss-client.jar;C:/JBOSS/client/jboss-iiop-client.jar;C:/JBOSS/server/default/lib/jnpserver.jar;C:/JBOSS/client/jnp-client.jar;C:/JBOSS/client/log4j.jar;C:/JBOSS/client/jboss-j2ee.jar; C:/JBOSS/server/all/lib/javax.servlet.jar

javac %1

同樣在此目錄新建一個 runclient.bat ,用於運行客戶端程序,內容如下:

set classpath=.;c:/j2sdk1.4.1_01/lib/tools.jar;C:/JBOSS/client/jbossall-client.jar;C:/JBOSS/client/jboss-client.jar;C:/JBOSS/client/jboss-iiop-client.jar;C:/JBOSS/server/default/lib/jnpserver.jar;C:/JBOSS/client/jnp-client.jar;C:/JBOSS/client/log4j.jar;C:/JBOSS/client/jboss-j2ee.jar; C:/JBOSS/server/all/lib/javax.servlet.jar

java %1

五、編譯和運行測試程序
1、 進入 C:/JBOSS/myproject/src 目錄中,運行 :

com *.java

將產生一系列 .class 文件。

2、 將產生的 HelloWorld.class 和 HelloServlet.class 拷貝到 C:/JBOSS/myproject/jsp/hello.war/WEB-INF/classes/hello 目錄中。

3、 將產生的 HelloHome.class 和 HelloClient.class 和 Hello.class 文件放入 C:/JBOSS/myproject/ejb/client/hello/ejb 目錄中

4、 將產生的 Hello.class 和 HelloBean.class 和 HelloHome.class 和 HelloLocal.class 和 HelloLocalHome.class 放入 C:/JBOSS/myproject/ejb/hello.jar/hello/ejb 目錄中。

至此,我們己經完成了所有類的編譯,並將它們放入到適當的地方,目前爲止,文件和目錄分佈結構如下圖所示:

這時,我們將 myproject 下 ejb 目錄中的 hello.jar 目錄和 jsp 下的 hello.war 目錄拷貝到

C:/JBOSS/server/all/deploy 下。

這時啓動 JBOSS 的工作臺自動會發布此兩個目錄。我們便可以測試了。

啓動 JBOSS :

run.bat –c all

用 IE 打開 http://localhost:8080/hello/index.jsp 測試 JSP 文件

用 IE 打開 http://localhost:8080/hello/HelloWorld 測試 Serlvet

用 IE 打開 http://localhost:8080/hello/HelloServlet 測試用 Servlet 調用 EJB

然後進入

C:/JBOSS/myproject/ejb/client 運行:

Runclient hello/ejb/HelloClient

-----------------------------------------------------------------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章