`
jacktanlikejava
  • 浏览: 8525 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

实战在Jboss环境下Web Service调用EJB

 
阅读更多

既然是实战,讲究的是实用性,所以关于JbossWeb ServiceEJB的入门介绍这里就免去了,请自行查阅相关资料。好,实战正式开始!

一.开发环境:

1. Java SDK1.4

2. Eclipse3.0中文版

3. Jboss3.2应用服务器

4. Windows 2000中文专业版

二.环境变量的设置:

以下是我自己机器的环境变量设置,如果是linux系统,设置有所不同:

ANT_HOME=C:/ant

JAVA_HOME=C:/j2sdk

JBOSS_HOME=C:/jboss

最后在系统变量的path变量中追加C:/jboss/bin;

三.会话Bean的编写:

EJB中,会话BEAN需要实现一个远程接口和一个本地接口,那我们就先实现这个两个接口:

1. 远程接口:

我们实现的是一个人员管理的用例,这个用例包含3个方法,代码如下:

package com.ejb.sessionbean;

/**

* Remote interface for PersonManager.

*/

public interface PersonManager

extends javax.ejb.EJBObject

{

public com.pojo.Person getPersonByName( java.lang.String name )

throws java.rmi.RemoteException;

public void storePerson( com.pojo.Person person )

throws java.rmi.RemoteException;

public void deletePerson( java.lang.String name )

throws java.rmi.RemoteException;

}

PersonManager接口实现的是EJB的远程接口EJBObject,包含3个方法,描述如下:

(1) getPersonByName方法:通过人员的姓名返回一个Person对象;

(2) storePerson方法,通过一个Person对象参数,往人员集合中存储一个人员对象;

(3) deletePerson方法,根据一个人员的姓名从人员集合中删除一个人员对象

由于是远程接口,所以每个方法必须抛出RemoteException异常。

2. 本地HOME接口的实现:

为了提高EJB的性能,如果是在同一个虚拟机中,EJB可以通过本地接口来调用方法,以提高运行速度。实现代码如下:

/*

* Generated by XDoclet - Do not edit!

*/

package com.ejb.sessionbean;

/**

* Home interface for PersonManager.

*/

public interface PersonManagerHome

extends javax.ejb.EJBHome

{

public static final String COMP_NAME="java:comp/env/ejb/PersonManager";

public static final String JNDI_NAME="PersonManagerHomeRemote";

public com.ejb.sessionbean.PersonManager create()

throws javax.ejb.CreateException,java.rmi.RemoteException;

}

PersonManagerHome接口只有一个方法,create方法,它与会话bean的具体实现类中ejbCeate方法一一对应。

3. 具体实现类:

PersonManagerBean是会话BEAN的具体实现类,实现了在远程接口中定义的相关业务逻辑方法,具体实现代码如下

package com.ejb.sessionbean;

import java.rmi.RemoteException;

import java.util.*;

import javax.ejb.EJBException;

import javax.ejb.SessionBean;

import javax.ejb.SessionContext;

import com.pojo.*;

/**

* @ejb.bean description = "PersonManagerBean" display-name =

* "PersonManagerBean" jndi-name="PersonManagerHomeRemote"

* name="PersonManager" type="Stateless" view-type="remote"

* transaction-type="Container"

* @jboss-net.web-service urn = "PersonManagerService" expose-all = "true"

*/

public class PersonManagerBean

implements SessionBean

{

private SessionContext ctx;

private static Map database;

/**

* @ejb.create-method

*

*/

public void ejbCreate()

{

}

public void setSessionContext( SessionContext ctx ) throws EJBException,

RemoteException

{

// TODO 自动生成方法存根

}

public void ejbRemove() throws EJBException, RemoteException

{

// TODO 自动生成方法存根

}

public void ejbActivate() throws EJBException, RemoteException

{

// TODO 自动生成方法存根

}

public void ejbPassivate() throws EJBException, RemoteException

{

// TODO 自动生成方法存根

}

/**

* @ejb.interface-method view-type = "remote"

* @param name

* @return

*/

public Person getPersonByName( String name )

{

if (database != null)

{

return (Person) database.get(name);

}

return null;

}

/**

* @ejb.interface-method view-type = "remote"

* @param person

*/

public void storePerson( Person person )

{

if (database == null)

{

database = new HashMap();

}

database.put(person.getName(), person);

}

/**

* @ejb.interface-method view-type = "remote"

* @param name

*/

public void deletePerson( String name )

{

if (database != null)

{

database.remove(name);

}

}

}

4. 数据模型类:

会话BEAN中使用到了一个Person类,该类是一个数据模型,用于数据的封装。实现上和普通的Javabean值对象没有什么区别,不过为了在网络间传递,值对象必须实现序列化接口java.io. Serializable接口,这是个空接口,仅作为标志类型,没有需要实现的方法,代码如下:

import java.io.Serializable;

/**

* @jboss-net.xml-schema urn = "person:Person"

*/

public class Person

implements Serializable

{

private String name;

public Person()

{

this.name = "unknow";

}

public Person( String name )

{

this.name = name;

}

public String toString()

{

StringBuffer sb = new StringBuffer();

sb.append("name=" + this.name + "/n");

return sb.toString();

}

/**

* @return 返回 name

*/

public String getName()

{

return name;

}

/**

* @param name

* 要设置的 name

*/

public void setName( String name )

{

this.name = name;

}

}

另外,在PersonManagerBeanPerson类中都使用了xdoclet标志,这个是为了能通过jboss IDE插件来产生antbuild文件,然后自动生成EJB的配置文件和Web Service的配置文件。

四.使用ant产生EJBWeb Service的配置文件

利用ant我们可以很方便的自动生成EJBWeb Service的配置文件,省去了手工编写的麻烦。Antbuild.xml文件代码如下:

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

<project name="PersonManager" basedir="." default="xdoclet">

<property environment="evn" />

<property name="generated.dir" location="src" />

<path id="xdoclet.classpath">

<fileset dir="lib">

<include name="**/*.jar" />

</fileset>

<pathelement location="bin" />

</path>

<target name="xdoclet">

<taskdef classpathref="xdoclet.classpath" classname="xdoclet.modules.ejb.EjbDocletTask" name="ejbdoclet" />

<ejbdoclet ejbSpec="2.0" destDir="src">

<homeinterface />

<remoteinterface />

<jboss Version="3.2" destDir="build/PersonManagerService/META-INF" />

<deploymentdescriptor destDir="build/PersonManagerService/META-INF" />

<fileset dir="src" includes="com/ejb/sessionbean/*.java,com/pojo/*.java">

</fileset>

<jbossnet xmlencoding="UTF-8" destdir="build/PersonManagerService/META-INF" webDeploymentName="PersonManagerService" targetNameSpace="http://localhost:8080/pojo/person" prefix="person" />

</ejbdoclet>

</target>

</project>

在运行ant之前还必须做2件事情:

1. ${JBOSS_HOME}/server/all/lib目录下将jboss-j2ee.jar文件复制到当前项目的lib目录下,如果没有lib目录,自己创建一个。

2. ${ECLIPSE_HOME}/plugins/org.jboss.ide.eclipse.xdoclet.core_1.4.1目录下的所有jar文档也复制到当前项目的lib目录中。注:这个目录只有安装了Jboss-IDE插件之后才会有。

运行ant命令,如果顺利完成,会在当前项目的build/PersonManagerService/META-INF目录下产生3xml文件:ejb-jar.xmljboss.xmlweb-service.xml

五.利用Jboss-IDE插件部署发布EJBWeb Service

1. Jboss-IDE插件的下载和安装

Jboss-IDEJboss推荐的一个辅助J2EE开发的Eclipse插件,可以去http://www.jboss.com/products/jbosside/downloads的官方网站下载,当前版本1.4.1。安装jboss-ide插件的方法和安装其他的标准Eclipse插件没有区别,安装成功之后就可以在首选项中看到Jboss-IDE选项。如下图:

<图片无法上传>

2. 利用Jboss-IDE打包EJB

切换到java透视图模式下,然后在项目名称上点击右键,在出现的右键菜单上选择属性,在出现的窗口中选择Packaging Configuration选项,出现如下的窗口

以上是设置完成之后的最终窗口,如果没有设置,请点击add…按钮,出现如下窗口

<图片无法上传>

name框中输入打包jar文档的名称,我们可以输入PersonManager.jar,在Destination中点击Browse按钮,选择当前项目中的bulid目录,这个选项是指定jar文件的输出目录,如果当前项目中没有build目录,请自己创建一个。完成之后点击确定完成;

PersonManager.jar选项上点击右键,在出现的右键菜单上选择Add Folder选项,出现以下窗口

<图片无法上传>

Folder输入框中选择会话beanclass文件,如:/WebService/bin/com/ejb/sessionbean,在Includes输入框中输入*.class,表示将该目录下的所有class文件进行打包,在perfix中输入class文件的打包路径,如:com/ejb/sessionbean,这个路径必须和类中的package的设置一样,然后点击确定完成。

用同样的方法再创建一个class目录,就是Person对象。完成之后如下图:

<图片无法上传>

点击确定完成;

接下去是指定2个打包用的EJB的配置文件,在PersonManager.jar选项上点击右键,在出现的右键菜单上选择Add File选项,出现以下窗口

File输入框中选择ejb-jar.xml文件的路径,在Perfix框中输入META-INF,表示该配置文件将被打包到META-INF目录中。

用相同的方法将另外一个配置文件jboss.xml也打包进来,如下图

<图片无法上传>

完成之后,就完成了EJB部分的打包设置。

接下来是Web Service的打包设置,Web Service很简单,只要将web-service.xml配置文件打包成wsr文件就可以了,点击add按钮,输入打包名称,选择输出目录,点击确定,如下图

<图片无法上传>

PersonManagerService.wsr选项上点击右键,在出现的右键菜单上选择Add File选项出现如下窗口

<图片无法上传>

File输入框中选择web-service.xml配置文件的路径,在Prefix输入框中输入META-INF,表示配置文件将被打包到META-INF目录中。点击确定完成。

到此所有的打包配置工作全部完成。完成之后会在项目的根目录下产生一个packaging-build.xml文件,其实它是一个antbuild文件,有兴趣的可以打开看看。可以学到不少东西。

接下去是运行ant,进行打包,在项目名称上点击右键,在出现的右键菜单上点击Run Packing选项,如下图

<图片无法上传>

如果运行成功,则会去build目录下产生2个文件,PersonManager.jarPersonManagerService.wsr文件,前一个是EJB打包文件,第2个是Web Service打包文件。如下图所示

<图片无法上传>

到此打包工作全部完成。

3. EJBWeb Service的部署与发布

PersonManager.jar文件上点击右键,在出现的右键菜单上选择Deployment->Deploy to选项,将EJB发布到jboss服务器中,如下如所示

<图片无法上传>

用同样的方法部署发布PersonManagerService.wsr文件,完成EJBWeb Service的发布部署。需要注意的是,通过上面的方法发布应用程序,需要在Eclipse中设置Jboss服务器的安装路径,相关设置请查阅Jboss-IDE的使用说明。另外的一个发布方法,是利用Jboss的热部署特性,直接将PersonManager.jarPersonManagerService.wsr2个文件直接复制到${JBOSS_HOME}/ server/all/deploy目录下即可。由于Jboss3.2只有在all模式下才包含Web Service的支持,所以一定要复制到all目录中的deploy目录下。至此所有的开发部署已经完成!

六.测试Jboss的服务是否已经成功发布

要测试服务已经成功启动,请使用以下方法

1. 启动jboss服务器,注意启动服务器需要带all参数,如下如所示

启动成功之后的画面如下

<图片无法上传>

在红色线框中我们已经可以看到EJBPersonManager.jar)已经部署成功了。

2. 检查Web Service是否已经启动。打开浏览器,输入http://localhost:8080/jboss-net/servlet/AxisServlet,出现如下的页面:

从中我们发现PersonManagerService这个服务已经启动了。包含getPersonByName,getPersonList,storePersondeletePerson方法,注:其中getPersonList方法应该是没有的,因为在该篇文章中我们并没有在会话bean的实现类中实现这个方法,也没有在远程接口中定义这个方法。

到此我们已经测试完成了,并证明EJBWeb Service都已经成功的发布或启动了。

七.编写客户端进行测试

我们使用application的方式编写一个客户端程序对刚才发布的EJBWeb Service进行测试。代码如下:

package com.webservice.client;

import java.net.*;

import javax.xml.namespace.*;

import javax.xml.rpc.ParameterMode;

import org.apache.axis.client.*;

import org.apache.axis.encoding.*;

import org.apache.axis.encoding.ser.BeanSerializerFactory;

import org.apache.axis.encoding.ser.BeanDeserializerFactory;

import com.pojo.*;

public class PersonManagerClinet

{

public static void main( String args[] ) throws Exception

{

String endpoint = "http://localhost:8080/jboss-net/services/PersonManagerService";

Service service = new Service();

Call call = (Call) service.createCall();

call.setTargetEndpointAddress(new URL(endpoint));

QName qn = new QName("http://localhost:8080/pojo/person", "Person");

call.registerTypeMapping(Person.class, qn, new BeanSerializerFactory(

Person.class, qn),

new BeanDeserializerFactory(Person.class, qn));

Person person = null;

call.setOperationName("storePerson");

call.addParameter("person", XMLType.XSD_ENTITY, ParameterMode.IN);

person = new Person("java");

call.invoke(new Object[] {person});

System.out.println("OK!");

call.setOperationName("getPersonByName");

call.addParameter("name", XMLType.XSD_STRING, ParameterMode.IN);

call.setReturnType(qn);

person = (Person) call.invoke(new Object[] {"java"});

System.out.println(person);

}

}

运行结果如下:

可以看到服务已经运行了,并返回了正确的结果。到此我们已经完成了在Jboss环境下Web Service调用EJB的开发,另外jboss自从4.0开始升级了其Web Service模块,由原来的jboss-net升级到了ws4ee,而且部署和发布也发生很大的变化,可以说,在3.2下的调试成功的Web Service4.0上是无法运行的,目前在jboss的官方网站上有一篇关于在jboss4.0上配置web service的文章。有兴趣的人可以去查阅一下。

如有兴趣的朋友可以和我联系,一起来讨论web service的开发,我的qq:93134062MSN:jacktanlikejava@hotmail.com

分享到:
评论

相关推荐

    Jboss EJB3.0 实例教程.pdf

    - **跨环境调用EJB**:包括如何在独立的Tomcat或Java SE环境中调用EJB,以及如何从Web应用中调用EJB。 - **获取最新版本**:定期检查并获取最新版本的JBoss,以利用最新的特性和修复。 #### 三、基础知识学习 - **...

    jboss EJB3.0实例教程

    通过"jboss EJB3.0实例教程",你可以学习到如何在实际环境中运用这些概念和步骤,逐步掌握EJB3.0的开发技巧。教程中的`EJB3.pdf`很可能包含了详细的实例讲解,从基础概念到实战演练,帮助你深入理解并掌握EJB3.0的...

    EJB3.0.pdf

    2.6 **发布在 JBOSS 中的 WEB 应用调用 EJB** 讨论了如何从一个 Web 应用程序(例如基于 Servlets 或 JSP 的应用)中调用 EJB 服务,这在实际的企业架构中非常常见。 EJB 3.0 的主要特性包括: - **注解驱动**:...

    EJB3.0实例教程(pdf)

    4. **调用EJB3.0 Bean**:介绍如何从客户端(如Web应用或其他EJB)调用EJB3.0 Bean的方法。 5. **实战案例**:提供实际的业务场景,演示如何使用EJB3.0解决实际问题。 6. **错误排查与性能优化**:分享在开发和...

    JBoss实战:服务器配置指南

    ### JBoss实战:服务器配置指南 #### JBoss服务器概述 JBoss AS(Application Server)是一款开源的Java EE应用服务器,提供了全面的企业级服务,包括EJB容器、Web容器、JMS服务、集群与负载均衡等功能。它支持...

    EJB系统开发实战录

    1. **Servlet**:作为HTTP请求的处理器,Servlet可以调用EJB执行业务逻辑,然后将结果返回给客户端,通常是JSP页面。 2. **JSP**:用于创建动态HTML页面,结合Servlet和EJB,可以构建用户友好的界面,展示EJB处理后...

    Jboss

    1. **Java EE兼容性**:JBoss完全遵循Java EE规范,提供对各种Java EE组件的支持,如EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JPA(Java Persistence API)和JSF(JavaServer Faces)等。...

    Ejb3.0帮助文档包(开发手册&实例教程)

    会话Bean在EJB 3.0中也得到了简化,现在可以作为无状态或有状态的会话组件,通过注解如@Service和@Stateful轻松创建。无状态会话Bean适用于方法调用,而有状态会话Bean则能保持客户端的会话状态。 4. **持久化...

    电子教程:EJB开发

    - **客户端(Client)**:调用EJB服务的应用程序部分,可以是其他Java应用程序、Web应用或远程客户端。 - **容器(Container)**:提供运行环境,管理Bean的生命周期,处理安全、事务、资源管理等企业级服务。 - **...

    JBPM教程第三部分、(使用JBOSS7.1及对JBPM5.4事件学习01)

    【JBPM教程第三部分:使用JBOSS7.1...通过这个教程,你将对JBPM的事件处理有深入理解,并能实际操作在JBOSS 7.1环境中进行流程事件的管理和响应。这将帮助你在开发企业级流程应用时更好地应对业务需求的变化和复杂性。

    J2EE快速进阶培训-bmp.ppt

    - J2EE应用运行在容器(如Tomcat、JBoss、WebLogic等)中,容器负责部署、管理和调用应用组件,提供服务如安全性、事务管理、生命周期管理等。 **学习路径** J2EE快速进阶培训通常包括以下阶段: 1. 基础知识:...

    j2ee开发技术手册

    这些服务包括了事务管理、安全、资源连接池等,APIs则包括了Servlet、JSP、EJB(Enterprise JavaBeans)、JMS(Java Message Service)等,容器则负责管理和运行这些组件。手册将详细介绍这些组件的用途、工作原理...

    深入掌握J2EE编程技术

    11. **应用服务器**:如Tomcat、Glassfish、JBoss等,它们提供了运行J2EE应用程序的环境。理解应用服务器的工作原理和配置方法对实际开发至关重要。 12. **开发工具**:如Eclipse、IntelliJ IDEA等IDE的J2EE插件,...

    自学java学习的路线

    3. **SOA、Web Service**: 理解面向服务架构和 Web 服务标准,如 SOAP 和 RESTful。 4. **工作流和 JBPM**: 学习工作流程引擎,如 JBPM 的使用。 5. **搜索引擎与 Lucene**: 探索全文搜索引擎的基本原理和 Lucene 库...

    Java高手的25个学习要点.txt

    而CORBA(Common Object Request Broker Architecture)则是一种面向对象的服务体系结构,支持异构环境下的对象通信。 #### 12. 学习XML相关的API如JAXP、JDOM等。 随着XML成为数据交换的标准格式,掌握如何解析和...

Global site tag (gtag.js) - Google Analytics