开发EJB容器模型的WEB服务

Assdqd 2012-05-25

Web服务也是一种分布式技术,它与EJB最大的不同是,Web服务属于行业规范,可以跨平台及语言。

而EJB属于java平台规范,尽管理论上可以跨平台,但实现起来比较复杂,所以其应用范围局限在了

java平台。

看上去两者好像是互相竞争的关系,其实不是。他们两者的偏重点不一样,Web服务偏重

的是这个系统对外提供什么功能,而EJB偏重的是如何使用一个个组件组装这些功能。就好比一个硬盘,他对外提供的是存储服务,这时Web服务的关注点,对于怎样组装这个硬盘,怎样

构造这些小零件,web服务并不关心,但这些却是EJB所关心的。

JavaEE为web service提供了两种不同的编程模型:EJB容器模型及Web容器模型下面以JAX-WS2.x规范(Java API for XML-based Web Service)介绍 webservice开发

新建一个java Project项目,取名为WebService 将jboss\client下所有jar包引入

这里使用EJB容器模型,所以建立一个无状态会话bean,将这个无状态会话bean发布为webservice

首先定义接口OrderService (com.jboss.service包)

接口中:第一个方法,获得用户名称 public String getUserName(String name);

第二个方法取得Order:publicOrdergetOrder(Stringorderid);

Order是一个javaBean(实体bean)

第三个方法获取全部Order:public List<Order> getOrders();

开发EJB容器模型的WEB服务

新建Order javaBean(com.jboss.bean包),实现序列化接口

privateStringorderid;

private String name;

开发EJB容器模型的WEB服务

编写接口实现类OrderServiceBean (com.jboss.service.impl包)

指定无状态bean和远程接口

编写方法业务代码

通常Order是实体bean,从查询数据库获取信息,此处只是模拟

开发EJB容器模型的WEB服务

把这里的所有方法暴露为WebService方法:在类前添加@WebService注解

如果指向暴露其中某个方法,而不是全暴露

则在该方法前,加上@WebMethod注解标注要暴露的方法

如果这里标志了一个@WebMethod,下面两个方法将不暴露下面不标注@WebMethod是不会暴露的

开发EJB容器模型的WEB服务

从HelloWorld项目中拷贝ANT,修改项目名后,发布到jboss中

观察控制台输出,看到WebService已成功发布

进入jboss管理后台查看:http://localhost:8080/jbossws

点击Viewalistofdeployedservices查看发布服务的列表

就会看到刚才所发布的服务,可以通过点击这个服务,查看该描述语言

<definitionstargetNamespace>进入后会看到默认的命名空间为:包名

<portType>端点接口名称采用了接口名+Bean

<service name>服务名称采用实现类简单类名+Service

可以通过@WebService注解的属性进行修改

targetNamespace命名空间

name属性设置端点接口名称

serviceName服务名

将命名空间改为http://ws.jboss.com

端点接口名称改为接口名称

服务名称改为实现类名称

修改后,重新发布,再观察是否修改掉

 开发EJB容器模型的WEB服务

当Web服务开发完,开发Web服务的客户端

开发步骤如下:

1.在应用的类路径下放入JAX-WS的jar文件(下载路径:https://jax-ws.dev.java.net)。

如果用的是JDK6,这一步可以省略,因为JDK6已经绑定了JAX-WS。目前JDK6绑定的JAX-WS版本是2.0

当某些应用使用的JAX-WS版本高于2.0时,就有可能发生版本问题,此时需要升级JDK6中的JAX-WS版本

下载最高版本的JAX-WS,在产品额度lib目录中找到jaxws-api.jar和jaxb-api.jar,把这两个文件

copy到JDK6_HOME/jre/lib/endorsed目录下

通常endorsed目录是不存在的,需要手动创建

如果用的开发工具是MyEclipse,这时应该把MyEclipse所使用的jdk更改为系统安装的jdk

2.利用WebService客户端生成工具来生成辅助类3.借助辅助类使用webService

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

这里使用wsimport工具的Ant任务类生成辅助类

新建build.xml,把下面代码粘贴进

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

<?xml version="1.0" encoding="UTF-8"?>

<!--缺省任务,执行wsclientgen-->

<projectname="WSClient"default="wsclientgen"basedir=".">

<propertyname="src.dir"value="${basedir}/src"/>

<pathid="build.classpath"description="设置类路径">

<!--把项目下lib中的jar都设置到类路径下-->

<filesetdir="${basedir}/lib">

<includename="*.jar"/>

</fileset>

</path>

<targetname="wsclientgen"description="生成webservice客户端辅助代码,执行后请刷新项目">

<!--为com.sun.tools.ws.ant.WsImport类,定义使用标签-->

<taskdefname="wsimport"classname="com.sun.tools.ws.ant.WsImport"classpathref="build.classpath"/>

<!--wsdl指向web服务描述语言所在的位置-->

<!--sourcedestdir生成的源文件所存放在的目录-->

<!--package生成的java源文件所用到的java包-->

<!--keep是否替换旧文件-->

<!--verbose是否显示执行细节-->

<!--destdir源文件编译后存放在的目录-->

<wsimportwsdl="http://127.0.0.1:8080/WebService/OrderServiceBean?wsdl"

sourcedestdir="${src.dir}"package="com.jboss.ws.client"keep="true"

verbose="true"destdir="${basedir}/bin"/>

</target>

</project>

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

运行ANT生成客户端调用辅助代码

开发EJB容器模型的WEB服务

之后刷新WSClient项目(客户端),在src下看到生成的java文件

新建单元测试,调用这些web服务

如何调用web服务?

http://localhost:8080/jbossws/

首先找到服务名称<servicename="...">找到与其对应的javaBean(生成的)

1.生成对象

2.获取端点名称

3.通过端点名称,调用webservice方法

开发EJB容器模型的WEB服务

在进行WebService开发时,如果是返回List的对象,尽量用泛型,EJB容器会解析对象并把它翻译成

对应的XML类型 

相关推荐