Eclipse下使用Xfire创建WebService入门示例
- 格式:docx
- 大小:296.44 KB
- 文档页数:10
wsdlDocumentURL 代表wsdl所对应的URL1、通过URLConnection创建连接,然后invoke相应接口优点:调用简单缺点:传递封装对象比较麻烦[java]view plaincopyprint?1.// wsdlDocumentURL必须是全地址(包含?wsdl)2.URL url = new URL(wsdlDocumentURL);3.URLConnection connection = url.openConnection();4.Client client = new Client(connection.getInputStream(), null);5.// invoke接口方法6.// 接口返回Object数组7.Object[] result = client.invoke("methodName", new Object[]{});[java]view plaincopyprint?.codehaus.xfire.service.Service serviceModel = new ObjectServiceFactory().create(接口.class);2.XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());3.IEmailBindHandlerService handler = (IEmailBindHandlerService) factory.create(serviceModel, wsdlURL);2、XFireProxyFactory创建客户端实例客户端需要明确知道接口详细信息[java]view plaincopyprint?.codehaus.xfire.service.Service serviceModel = new ObjectServiceFactory().create(IEmailBindHandlerService.class);2.XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());3.接口 handler = (IEmailBindHandlerService) factory.create(serviceModel, wsdl地址);3、通过eclipse自动生成webservice client4、通过org.codehaus.xfire.spring.remoting.XFireClientFactoryBean构建客户端实例[java]view plaincopyprint?1.<bean id="baseService" class="org.codehaus.xfire.spring.remoting.XFireClientFactoryBean" abstract="true">2. <property name="serviceFactory" ref="xfire.serviceFactory" />3. <!-- <property name="lookupServiceOnStartup" value="false" /> -->4. <property name="properties">5. <props>6. <!-- 等待HttpConnectionManager从连接池中返回空闲连接的超时时间 -->7. <prop key="http.connection.manager.timeout">1000</prop>8. <!-- 等待建立连接的超时时间 -->9. <prop key="http.connection.timeout">3000</prop>10. <!-- 等待服务器返回数据超时时间 -->11. <prop key="http.timeout">10000</prop>12. <!-- 连接到单个服务器的连接数上限 -->13. <prop key="max.connections.per.host">10</prop>14. <!-- 连接到所有服务器的连接个数上限 -->15. <prop key="max.total.connections">80</prop>16. </props>17. </property>18. </bean>19.20. <bean id="接口实例" parent="baseService">21. <property name="serviceClass" value="接口地址" />22. <property name="wsdlDocumentUrl" value="${xfireServerURL}/webservice名称?wsdl" />23. </bean>使用该配置方法的话,可以通过注入实现调用,同时可以减少手动创建URLConnection之后忘记关闭连接的尴尬只是如果使用该方法的时候,需要在web.xml中添加如下配置[java]view plaincopyprint?1.<context-param>2. <param-name>contextConfigLocation</param-name>3. <param-value>classpath:org/codehaus/xfire/spring/xfire.xml</param-value>4.</context-param>。
使用XFire开发webservice服务和客户端全攻略收藏XFire 是与Axis 2并列的新一代Web Service框架,通过提供简单的API支持Web Service 各项标准协议,帮助你方便快速地开发Web Service应用。
相对于Axis来说,目前XFire相对受欢迎,加上其提供了和Spring集成的支持,在目前的Web Service开源社区拥有众多的追随者。
并且因为XFire为Spring提供的支持,使得我们可以很容易在Spring中使用XFire构建Web Service应用。
XFire 与Axis2相比具有如下特征:l 支持一系列Web Service的新标准--JSR181、WSDL2.0 、JAXB2、WS-Security 等;l 使用Stax解释XML,性能有了质的提高。
XFire采用Woodstox 作Stax实现;l 容易上手,可以方便快速地从pojo发布服务;l 支持Spring、Pico、Plexus、Loom等容器;l 灵活的Binding机制,包括默认的Aegis,xmlbeans,jaxb2,castor;l 高性能的SOAP 栈设计;l 支持Spring、Pico、Plexus、Loom等容器。
XFire 与Axis1性能的比较如下:l XFire 比Axis1.3快2-6倍;l XFire 的响应时间是Axis1.3的1/2到1/5。
XFire 在WebService框架中开始较晚,它从现有的框架中借鉴了许多优秀的理念,力争将Web Service的应用开发难度降到最低。
此外,还提供了各种绑定技术、支持多种传输协议,对WebService体系中许多新的规范提供了支持。
下面让我们来看一个XFire于Spring集成的helloWorld的简单例子。
一.实现的功能和特点本例具有如下功能和特点:1)基于J2EE平台的Web Service服务;2)开发方便,配置简单;3)与spring无缝集成。
目录一使用Axis和XFire发布Web Service (2)1.1 准备工作 (2)1.1.1 新建工程 (2)1.1.2 axis依赖文件 (3)1.1.3 XFire依赖文件 (3)1.2 Axis发布Web Service (4)1.2.1 传递简单数据类型的Web Service (4)1.2.2 带自定义对象传递的Web Service (8)1.3 XFire发布Web Services (10)1.3.1 传递简单数据类型的Web Service (10)1.3.2传递复杂数据类型的Web Service (12)附录: 1Server的结构 (16)二调用Web Services (17)2.1 准备工作 (17)2.1.1 新建工程 (17)2.1.2 启动Tomcat上发布的1Server服务 (17)2.2 Axis发布的Web Service调用方式 (18)2.2.1 Dynamic Invocation Interface (DII)方式 (18)2.2.2 Dynamic Proxy方式 (19)2.2.3 Stubs方式 (20)2.3调用XFire发布的Web Service (22)2.3.1服务以jar包形式发布的时候直接调用 (23)2.3.2 使用Axis的Client包 (23)2.3.3 使用Xfire的Client包 (24)附录2:2Client目录结构 (31)一使用Axis和XFire发布Web Service 1.1 准备工作Axis主页:/Axis下载:/dist/ws/XFire主页:/XFire下载:/Download去以上站点下载axis最新包和XFire最新包,包内有axis和XFire依赖的其他jar包。
1.1.1 新建工程1.1.2 axis依赖文件1.1.3 XFire依赖文件1.2 Axis发布Web Service1.2.1 传递简单数据类型的Web Service1.把Axis依赖的jar包放入lib文件夹下.2.在web.xml中加入如下:<!-- ****************** axis ws start ****************** --> <listener><listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener </listener-class></listener><servlet><servlet-name>AxisServlet</servlet-name><servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class></servlet><servlet><servlet-name>AdminServlet</servlet-name><servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class><load-on-startup>100</load-on-startup></servlet><servlet><servlet-name>SOAPMonitorService</servlet-name><servlet-class>org.apache.axis.monitor.SOAPMonitorService</servlet-class><init-param><param-name>SOAPMonitorPort</param-name><param-value>5001</param-value></init-param><load-on-startup>100</load-on-startup></servlet><servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>/servlet/AxisServlet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>*.jws</url-pattern></servlet-mapping><servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>/services/*</url-pattern></servlet-mapping><servlet-mapping><servlet-name>SOAPMonitorService</servlet-name><url-pattern>/SOAPMonitor</url-pattern></servlet-mapping><!-- uncomment this if you want the admin servlet --><!--<servlet-mapping><servlet-name>AdminServlet</servlet-name><url-pattern>/servlet/AdminServlet</url-pattern></servlet-mapping>--><session-config><!-- Default to 5 minute session timeouts --><session-timeout>5</session-timeout></session-config><!-- currently the W3C havent settled on a media type for WSDL;/TR/2003/WD-wsdl12-20030303/#ietf-draftfor now we go with the basic 'it's XML' response -->3.发布到Tomcat5.0+ 启动Tomcat服务启动的时候若出现下面错误。
如何在MyEclipse和Eclipse下安装XFire插件CXF插件 WebService首先,现在都用CFX了(CFX部分源于XFire)吧,所以建议大家使用CXF,本文后面讲XFire安装……CXF的安装参见:Apache CXF: An Open-Source Services Framework /源文件的下载在/download.html博客更新时最新为2.42 一共两个文件,要下载的是其中的二进制下载包,也就是Binary distribution,下载File下的zip(for win)或者tar.gz(for linux)我用的是winXP下载完成后按照如下配置:将你的Binary distribution加压至任意文件夹(将被设为%CXF_HOME%)我的电脑->属性->高级->环境变量创建一个CXF_HOME变量,值为CXF框架所在根目录,修改一下CLASSPATH=%CXF_HOME%/lib;PATH=%CXF_HOME%/bin; 以方便在DOS窗口下直接运行java2ws,wsdl2java等可执行文件。
在%JAVA_HOME%/jre/lib目录下创建一下endorsed文件夹,将jaxb-api.jar,jaxws.jar拷贝进去。
(建议在%CXF_HOME%的文件夹中搜索endorsed,就包括这两个文件,当然,你也可以直接将这个路径包含在%CXF_HOME%\lib\endorsed包含在CLASSPATH中尝试一下,我没有试过)配置好了后,你在DOS窗口下输入java2ws,看看配置是否有效,有效会提示Missing argument: classname。
这样就OK了。
MyEclipse安装XFire要进行基于XFire的开发,需要在MyEclipse或者Eclipse里安装XFire,但是网上基本没有安装插件的说明,在这里做一个介绍:在Eclipse里添加XFire,请遵照XFire官网说明/Eclipse+Plugin进行安装在MyEclipse (9.0)骤如下:进入help->MyEclipse Configer Center ,点选Software选项卡,左侧有个Browse Software,点击导航右侧的 Add Site,弹出对话框,填入名称“XFire”(任填)和站点"/xfire/update/",点击确定,稍等片刻,你会发现在Browse Software下多了XFire的两个选项(只是找到,还没安装),OK,分别双击这两个选项,这连个添加会排程到等待更新的列表中,也就是页面右下角的Software Updates Aviables里面(其实有一个确实已经在MyEclipse里面安装了,所以应该只有一个更新),在单选框中打对勾,然后更新,会弹出更新向导,然后默认的Next Next就可以了……新建一个工程,在工程添加向导里你可能看不到XFire的选项,不急,在工程添加完成后,在工程上右键,在菜单上会出现“为该工程配置XFire”特性,在这里设置就好了……针对之前没说清楚,在这里补充这一点……完……安装完毕,新建工程,右键->添加XFire支持虽然不能从新建工程向导中配置,也没问题,恩恩完……。
最近开发开始学习Web Service,如果你是大神,请路过!谢谢!遵循前辈大神们的教导~~~,内事不决问度娘,外事不决问谷歌(现在谷歌已经不能用了),只能问度娘了!上网一百度,套用周董的一句歌词,霍,霍,霍,霍,这么多的套路(axis,axis2,XFire,CXF等),我到底选择哪一个?因为要和Spring进行对接,看了一下,CXF与Spring的耦合度最好,于是就选择了CXF。
上官网下jar包,下了最新的apache-cxf-3.1.4.zip包。
解压出来,看看里面的最简单的实例,apache-cxf-3.1.4\samples\java_first_jaxws,本着你快乐所以我快乐加上不要脸的原则,我抄抄抄,改了一下名字,开发环境jdk1.6, jdk1.5没试过,上眼呐!新建工程mywbs,导入jar包cxf-core-3.1.4.jarjetty-continuation-9.2.11.v20150529.jarjetty-http-9.2.11.v20150529.jarjetty-io-9.2.11.v20150529.jarjetty-server-9.2.11.v20150529.jarjetty-util-9.2.11.v20150529.jarwsdl4j-1.6.3.jarxmlschema-core-2.2.1.jar一、接口类IHelloWorld.javapackage com.ws.hello;import java.util.List;import javax.jws.WebService;import ers;@WebServicepublic interface IHelloWorld {public String sayHello(String name);public String getUserName(Users user);public List<Users> getListUser();}二、实现类(说明endpointInterface = "com.ws.hello.IHelloWorld",IHelloWorld 类加上路径,此处注意)HelloWorldImpl.javapackage com.ws.hello;import java.util.ArrayList;import java.util.List;import javax.jws.WebService;import ers;@WebService(endpointInterface = "com.ws.hello.IHelloWorld",serviceName = "IHelloWorld", portName="IHelloWorldPort")public class HelloWorldImpl implements IHelloWorld {@Overridepublic String sayHello(String name) {return name + ": 您好啊!";}@Overridepublic String getUserName(Users user) {return user.getName();}@Overridepublic List<Users> getListUser() {System.out.println("getListUser called~~~");List<Users> list = new ArrayList<Users>();list.add(new Users(2,"张三"));list.add(new Users(3, "十八罗汉"));list.add(new Users(4,"五王"));return list;}}三、实体类Userspackage com.ws.entity;import java.io.Serializable;public class Users implements Serializable{private static final long serialVersionUID= -5031894017095689998L;private Integer id;private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public Users(Integer id, String name) {super();this.id = id; = name;}public Users() {super();}}Users类如果不写默认构造方法,将报如下异常:Exception in thread "main" javax.xml.ws.WebServiceException: Unable to create JAXBContextatcom.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext( Unknown Source)atcom.sun.xml.internal.ws.model.AbstractSEIModelImpl.postProcess(Unknow n Source)atcom.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(Unknow n Source)atcom.sun.xml.internal.ws.server.EndpointFactory.createSEIModel(Unknown Source)atcom.sun.xml.internal.ws.server.EndpointFactory.createEndpoint(Unknown Source)at com.sun.xml.internal.ws.api.server.WSEndpoint.create(Unknown Source)at com.sun.xml.internal.ws.api.server.WSEndpoint.create(Unknown Source)atcom.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndp oint(Unknown Source)atcom.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(Un known Source)atcom.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(Unk nown Source)at javax.xml.ws.Endpoint.publish(Endpoint.java:220)atcom.ws.deploy.DeployHelloWorldService.<init>(DeployHelloWorldService. java:14)atcom.ws.deploy.DeployHelloWorldService.main(DeployHelloWorldService.ja va:23)Caused by: java.security.PrivilegedActionException:com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptionsers does not have a no-arg default constructor.this problem is related to the following location:at ersat public java.util.Listcom.ws.hello.jaxws.GetListUserResponse._returnat com.ws.hello.jaxws.GetListUserResponseat java.security.AccessController.doPrivileged(Native Method)... 13 moreCaused by:com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptionsers does not have a no-arg default constructor.this problem is related to the following location:at ersat public java.util.Listcom.ws.hello.jaxws.GetListUserResponse._returnat com.ws.hello.jaxws.GetListUserResponseatcom.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Buil der.check(Unknown Source)atcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(U nknown Source)atcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source)atcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuild er.build(Unknown Source)atcom.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source)at com.sun.xml.internal.bind.api.JAXBRIContext.newInstance(Unknown Source)atcom.sun.xml.internal.ws.developer.JAXBContextFactory$1.createJAXBCont ext(Unknown Source)atcom.sun.xml.internal.ws.model.AbstractSEIModelImpl$1.run(UnknownSource)atcom.sun.xml.internal.ws.model.AbstractSEIModelImpl$1.run(Unknown Source)... 14 more晕了,真是崩溃了,就写了这么几句话!错误代码比正常代码还要多!真是婶婶能忍叔叔不能忍,虽然英语很烂,连猜带蒙吧,看黑色的一句话,大概似乎是告诉我们Users类中没有默认的构造方法,果断加上,错误消失!此处应有掌声!鼓掌!!!四、DeployHelloWorldService.javapackage com.ws.deploy;import javax.xml.ws.Endpoint;import com.ws.hello.HelloWorldImpl;public class DeployHelloWorldService {protected DeployHelloWorldService() throws Exception {System.out.println("Starting Server");HelloWorldImpl implementor = new HelloWorldImpl();//工程名String address = "http://localhost:8080/mywbs";Endpoint.publish(address, implementor);}/*** @param args* @throws Exception*/public static void main(String[] args) throws Exception { new DeployHelloWorldService();System.out.println("Server ready...");Thread.sleep(5 * 60 * 1000);System.out.println("Server exiting");System.exit(0);}}点击运行,正常的话会有Starting ServerServer ready...在IE地址栏中输入:http://localhost:8080/mywbs?wsdl什么你不知道IE地址栏在哪里,对不起,大哥,地球是危险的,你回火星去吧!如果正常的话呢,大约在网页上会出现下面的信息,只截取一部分,注意画粗红线的地方,下面我们用的到。
WebService接口说明文档文档说明本文档主要讲述如何用C Sharp创建一个简单的Web Service接口,并使用Java调用这个Web Service接口。
准备工作系统环境:安装JDK1.6或更新版本开发工具:Microsoft Visual Studio 2012、MyEclipse 10.5、axis2-1.6.2C Sharp服务端1.首先,创建一个Web Service项目。
依次点击:文件—新建—项目,在弹出的新建项目窗口中选择Web下的 空 Web 应用程序。
如下图:2.接下来我们需要创建我们的Web Service接口实现文件。
鼠标右击我们的项目,依次点击:添加—新建项,在弹出窗口中选择Web 服务。
可修改新建项的文件名,注意文件名后缀后.asmx。
如下图:新建完成后我们的项目结构如下:3.打开我们新建的MyService.asmx下的MyService.asmx.cs文件,可以看到其中已经有默认的HelloWorld方法。
我们可以直接运行查看下运行的效果,效果如下图:点击HelloWorld,再点击调用可以看到页面返回:4.接下来我们完善我们的Web Service接口功能。
主要对Web Service接口进行参数类型的测试,文本型、布尔型、数值型、类(Class)等。
新增Add()等运算方法:新增strcat()连接字符串方法:新增GetBool()返回布尔值方法:新增GetTest()返回测试类,并新增Test类运行我们的项目,可以看到我们的结果如下图:点击add方法测试:输入add的参数i和j点击调用按钮,可以看到返回计算结果:5.到此为止我们C Sharp创建的Web Service程序完成。
接下来看Java如何调用我们的Web Service接口。
Java调用Web Service准备对于一个Web Service接口我们当前只知道访问的地址,我们如何用Java去访问接口呢?已知Web Service接口地址:http://localhost:11766/MyService.asmx?WSDLJava调用Web Service的方式有以下1.使用HttpClient2.使用Xfire3.使用axis2本文档示例选择的是axis2,首先到axis2网站下载axis2,网址:/axis2/java/core/download.cgi当前最新版本1.6.2。
WebService1 解决几个问题?2 什么是WebService?3 它能做什么?为什么要学习WebService?学习WebService要达到什么目的?简单的网络应用:先理解什么是服务:现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作。
更别说只使用一种语言了。
大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用程序,甚至认为,这就是数据库应该做的,其实不然,这是数据库通过TCP/IP协议与另一个应用程序进行交流的结果,而上层是什么样的应用程序,是用什么语言,数据库本身并不知道,它只知道接收到了一份协议,这就是SQL92查询标准协议。
目前的云计算、云查杀都是一种服务,现在比较流行的说法是SOA(面向服务的框架)。
既然数据库可以依据某些标准对外部其他应用程序提供服务、而且不关心对方使用什么语言,那我们为什么就不能实现跨平台、跨语言的服务呢?只要我们用Java写的代码,可以被任意的语言所调用,我们就实现了跨平台,跨语言的服务!---WebService复杂的网络应用:对几个问题的回答:1.WebService,顾名思义就是基于Web的服务。
它使用Web(HTTP)方式,接收和响应外部系统的某种请求。
从而实现远程调用.2.我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单调用了一下服务器上的一段代码而已。
3.学习WebService可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样.。
在开始之前必须要让先了解几个名词:名词1:XML. Extensible Markup Language -扩展性标记语言XML,用于传输格式化的数据,是Web服务的基础。
excel中webservice用法在Excel中,可以使用Web服务来获取或更新来自Web服务器的数据。
通过使用Web服务功能,可以通过简单的函数调用来获取数据,而无需编写复杂的代码。
要在Excel中使用Web服务,首先需要确定要访问的Web服务的URL。
然后,可以使用"WEBSERVICE"函数来获取此URL返回的数据。
下面是使用WebService的步骤:1. 打开Excel并在单元格中输入要访问的Web服务的URL。
例如,假设我们想要获取一个返回当天天气预报的Web服务的数据,我们可以将该URL输入到单元格A1中。
2. 在要获取数据的单元格中,使用"WEBSERVICE"函数来调用Web服务。
函数的语法为:`=WEBSERVICE(url)`。
在我们的例子中,我们可以在B1单元格中输入`=WEBSERVICE(A1)`。
3. 按下Enter键后,Excel将通过发送HTTP请求到指定的URL,并将返回的数据显示在B1单元格中。
4. 如果需要将返回的数据解析为特定的格式,可以使用Excel的其他函数来进一步处理。
例如,可以使用"FILTERXML"函数来解析XML数据,或使用"JSON"函数来处理JSON数据。
需要注意的是,如果Web服务返回的数据需要身份验证或其他参数,可以在URL中包含这些参数。
也可以在URL后面添加查询字符串,将参数传递给Web服务。
使用Excel中的Web服务功能,可以轻松地从Web服务器获取所需的数据,并将其与其他Excel函数和功能结合使用。
这使得在Excel中进行数据分析和报告生成变得更加便捷和高效。
希望以上内容对您有所帮助!如果还有任何问题,请随时提问。
java-webService(调⽤wsdl接⼝)使⽤Axis或XFire实现WebService:Axis2是Apache下的⼀个重量级WebService框架,准确说它是⼀个Web Services / SOAP / WSDL 的引擎,是WebService框架的集⼤成者,它能不但能制作和发布WebService,⽽且可以⽣成Java和其他语⾔版WebService客户端和服务端代码。
这是它的优势所在。
但是,这也不可避免的导致了Axis2的复杂性,使⽤过的开发者都知道,它所依赖的包数量和⼤⼩都是很惊⼈的,打包部署发布都⽐较⿇烦,不能很好的与现有应⽤整合为⼀体。
但是如果你要开发Java之外别的语⾔客户端,Axis2提供的丰富⼯具将是你不⼆的选择。
XFire是⼀个⾼性能的WebService框架,在Java6之前,它的知名度甚⾄超过了Apache的Axis2,XFire的优点是开发⽅便,与现有的Web整合很好,可以融为⼀体,并且开发也很⽅便。
但是对Java之外的语⾔,没有提供相关的代码⼯具。
XFire后来被Apache收购了,原因是它太优秀了,收购后,随着Java6 JWS的兴起,开源的WebService引擎已经不再被看好,渐渐的都败落了。
参考路径:axis2:参考路径:private static Object[] requestFunctionWebService(String url,String parameters,String namespance,String methodName) {try {RPCServiceClient rpcServiceClient = new RPCServiceClient();EndpointReference endpointReference = new EndpointReference(url);//url后缀不加"?wsdl"Options options = rpcServiceClient.getOptions();options.setTimeOutInMilliSeconds(30000);options.setProperty(HTTPConstants.SO_TIMEOUT, 30000);options.setTo(endpointReference);rpcServiceClient.setOptions(options);QName qName = new QName(namespance, methodName);Class[] classStr = new Class[] {String.class};Object[] params = new Object[] {parameters};Object[] objects = rpcServiceClient.invokeBlocking(qName,params,classStr);return objects;} catch (Exception e) {logger.error("requestFunctionWebService请求接⼝异常:"+ e.toString());return null;}}CXF:参考路径:添加依赖: <dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>3.1.16</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http-jetty</artifactId><version>3.1.16</version></dependency>public static Object[] getService(String url,String parameters, String namespace,String methodName) {try {String newUrl =url+"?wsdl";JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();Client client = dcf.createClient(newUrl);QName name=new QName(namespace, methodName);Object[] params = new Object[] {parameters};return client.invoke(name,params);} catch (Exception e) {logger.error(e);return null;}}XFire:参考路径:①通过WSDL地址来创建动态客户端②通过服务端提供的接⼝来创建客户端③使⽤Ant通过WSDL⽂件来⽣成客户端第⼀种⽅式:通过WSDL地址来创建动态客户端package com.jadyer.client;import .MalformedURLException;import .URL;import org.codehaus.xfire.client.Client;/*** 通过WSDL来创建动态客户端* @see此时需要在项⽬中引⼊XFire 1.2 Core Libraries和XFire 1.2 HTTP Client Libraries*/public class ClientFromWSDL {public static void main(String[] args) throws MalformedURLException, Exception {Client client = new Client(new URL("http://127.0.0.1:8080/XFire_demo/services/XFireServer?wsdl")); Object[] results11 = client.invoke("sayHello", new Object[]{"Jadyer22"});System.out.println(results11[0]);}}第⼆种⽅式:通过服务端提供的端⼝来创建客户端package com.jadyer.client;import .MalformedURLException;import java.util.List;import org.codehaus.xfire.client.XFireProxyFactory;import org.codehaus.xfire.service.Service;import org.codehaus.xfire.service.binding.ObjectServiceFactory;import com.jadyer.model.Person;import er;import com.jadyer.server.HelloService;/*** 通过Web服务端提供的接⼝来创建客户端* @see客户端必须提供⼀个与服务端完全⼀致的接⼝,包名也要⼀致* @see在本例中,需要在客户端(即该项⽬)中提供HelloService.java接⼝,以及Person和User两个POJO类 * @see并且此时需要在项⽬中引⼊XFire 1.2 Core Libraries和XFire 1.2 HTTP Client Libraries*/public class ClientFromInterface {public static void main(String[] args)throws MalformedURLException{//⾸先使⽤XFire的ObjectServiceFactory从HelloService接⼝创建⼀个服务模型serviceModel//serviceModel包含服务的说明,换句话说,就是服务的元数据//Create a metadata of the serviceService serviceModel = new ObjectServiceFactory().create(HelloService.class);//访问的地址String serviceURL = "http://127.0.0.1:8080/XFire_demo/services/XFireServer";//通过查看org.codehaus.xfire.client.XFireProxyFactory源码发现//下⾯两⾏代码与这⾥直接new XFireProxyFactory()的作⽤是等效的//XFire xfire = XFireFactory.newInstance().getXFire();//XFireProxyFactory factory = new XFireProxyFactory(xfire);//为XFire获得⼀个代理⼯⼚对象//Create a proxy for the deployed serviceXFireProxyFactory factory = new XFireProxyFactory();//通过proxyFactory,使⽤服务模型serviceModel和服务端点URL(⽤来获得WSDL)//得到⼀个服务的本地代理,这个代理就是实际的客户端HelloService client = (HelloService)factory.create(serviceModel, serviceURL);/*** Invoke the service* @see调⽤服务的本地代理(即实际的客户端)中的⽅法,便得到我们需要的WebServcie*//*--处理简单对象--*/String serviceResponse = client.sayHello("Jadyer11");System.out.println(serviceResponse);/*--处理对象--*/User u = new User();u.setName("Jadyer99");Person pp = client.getPerson(u);System.out.println(pp.getName());/*--处理List--*/List<Person> personList = client.getPersonList(24, "Jadyer88");for(Person p : personList){System.out.println(p.getName());}}这是它要⽤到的接⼝和两个POJO类/*** Web服务提供给客户端的接⼝* @see这是第⼆种⽅式创建的客户端,要⽤到的接⼝*/package com.jadyer.server;import java.util.List;import com.jadyer.model.Person;import er;public interface HelloService {public String sayHello(String name);public Person getPerson(User u);public List<Person> getPersonList(Integer age, String name);}/*** 第⼆种⽅式创建的客户端,要⽤到的两个POJO类*/package com.jadyer.model;public class User {private String name;/*--getter和setter略--*/}package com.jadyer.model;public class Person {private Integer age;private String name;/*--getter和setter略--*/}Axis:Java WebService接⼝⽣成和调⽤:参考路径:调⽤:引⽤jar包:axis.jar 、jaxrpc.jar⼀、使⽤eclipse⾃动⽣成的wsdl接⼝1、2、3、调⽤接⼝private static String requestFunctionWebService(String http,String message) { //http="http://203.48.27.97:85/dagl/service/TDHYxService?wsdl"String retMessage = "";try {YxBrowseWSProxy yx = new YxBrowseWSProxy(http);retMessage = yx.yxBrowse(message);//⽅法名yxBrowse} catch (Exception e) {logger.error("requestFunctionWebService请求接⼝异常:"+ e.getMessage());e.printStackTrace();}return retMessage;}⼆、直接AXIS调⽤远程的web serviceimport java.util.Date;import java.text.DateFormat;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import space.QName;import ng.Integer;import javax.xml.rpc.ParameterMode;public class caClient {public static void main(String[] args) {try {String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";//直接引⽤远程的wsdl⽂件//以下都是套路Service service = new Service();Call call = (Call) service.createCall();call.setTargetEndpointAddress(endpoint);call.setOperationName("addUser");//WSDL⾥⾯描述的接⼝名称call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);//接⼝的参数call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型 String temp = "测试⼈员";String result = (String)call.invoke(new Object[]{temp});//给⽅法传递参数,并且调⽤⽅法System.out.println("result is "+result);}catch (Exception e) {System.err.println(e.toString());}}}。
myeclipse中创建webservice客户端1、创建web工程2、为web工程添加webservice能力3、一般不用配置,直接点next4、添加webservice的jar包,除了已经过时的1.1JAXB1外,全选。
5、在提供webservice的wsdl描述文件上面右键,新建webservice客户端。
6、可以指定webservice的客户端所在的包为mzh j.wsclient7、生成的webservice客户端文件如下图,有2个包:com.cintel.ics 中的是wsdl中描述的webservice对象;mzhj.wsclient中的是webservice测试的客户端。
8、ICSServiceClient的main方法可以调用webservice的方法了。
//发送给webservice的参数ICSClass iCSClass=new ICSClass();Method method=new Method();method.setName("AddBlackNum");iCSClass.setMethod(method);iCSClass.setName("ICSService");//用ICS的方法发送参数,就能得到响应对象了service.ics(iCSClass);public static void main(String[] args) {ICSServiceClient client = new ICSServiceClient();//create a default service endpointICS service = client.getIcsSend();//TODO: Add custom client code here////service.yourServiceOperationHere();System.out.println("test client completed");System.exit(0);}。
Eclipse下使用Xfire创建WebService入门示例(上)关键字: Eclipse Xfire Java WebServiceWeb Service概述什么是Web ServiceWeb Service是能够基于网络,尤其是基于万维网(World Wide Web)直接调用的能够处理离散任务或连续任务的软件模型。
目前较为流行的应用是,由一家公司对其专有数据进行封装,提供Web Service,然后其它公司就可以通过Internet来动态使用这些在线服务。
这为未来全球的电子商务发展提供了新的标准和架构。
Web Service架构Web Service是独立的、模块化的应用,能够通过因特网来描述、发布、定位以及调用。
在Web Service的体系架构中包括三个角色:服务提供者(Service Provider)、服务请求者(Service Requestor)、服务注册器(Service Registry)。
角色间主要有三个操作:发布(Publish)、查找(Find)、绑定(Bind)。
下图清楚的描述了三种角色,以及角色之间的作用关系。
图示一:图示二:这个流程图显示了Web Services中的核心技术是如何工作的。
这里,Provider是提供服务的应用程序组件,Requester是使用服务的客户端程序。
很多其他技术也会参与到交互中,但是这个图只显示了在Web Services环境中必需的核心技术组件。
Web Service协议标准简单对象访问协议(SOAP)SOAP是Simple Object Access Protocol的缩写,是一种基于XML的不依赖传输协议的表示层协议,用来在分散或分布式的应用程序之间方便地以对象的形式交换数据。
在SOAP的下层,可以是HTTP/HTTP,也可以是SMTP/POP3,还可以是为一些应用而专门设计的特殊的通信协议。
SOAP包括三个主要部分:² SOAP封装结构:定义了一个整体框架,以表示消息中包含什么内容,谁来处理这些内容以及这些内容是可选的或是必需的。
² SOAP编码规则:定义了用以交换应用程序定义的数据类型的实例的一系列机制。
² SOAP RPC表示:定义了一个用来表示远程过程调用和应答的协定。
Web Service描述语言(WSDL)WSDL是Web Service Des cription Language的缩写,该语言将网络服务定义成一个能交换消息的通信端点集,为分布式系统提供了帮助文档,同时也可作为自动实现应用间通信的解决方案。
统一描述、发现和集成协议(UDDI)UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。
以上概念转自/Article/203/207/2005/2005082532541.htmlXFireXFire是一个免费的开源SOAP框架,它不仅可以极大方便地实现这样一个环境,并且可以提供许多Web Services规范中高级特征,这些特征在多数的商业或者开源工具都没有提供。
/Download是它的官方网站下载区,同时你也可以了解关于它的更多内容。
创建过程示例下面我们就来使用Java构建一个WebService并且构建一个客户端来测试访问它。
首先请确保你的JDK和Tomcat在Eclipse环境中是可用的,配置方法不做赘述。
并且你了解一些java编程技术和tomcat的发布常识。
版本信息:MyEclipse6.0.0M1;Tomcat6.0;JDK1.5;Xfire1.21、打开MyEclipse新建一个WebService Project,为你的项目命名,我选择了Java EE5.0,项目在你的WorkSpace 目录下。
下一步:看到了这个界面在这里Eclipse为你创建了webService的配置文件services.xml(主意文件名是有“s”的),并进行了Xfire的Servlet基本配置告诉项目你使用了Xfire改信息将体现在项目的web.xml文件中。
继续下一步,加载Xfire相关的jar包,你看到了在这个项目里我勾选了Xfire1.2 Core Libraries;HTTP Client Libraries;XML Beans Libraries。
主要是确保引入了这些包包:∙• activation-1.0.2.jar∙• commons-codec-1.3.jar∙• commons-httpclient-3.0.jar∙• commons-logging-1.0.4.jar∙• jaxen-1.1-beta-8.jar∙• jdom-1.0.jar∙• log4j-1.2.x.jar∙• mail-1.3.3_01.jar∙• spring-1.2.x.jar∙• stax-api-1.0.jar∙• wsdl4j-1.5.2.jar∙• wstx-asl-2.9.jar∙• xbean-2.1.0.jar∙• xbean-spring-2.2.jar∙• xfire-all-1.0.jar∙• XmlSchema-1.0.jar如果你好奇其他的包包是做什么用的就有待于我们在今后的学习中继续探究了~点击“Finish”完成了项目创建。
目录结构如下图所示:打开web.xml我们可以看到如下片断:xml 代码1.<servlet>2. <servlet-name>XFireServlet</servlet-name>3. <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>4. <load-on-startup>0</load-on-startup>5. </servlet>6. <servlet-mapping>7. <servlet-name>XFireServlet</servlet-name>8. <url-pattern>/services/*</url-pattern>9. </servlet-mapping>10. <welcome-file-list>11. <welcome-file>index.jsp</welcome-file>12. </welcome-file-list>13.接下来我们要写一个服务端java类。
模拟应用是一个银行转账应用,从账户A转账到账户B并需要给出金额和货币种类。
我们先来实现一个接口IBankingService.java代码全文如下:java 代码1.package com.mybank.xfire.example;2.3.public interface IBankingService {4.5. public String transferFunds(6. String fromAccount, String toAccount, double amount, String currency);7.8.}9.然后编写一个普通的Java类BankingService包含了一个叫做transferFunds()的方法来为我们完成这项工作。
它需要四个输入参数:∙1、 String fromAccount∙2、 String toAccount∙3、 double amount∙4、 String currency代码如下:java 代码1.package com.mybank.xfire.example;2.3.import java.text.NumberFormat;4.import java.text.DecimalFormat;5.6.public class BankingService implements IBankingService {7.8. //Default constructor.9. public BankingService(){10. }11.12. /** Transfers fund from one account to another.13. */14. public String transferFunds(15. String fromAccount, String toAccount, double amount, String currency){16.17. String statusMessage = "";18.19. //调用业务逻辑执行操作.20. //建立并返回状态信息.21. try {22. NumberFormat formatter = new DecimalFormat("###,###,###,###.00");23. statusMessage = "COMPLETED: " + currency + " " + formatter.format(amount)+24. " was successfully transferred from A/C# " + fromAccount + " to A/C# " + toAccount;25. } catch (Exception e){26. statusMessage = "BankingService.transferFunds(): EXCEPTION: " + e.toString();27. }28. return statusMessage;29. }30.31.}32.你可以看到BankingService是一个普通的Java类,没有任何代码告诉我们它将会在Web Services中使用。
只是要有默认的构造函数,类型是public。
这是必须的。
否则,XFire不能够初始化这个类。
好的,这里我们不需要增加任何东西。
我们所有的工作都在部署描述符里完成。
Web应用的部署描述符在Java中,Web应用程序通常需要至少一个部署描述符(叫做web.xml)对其进行配置。
XFire本身是一个基于servlet的应用程序。
因此,我们需要增加必要的引用到描述符文件中。