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();新建Order javaBean(com.jboss.bean包),实现序列化接口
privateStringorderid;
private String name;编写接口实现类OrderServiceBean (com.jboss.service.impl包)
指定无状态bean和远程接口
编写方法业务代码通常Order是实体bean,从查询数据库获取信息,此处只是模拟
把这里的所有方法暴露为WebService方法:在类前添加@WebService注解
如果指向暴露其中某个方法,而不是全暴露
则在该方法前,加上@WebMethod注解标注要暴露的方法如果这里标志了一个@WebMethod,下面两个方法将不暴露下面不标注@WebMethod是不会暴露的
从HelloWorld项目中拷贝ANT,修改项目名后,发布到jboss中
观察控制台输出,看到WebService已成功发布
进入jboss管理后台查看:http://localhost:8080/jbossws
点击Viewalistofdeployedservices查看发布服务的列表
就会看到刚才所发布的服务,可以通过点击这个服务,查看该描述语言
<definitionstargetNamespace>进入后会看到默认的命名空间为:包名
<portType>端点接口名称采用了接口名+Bean
<service name>服务名称采用实现类简单类名+Service可以通过@WebService注解的属性进行修改
targetNamespace命名空间
name属性设置端点接口名称
serviceName服务名
将命名空间改为http://ws.jboss.com
端点接口名称改为接口名称
服务名称改为实现类名称
修改后,重新发布,再观察是否修改掉当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更改为系统安装的jdk2.利用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生成客户端调用辅助代码
之后刷新WSClient项目(客户端),在src下看到生成的java文件
新建单元测试,调用这些web服务如何调用web服务?
http://localhost:8080/jbossws/
首先找到服务名称<servicename="...">找到与其对应的javaBean(生成的)
1.生成对象
2.获取端点名称
3.通过端点名称,调用webservice方法在进行WebService开发时,如果是返回List的对象,尽量用泛型,EJB容器会解析对象并把它翻译成
对应的XML类型