当前位置: 代码迷 >> Web前端 >> 开发EJB器皿模型的WEB服务
  详细解决方案

开发EJB器皿模型的WEB服务

热度:318   发布时间:2012-07-04 19:33:54.0
开发EJB容器模型的WEB服务

?

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:public Order getOrder(String orderid);
Order是一个javaBean(实体bean)
第三个方法获取全部Order:public List<Order> getOrders();

开发EJB容器模型的WEB服务

?

新建Order javaBean(com.jboss.bean包),实现序列化接口
private String orderid;
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
点击View a list of deployed services?查看发布服务的列表
就会看到刚才所发布的服务,可以通过点击这个服务,查看该描述语言
<definitions targetNamespace>进入后会看到默认的命名空间为:包名
<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 -->
<project name="WSClient" default="wsclientgen" basedir=".">
???<property name="src.dir" value="${basedir}/src" />
???<path id="build.classpath" description="设置类路径">
????<!-- 把项目下lib中的jar都设置到类路径下-->
????????<fileset dir="${basedir}/lib">
????????????<include name="*.jar"/>
????????</fileset>
????</path>
????<target name="wsclientgen" description="生成webservice客户端辅助代码,执行后请刷新项目">
?????<!-- 为com.sun.tools.ws.ant.WsImport类,定义使用标签 -->
?????<taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport" classpathref="build.classpath"/>
?????
?????<!--wsdl指向web服务描述语言所在的位置-->
?????<!--sourcedestdir生成的源文件所存放在的目录-->
?????<!--package生成的java源文件所用到的java包-->
?????<!--keep是否替换旧文件-->
?????<!--verbose是否显示执行细节-->
?????<!--destdir源文件编译后存放在的目录-->
?????<wsimport wsdl="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/
首先找到服务名称<service name="..."> 找到与其对应的javaBean(生成的)
1.生成对象
2.获取端点名称
3.通过端点名称,调用webservice方法

开发EJB容器模型的WEB服务

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

对应的XML类型?

  相关解决方案